在我们的应用程序中,我正在从 TStringGrid 组件迁移到 TVirtualStringTree 组件。正在显示大量数据(最多 50000 行和 5 列)。一列包含一行或多行文本。我设法在字符串网格中使用“DrawCell”实现多行功能,并具有最佳性能:即时重绘所有行(调整大小时)并顺利滚动(我在内存中有一个行高列表,需要重绘时将更新) .
将此多行功能转移到 VirtualStringTree 的性能不如 stringgrid 替代方案。我尝试了很多实现但尚未成功。这可以在 VirtualStringTree 安装包的演示应用程序中轻松重现:
- 在“MultilineDemo”表单中,将 VirtualStringTree 的“rootNodeCount”设置为 10.000。
- 运行演示时,选择“根据节点文本自动调整节点高度”。
初始重绘/重绘将需要一段时间,使用大量 CPU。每次调整大小后,跳转到顶部/底部都会导致相同的现象,甚至导致“堆栈溢出”异常(但这是另一个问题......)。在我看来,“OnMeasureItem”方法被调用得太多了(即使是在“MouseMove”事件上)。
有人遇到过这个问题并设法找到解决方案吗?
最佳答案
This is easily reproducable in the Demo application of the VirtualStringTree installation package
至少通过将对 ReinitNode()
的调用包装在 BeginUpdate()
和 EndUpdate()
中,可以轻松解决此性能问题:
MLTree.BeginUpdate();
try
MLTree.ReinitNode(nil, True);
finally
MLTree.EndUpdate();
end;
今天我稍微修改了示例项目和虚拟 TreeView ,示例项目现在工作得更流畅了。试试 latest source code from GitHub .
关于delphi - TVirtualStringTree - 可变行高优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30216707/