delphi – 为什么TStringList有BeginUpdate和EndUpdate?
发布时间:2020-12-15 10:08:25 所属栏目:大数据 来源:网络整理
导读:我知道在VCL控件(如TListBox)上使用BeginUpdate和EndUpdate会加快使用Items填充控件的过程,因为它会阻止控件重画,直到调用EndUpdate. 例: procedure TForm1.AddItems;var i: Integer;begin Screen.Cursor := crHourGlass; try for i := 0 to 5000 do begin
|
我知道在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如何使用BegindUpdate和EndUpdate,列表都以相同的速度进行填充. 他们真的需要,因为TStringList是在内存而不是视觉上执行的.我应该在TStringList上使用BeginUpdate和EndUpdate,这样做很好吗? 我觉得愚蠢的问这个问题,为什么TStringList有程序BeginUpdate和EndUpdate? 我想我可能在这里回答了我自己的问题,无论如何,我想听听你的看法. 谢谢 :) 解决方法
BeginUpdate禁止字符串列表的OnChanging和OnChange事件.根据所连接的内容,可以大大加快事情.
在你的例子中,BeginUpdate / EndUpdate没有太多的区别.使用TStringlist实例并将其分配给列表视图是一种非常有效的方法. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
