TListView.Clear冻结我的应用程序,我该如何解决?

时间:2009-08-17 20:11:10

标签: delphi freeze delphi-2009

我的表单上有一个ListView:TListview,并且我添加了很多值(大约25k TListViewItem),它工作得非常快,但是当我调用Listview.Clear时,程序冻结了。我用调试器检查了它,它赢了不要走那条路。

我的问题是:我该如何解决我的问题?如果可以在不到一秒的时间内创建这么多项目,为什么删除它们需要永远(我等了5分钟以上)?

5 个答案:

答案 0 :(得分:14)

您是否尝试在BeginUpdate / EndUpdate块中封闭对清除的调用:

  listview.Items.BeginUpdate;
  try
    listview.Items.Clear;
  finally
    listview.Items.EndUpdate;
  end;

添加/删除列表视图中的项目(或各种其他控件,例如列表框)会触发对添加/删除的每个项目的控件的GUI更新。特别是对于列表视图,这可能非常昂贵,对于25,000个项目来说,开销很大。

不可否认,5分钟确实听起来过分,但这将是我尝试的第一件事。

答案 1 :(得分:5)

我要尝试的第一件事就是用BeginUpdate / EndUpdate将你的呼叫包裹起来。

  ListView1.Items.BeginUpdate;
  ListView1.Clear;
  ListView1.Items.EndUpdate;

您是否有任何附加到ListView的事件,并且在清除列表时它们是否会被触发?

答案 2 :(得分:2)

正如其他人注意到一个BeginUpdate .... EndUpdate将大大提高性能,但我真的建议你移动你的代码使用VirtualTreeView。这是一个hybrit树/ ListView,它将在不到一秒的时间内增加1m节点(实际上这取决于处理器,但你明白了。)

一开始学习起来有点困难,但是一旦你习惯了它,你就会发现它“很容易”。我个人每当我在ListView或TreeView中需要很多行时,我都会看到VirtualTreeView。哦,忘了提到它,它是免费的。试试:http://soft-gems.net/

答案 3 :(得分:2)

约翰,清除它不应该比添加25k物品更长 我想知道你是否在它不可见时加载它(自动禁用更新),但是当每个项目删除触发更新时可以看到它时清除它。

答案 4 :(得分:0)

我不知道是否应该删除这个问题,我相信它不会对任何人有任何用处,但我更愿意保留它一段时间,至少对你来说,谁回答。

问题是我使用了从TListView继承的组件,我认为这不会是一个问题所以我决定说TListView,但我错了。

我赞成你所有的答案,请原谅我的无知 - 我是新人。