Board logo

Subject: cnvcl hexedit的bug? [Print This Page]

Author: veket    Time: 2012-9-14 20:12     Subject: cnvcl hexedit的bug?

程序运行过程中,动态更新hexedit的内容,如果原来的hexedit内容只有一行,但是更新的内容超过两行,那么第二行不会自动显示出来。是我用的不对么?还是hexedit的bug?
void TForm1::UpdateHexedtContent(void)
{
        UINT8        ucSndDat[1024];

        UINT32        udwFrmLen = 0,udwIndex;
//Frm TAG
        ucSndDat[udwFrmLen++] = 0x12;
       
//FRM Len.Current is fake valie
        ucSndDat[udwFrmLen++] = 0;

//FT + CR + TD
        ucSndDat[udwFrmLen++] = cbbFT->ItemIndex;
        ucSndDat[udwFrmLen++] = cbbCR->ItemIndex;
        ucSndDat[udwFrmLen++] = cbbTD->ItemIndex;

        if(cbbFT->ItemIndex == 3)        //It is ftResp, add ftResp Result field
        {
                ucSndDat[udwFrmLen++] = 0;        //Resp OK
        }
        else if(cbbFT->ItemIndex == 1)        //It is ftLog, add log into the frm buffer
        {
                UINT32 dwTextLen         = edtLog->GetTextLen();
                UINT8 *pucTextBuffer = new UINT8 [dwTextLen + 1];

                edtLog->GetTextBuf(pucTextBuffer,dwTextLen + 1);

                for(udwIndex = 0;udwIndex < dwTextLen;udwIndex++)
                {
                        ucSndDat[udwFrmLen++] = pucTextBuffer[udwIndex];
                }

                delete [] pucTextBuffer;
        ucSndDat[udwFrmLen++] = '\0';
    }


//Update the real FRM-LEN field
        ucSndDat[1] = udwFrmLen;

//Calculate the CRC
        ucSndDat[udwFrmLen++] = CMN_GetCRC(&ucSndDat[1],udwFrmLen - 2);  //When cal CRC, the FT-TAG and CRC should be discard,so CAL-CRC-LEN is frame len - 2

//Set buffer to the HexEdt's TMemoryStream
//**************************
//如果原来的内容是一行,但是此处ucSndDat的长度超过1行,那么第二行的内容不会自动刷出来。
//*****************************
        hxedtDat->MemoryStream->Clear();
        hxedtDat->MemoryStream->WriteBuffer(ucSndDat,udwFrmLen);
        hxedtDat->Repaint();
}
Author: veket    Time: 2012-9-14 22:11     Subject: 发现是显示的bug

进一步实验发现,hexedt的第二行的数字实际上似乎是有的,但是不显示。如果此时focus hexedit,在最末位随便输入一个hex数字,这时前边的数字就全显示出来了。哪位维护cnvcl的高手帮忙看看这个问题吧。
Author: Passion    Time: 2012-9-17 09:39

好的我们查查看。
Author: veket    Time: 2012-9-20 08:20     Subject: 系统环境CB2007 + WinXP

不知道这个问题是否得到确认?
Author: Passion    Time: 2012-9-25 11:16

查了一把,问题初步定位到这儿:

直接操作MemoryStream改变内容后,还需要调用一方法重新更新其Size,从而在Repaint时才能保证长度得到更新。我在新单元里增加了一个DataChange方法,WriteBuffer后调用此方法即可完成界面刷新(此方法包含了invalidate,故不需再repaint了)。

如果行的话,我把新的单元发你验证一下?通过后再提交。
改动后的单元在附件里。

Attachment: CnHexEditor.pas (2012-9-25 11:16, 43.8 K) / Download count 38
http://bbs.cnpack.org/attachment.php?aid=905
Author: veket    Time: 2012-9-26 08:36     Subject: 谢谢,辛苦了


Author: veket    Time: 2012-9-26 08:55     Subject: 嗯,改好了,谢谢。


Author: Passion    Time: 2012-10-15 16:14

好。此改动已提交。




Welcome to CnPack Forum (http://bbs.cnpack.org/) Powered by Discuz! 5.0.0