我了解在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禁止字符串列表的OnChangingOnChange事件。根据所连接的内容,它可以显着加快处理速度。

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

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

10-11 12:08