我知道在 TListBox 等 VCL 控件上使用 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 是否使用 BegindUpdate 和 EndUpdate,列表的填充速度大致相同。
尽管 TStringList 是在内存中执行而不是在视觉上执行,但它们是否真的需要。无论如何,我是否应该在 TStringList 上使用 BeginUpdate 和 EndUpdate,这样做是一种好习惯吗?
问这个我觉得很傻,但为什么 TStringList 有 BeginUpdate 和 EndUpdate 程序?
我想我可能已经在这里回答了我自己的问题,无论哪种方式,我都想听听您的意见。
谢谢 :)