delphi – 为什么TStringList有BeginUpdate和EndUpdate?

前端之家收集整理的这篇文章主要介绍了delphi – 为什么TStringList有BeginUpdate和EndUpdate?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我知道在VCL控件(如TListBox)上使用BeginUpdate和EndUpdate会加快使用Items填充控件的过程,因为它会阻止控件重画,直到调用EndUpdate.

例:

  1. procedure TForm1.AddItems;
  2. var
  3. i: Integer;
  4. begin
  5. Screen.Cursor := crHourGlass;
  6. try
  7. for i := 0 to 5000 do
  8. begin
  9. ListBox1.Items.Add('Item' + IntToStr(i));
  10. end;
  11. finally
  12. Screen.Cursor := crDefault;
  13. end;
  14. end;

上述将会延迟,因为ListBox被允许重绘,但延迟可以通过防止重画如此缩短:

  1. procedure TForm1.AddItems;
  2. var
  3. i: Integer;
  4. begin
  5. Screen.Cursor := crHourGlass;
  6. try
  7. ListBox1.Items.BeginUpdate;
  8. try
  9. for i := 0 to 5000 do
  10. begin
  11. ListBox1.Items.Add('Item' + IntToStr(i));
  12. end;
  13. finally
  14. ListBox1.Items.EndUpdate;
  15. end;
  16. finally
  17. Screen.Cursor := crDefault;
  18. end;
  19. end;

现在我用TStringList测试了这个:

  1. procedure TForm1.AddItems;
  2. var
  3. SL: TStringList;
  4. i: Integer;
  5. begin
  6. SL := TStringList.Create;
  7. try
  8. Screen.Cursor := crHourGlass;
  9. try
  10. SL.BeginUpdate;
  11. try
  12. for i := 0 to 5000 do
  13. begin
  14. SL.Add('Item' + IntToStr(i));
  15. end;
  16. finally
  17. SL.EndUpdate;
  18. end;
  19.  
  20. ListBox1.Items.Assign(SL);
  21. finally
  22. Screen.Cursor := crDefault;
  23. end;
  24. finally
  25. SL.Free;
  26. end;
  27. end;

看来,无论TStringList如何使用BegindUpdate和EndUpdate,列表都以相同的速度进行填充.

他们真的需要,因为TStringList是在内存而不是视觉上执行的.我应该在TStringList上使用BeginUpdate和EndUpdate,这样做很好吗?

我觉得愚蠢的问这个问题,为什么TStringList有程序BeginUpdate和EndUpdate?

我想我可能在这里回答了我自己的问题,无论如何,我想听听你的看法.

谢谢 :)

解决方法

BeginUpdate禁止字符串列表的OnChanging和OnChange事件.根据所连接的内容,可以大大加快事情.

在你的例子中,BeginUpdate / EndUpdate没有太多的区别.使用TStringlist实例并将其分配给列表视图是一种非常有效的方法.

猜你在找的Delphi相关文章