Я понимаю, что с помощью BeginUpdate и EndUpdate на элементах управления VCL, таких как TListBox, ускоряется процесс заполнения элемента управления элементами, поскольку он предотвращает перерисовку элемента управления до тех пор, пока не будет вызван EndUpdate.
Пример:
procedure TForm1.AddItems;
var
i: Integer;
begin
Screen.Cursor := crHourGlass;
try
for i := 0 to 5000 do
begin
ListBox1.Items.Add('Item' + IntToStr(i));
end;
finally
Screen.Cursor := crDefault;
end;
end;
Вышеупомянутая будет иметь задержку, потому что Listbox разрешено перекрашивать, но задержка может быть закорочена, предотвращая перерисовку следующим образом:
procedure TForm1.AddItems;
var
i: Integer;
begin
Screen.Cursor := crHourGlass;
try
ListBox1.Items.BeginUpdate;
try
for i := 0 to 5000 do
begin
ListBox1.Items.Add('Item' + IntToStr(i));
end;
finally
ListBox1.Items.EndUpdate;
end;
finally
Screen.Cursor := crDefault;
end;
end;
Теперь я тестировал это с помощью TStringList:
procedure TForm1.AddItems;
var
SL: TStringList;
i: Integer;
begin
SL := TStringList.Create;
try
Screen.Cursor := crHourGlass;
try
SL.BeginUpdate;
try
for i := 0 to 5000 do
begin
SL.Add('Item' + IntToStr(i));
end;
finally
SL.EndUpdate;
end;
ListBox1.Items.Assign(SL);
finally
Screen.Cursor := crDefault;
end;
finally
SL.Free;
end;
end;
Кажется, что независимо от того, использует ли TStringList BegindUpdate и EndUpdate, список заполняется примерно с той же скоростью.
Действительно ли они нужны, но поскольку TStringList выполняется в памяти, а не визуально. Должен ли я использовать BeginUpdate и EndUpdate в TStringList в любом случае, хорошо ли это сделать?
Мне неловко спрашивать об этом, но почему у TStringList есть процедуры BeginUpdate и EndUpdate?
Я думаю, что, возможно, я ответил на свой собственный вопрос здесь, в любом случае я хотел бы услышать ваши мнения.
Спасибо:)