gpt4 book ai didi

delphi - 为什么TStringList有BeginUpdate和EndUpdate?

转载 作者:行者123 更新时间:2023-12-03 14:36:47 24 4
gpt4 key购买 nike

据我了解,在 TListBox 等 VCL 控件上使用 BeginUpdate 和 EndUpdate 可以加快用项目填充控件的过程,因为它可以防止在调用 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 抑制字符串列表的 OnChangingOnChange 事件。根据连接的内容,它可以显着加快速度。

在您的示例中,BeginUpdate/EndUpdate 没有太大区别。使用 TStringlist 实例并将其分配给 ListView 是一种非常有效的方法。

关于delphi - 为什么TStringList有BeginUpdate和EndUpdate?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9150817/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com