微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

delphi – 为什么TStringList有BeginUpdate和EndUpdate?

我知道在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实例并将其分配给列表视图是一种非常有效的方法.

原文地址:https://www.jb51.cc/delphi/102788.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐