我知道在VCL控件(例如TListBox)中使用BeginUpdate和EndUpdate可以加快将Items添加到控件的过程,因为它会阻止控件被重绘,直到调用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是否使用BeginUpdate和EndUpdate,在大约相同的速度下都会填充列表。
但是,既然TStringList是在内存中执行而不是可视化操作,那么它们真的需要吗?我应该在TStringList上使用BeginUpdate和EndUpdate吗?这样做是好的实践吗?
我觉得自己很傻,为什么TStringList有BeginUpdate和EndUpdate过程?
我想我可能已经回答了自己的问题,但无论如何,我想听听你的看法。
谢谢 :)