我的表单上有一个ListView:TListview,并且我添加了很多值(大约25k TListViewItem),它工作得非常快,但是当我调用Listview.Clear时,程序冻结了。我用调试器检查了它,它赢了不要走那条路。
我的问题是:我该如何解决我的问题?如果可以在不到一秒的时间内创建这么多项目,为什么删除它们需要永远(我等了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,但我错了。
我赞成你所有的答案,请原谅我的无知 - 我是新人。