我了解在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;
上面会有一个延迟,因为允许重新填充列表框,但是可以通过防止重新绘制来缩短延迟,如下所示:
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过程?
我想我想在这里回答我自己的问题,无论哪种方式,我都想听听您的意见。
谢谢 :)
最佳答案
BeginUpdate
禁止字符串列表的OnChanging
和OnChange
事件。根据所连接的内容,它可以显着加快处理速度。
在您的示例中,BeginUpdate / EndUpdate没有太大的区别。使用TStringlist实例并将其分配给listview是非常有效的方法。
关于delphi - 为什么TStringList具有BeginUpdate和EndUpdate?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9150817/