我正在使用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();
    }
}

关于c++ - 在CodeGear C++ Builder上,有没有比TMemo更快的组件?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7094903/

10-11 22:33