Ładuję 2000 nazwisk do FMX TlistBox i zajmuje dużo zbyt długich (jak 35 sekund lub więcej).

Oto kod testowy:

procedure TDocWindow.DEBUGAddLotsOfStringsToList;
var
  theTimeAtStart: Integer;
  J: Integer;

begin
  ListBox1.Clear;

  theTimeAtStart := TThread.GetTickCount;

  for J := 1 to 2200 do
    begin
      ListBox1.Items.Add(j.toString);
    end;

  ShowMessage('There were ' + J.ToString + ' strings added to the list in ' + (TThread.GetTickCount - theTimeAtStart).ToString + ' milliseconds.');
end;

Czy jest coś o Tlistbox, który czyni go zbyt wolnym przez kilka tysięcy ciągów?

2
Mike at Bookup 24 lipiec 2020, 03:48

1 odpowiedź

Najlepsza odpowiedź

Korzystanie BeginUpdate i EndUpdate zmniejszył czas wykonawczy w moim systemie od 25 sekund do około 125 ms.

procedure TForm1.Button1Click(Sender: TObject);
var
  theTimeAtStart: Integer;
  J: Integer;
begin
  theTimeAtStart := TThread.GetTickCount;

  ListBox1.Items.BeginUpdate;

  try
    ListBox1.Clear;

    for J := 1 to 2200 do
    begin
      ListBox1.Items.Add(j.ToString());
    end;
  finally
    ListBox1.Items.EndUpdate;
  end;
  ShowMessage('There were ' + J.ToString + ' strings added to the list in ' + (TThread.GetTickCount - theTimeAtStart).ToString + ' milliseconds.');
end;
4
Ken White 24 lipiec 2020, 16:23