delphi 7中<listview.Clear>和<listview> .items.clear的区别究竟是什么?

Cyp*_*rUS 14 delphi

我想知道为什么有两种不同的清除列表视图的方法.一个是通过电话listview.clear,另一个是listview.items.clear.实际上,这也扩展到许多其他VCL组件.必须使用哪种方法?为什么?

kob*_*bik 21

ListView.Clear只是周围的包装ListView.Items.ClearListItems.BeginUpdate/ ListItems.EndUpdate.看看来源:

procedure TCustomListView.Clear;
begin
  FListItems.BeginUpdate;
  try
    FListItems.Clear;
  finally
    FListItems.EndUpdate;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

来自文档:

BeginUpdate方法暂停屏幕重绘,直到调用EndUpdate方法.使用BeginUpdate加速处理,避免在将项目添加到集合或从集合中删除时闪烁.

更好的做法是使用BeginUpdate/ EndUpdate获得速度并避免闪烁.
但使用的主要原因ListView.Clear是因为使用"高级VCL方法"(由@Arnaud评论)总是一个好主意,并且实现可能会改变(BTW,该方法在D7中引入).


编辑:我已经测试了TListView10K项目(D7/WinXP中):

  • ListView.Items.Clear:~5500毫秒
  • ListView.Clear:~330毫秒

结论:ListView.ClearListView.Items.Clear使用BeginUpdate/ EndUpdate不使用快约16倍!

  • @Smasher由于`clear`释放每个对象,它将通知每个删除到VCL,除非使用`BeginUpdate/EndUpdate`.这是两者之间的区别,为什么`Clear`比`Items.Clear`快得多.除非您确切知道自己在做什么,否则直接调用高级VCL方法总是一个好主意,而不是进入内部管道. (7认同)
  • 实际上,我不认为`beginUpdate` ..`EndUpdate`在`clear`的情况下有任何帮助. (2认同)
  • @ArnaudBouchez,"高级VCL方法"+1.这正是我一直在寻找的表达方式. (2认同)