到着した文字を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();
}
}