<div dir="ltr"><br><br>Em sex., 11 de nov. de 2022 às 12:29, Bo Berglund via lazarus <<a href="mailto:lazarus@lists.lazarus-ide.org">lazarus@lists.lazarus-ide.org</a>> escreveu:<br>><br>> I am using a TListbox component on a form for displaying debug data arriving<br>> over a serial line at 115200 baud.<br>> The data are a set of MQTT telegram texts which arrive in packets of about 40<br>> lines each time (once per 10 seconds).<br>> I add them to the listbox as follows:<br>><br>> procedure THanSimulatorMain.OnRxData(Sender: TObject; const Data: TBytes);<br>> var<br>>   len, oldlen: integer;<br>>   DataTxt: AnsiString;<br>> begin<br>>   len := Length(Data); //Incoming packet<br>>   oldlen := Length(DataBuffer);<br>>   SetLength(DataBuffer, oldlen + len);<br>>   Move(Data[0], DataBuffer[oldlen], len);<br>>   SetLength(DataTxt, Length(DataBuffer));<br>>   Move(DataBuffer[0], DataTxt[1], Length(DataBuffer));<br>>   lbxRxData.Items.Text := DataTxt;  //Add the text to the list<br>>   lbxRxData.ItemIndex := lbxRxData.Items.Count -1; //To make it visible<br>> end;<br>><br>> DataBuffer is a global TBytes container where the incoming data are stuffed as<br>> they arrive (it grows during the session).<br>> You see that the buffer contains the complete log history from the start...<br>><br>> I have noticed that after a while the display becomes very sluggish when data<br>> arrives and I think that is due to the way the component operates.<br>><br>> Now I wonder if there is some way to do as I did when I worked in Delphi with<br>> TListView objects, where I could use the BeginUpdate and EndUpdate calls to make<br>> all screen updates wait until it was all put in place.<br>> This was MUCH faster!<br>><br>> But I can not find a BeginUpdate on the TListBox object, only BeginUpdateBounds,<br>> which does not tell me much....<br>><br>> Any suggestions?<br>><br>><br>> --<br>> Bo Berglund<br>> Developer in Sweden<br><br>Hi,<br><br>What size is your data? The biggest problem regarding Windows' TListBox (and TMemo and others) was it used a contiguous buffer for its whole text and increased capacity by doubling the buffer or something, thus it got ugly easily; the parsing did seem to have some problems too. Microsoft alleviated this problem for TMemo at least at some point but I don`t know about TListBox.<br>When you set/replace the whole text for a control (ex. using ListBox1.Items.Text) there`s (usually) no need to use Begin/EndUpdate; if you're appending a bunch of lines, though, you should use ListBox1.Items.BeginUpdate.<br>Do you really need to keep 'DataBuffer' around for other reasons? Otherwise you could just:<br><br><div style="margin-left:40px">procedure TForm1.OnRxData(Sender: TObject; const Data: TBytes);<br>var<br>  buf: TStringList;<br>  DataTxt: ansistring;<br>begin<br>  SetLength(DataTxt, Length(Data));<br>  Move(Data[0], DataTxt[1], Length(Data));<br><br>  buf := TStringList.Create;<br>  buf.Text := DataTxt;<br>  SynEdit1.Lines.AddStrings(buf);<br>  buf.Free;<br>  SynEdit1.CaretY := SynEdit1.Lines.Count;<br>end;</div><div style="margin-left:40px"><br></div><div>Too bad TStrings don`t have a method to add text parsing the linebreaks... IMHO even a PChar overload with offsets would be deserved.</div><div><br></div><div>Best regards,</div><div>Flávio<br></div></div>