我的表单上有一个 ListView:TListview,并且我添加了许多值(大约 25k TListViewItem),它工作得非常快,但是当我调用 Listview.Clear 时,程序冻结了。我用调试器检查它,它不会步进那条线。
我的问题是:我该如何解决我的问题?如果可以在一秒钟内创建这么多项目,为什么要永远删除它们(我等了超过 5 分钟)?
我的表单上有一个 ListView:TListview,并且我添加了许多值(大约 25k TListViewItem),它工作得非常快,但是当我调用 Listview.Clear 时,程序冻结了。我用调试器检查它,它不会步进那条线。
我的问题是:我该如何解决我的问题?如果可以在一秒钟内创建这么多项目,为什么要永远删除它们(我等了超过 5 分钟)?
您是否尝试过在 BeginUpdate/EndUpdate 块中包含对Clear的调用:
listview.Items.BeginUpdate;
try
listview.Items.Clear;
finally
listview.Items.EndUpdate;
end;
在列表视图(或各种其他控件,例如列表框)中添加/删除项目会为添加/删除的每个项目触发控件的 GUI 更新。特别是对于列表视图,这可能非常昂贵,并且对于 25,000 个项目,开销将是巨大的。
诚然,5 分钟听起来确实有些过分,但这是我要尝试的第一件事。
我要尝试的第一件事是使用 BeginUpdate/EndUpdate 将您对 Clear 的调用包装起来。
ListView1.Items.BeginUpdate;
ListView1.Clear;
ListView1.Items.EndUpdate;
您是否有任何事件附加到 ListView,并且它们是否在列表被清除时触发?
正如其他人指出的那样,BeginUpdate .... EndUpdate 将大大提高性能,但是我真的建议您将代码移动到使用 VirtualTreeView。这是一个混合树/ListView,它将在不到一秒的时间内添加多达 1m 个节点(实际上这取决于处理器,但你明白了)。
刚开始学习有点困难,但是一旦你习惯了它,你会发现它“容易”使用。每当我需要 ListView 或 TreeView 中的许多行时,我个人只看 VirtualTreeView。哦,忘了说最重要的是,它是免费的。尝试从:http ://soft-gems.net/
约翰,清除的时间不应超过添加 25k 项。
我想知道您是否在它不可见时加载它(自动禁用更新),但在每个项目删除触发更新的地方可见时清除它。
我不知道我是否应该删除这个问题,我相信它对其他人没有任何用处,但我更愿意至少为你保留一段时间,谁回答了。
问题是我使用了一个从 TListView 继承的组件,我认为这不会有问题,所以我决定说 TListView,但我错了。
我赞成你所有的答案,请原谅我的无知 - 我是新人。