Я понимаю, что использование 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;
Выше будет задержка, потому что список можно перекрасить, но задержка может быть закорочена путем предотвращения перерисовки следующим образом:
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?
IЯ думаю, что я мог ответить на свой вопрос здесь, так или иначе, я хотел бы услышать ваши взгляды.
Спасибо:)