14

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

4

2 回答 2

22

ListView.Clear只是/ListView.Items.Clear的包装。看源码:ListItems.BeginUpdateListItems.EndUpdate

procedure TCustomListView.Clear;
begin
  FListItems.BeginUpdate;
  try
    FListItems.Clear;
  finally
    FListItems.EndUpdate;
  end;
end;

从文档:

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

更好的做法是使用BeginUpdate/EndUpdate来提高速度并避免闪烁。
但使用的主要原因ListView.Clear是因为使用“高级 VCL 方法”(正如 @Arnaud 评论的那样)总是一个好主意,并且实现可能会改变(顺便说一句,该方法是在 D7 中引入的)。


编辑:我已经测试了TListView10k(D7/WinXP):

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

结论:ListView.Clear比不使用/ListView.Items.Clear时快大约 16 倍!BeginUpdateEndUpdate

于 2012-04-16T07:17:43.250 回答
1

ListView.Clear是一种在内部调用的便捷方法ListView.Items.Clear。无论您调用两者中的哪一个,都没有语义差异。

我更喜欢第一个,因为它更短,而且它没有显示我目前不感兴趣的内部表示。

于 2012-04-16T07:13:42.573 回答