CodeGear c++ Builder上有比TMemo更快的组件吗?

Is there a faster component than TMemo on CodeGear C++ Builder?

本文关键字:组件 TMemo Builder c++ CodeGear      更新时间:2023-10-16

我正在使用CodeGear c++ Builder 2009,并且在TMemo组件上有问题。它太慢了。我用它来显示来自COM串行端口的ASCII文本。我需要显示每一个符号,当它来自COM串口。问题是,如果有很多来自COM串行端口的文本,TMemo上的旧文本开始闪烁,并且组件上的文本越多,情况就越糟。当TMemo包含1000行文本时,刷新延迟是巨大的!

我设置了doubleBuffered属性为true,但这并没有帮助。他们如何在SecureCRT等应用程序中使刷新时间最小化?新的文字添加平滑,没有闪烁。哪个成分会产生这样的结果?

而不是在TMemo中实时显示字符,当它们到达时,尝试先将它们保存到内存缓冲区中,然后定期将缓冲区复制到TMemory中,并在添加新文本时使用Lines->BeginUpdate()Lines->EndUpdate()方法。此外,1000行很多,您可能不得不开始删除旧行,因为稍后会添加新行。我通常将TMemo控件一次限制在几百行。

更新:尝试这样做:

TMemoryStream *Buffer;
// serial port callback
void BytesReceived(void *Data, int Length)
{
    Buffer->Position = Buffer->Size;
    Buffer->WriteBuffer(Data, Length);
}
__fastcall TForm1::TForm1(TComponent *Owner)
    : TForm(Owner)
{
    Buffer = new TMemoryStream;
}
__fastcall TForm1::~TForm1()
{
    delete Buffer;
}
void __fastcall TForm1::TimerElapsed(TObject *Sender)
{
    if (Buffer->Size > 0)
    {
        Memo1->Lines->BeginUpdate();
        Memo1->SelStart = Memo1->GetTextLen();
        Memo1->SelLength = 0;
        Memo1->SelText = AnsiString((char*)Buffer->Memory, Buffer->Size);
        Memo1->SelStart = Memo1->GetTextLen();
        Memo1->Perform(EM_SCROLLCARET, 0, 0);
        Memo1->Lines->EndUpdate();
        Buffer->Clear();
    }
}

对于窗口设备,…最好的方法是使用线程事件而不是定时器事件。在thread->execute()中放置串行等待事件,(这是一个do while循环,…)

serial wait事件将不做任何事情,直到收到某事,…很快它接收到一个*buffer,检查缓冲区/字符串的长度,. .

然后将memo作为

memo->text=buffer;
or 
memo->lines-add(buffer);