【发布时间】:2015-05-13 13:42:49
【问题描述】:
在我们的应用程序中,我正在从 TStringGrid 移动到 TVirtualStringTree 组件。正在显示大量数据(最多 50000 行和 5 列)。一列包含一行或多行文本。我设法在 stringgrid 中使用'DrawCell'以最佳性能实现多行功能:即时重绘所有行(调整大小时)和无阻碍地滚动(我在内存中有一个行高列表,将在需要重绘时更新) .
将此多行功能转移到 VirtualStringTree 的性能不如 stringgrid 替代方案。我尝试了许多实现,但还没有成功。这在VirtualStringTree安装包的Demo应用中很容易复现:
- 在“MultilineDemo”表单中,将 VirtualStringTree 的“rootNodeCount”设置为 10.000。
- 运行演示时,选择“根据节点文本自动调整节点高度”。
初始重绘/重绘会占用大量 CPU 时间。每次调整大小时,跳到顶部/底部会导致相同的现象,甚至导致“堆栈溢出”异常(但这是另一个问题......)。 'OnMeasureItem' 方法被调用的太多了,就像我看到的那样(即使是在 'MouseMove' 事件中)。
有没有人遇到过这个问题并设法找到解决方案?
【问题讨论】:
-
我还没有检查过该演示是如何实现的(还),但如果它使用测量事件,那么您可以尝试不同的方式。您说您准备了一组行高,因此您可以尝试在填充树时使用
NodeHeight属性静态设置节点高度。但是,我预计不会有显着差异(假设他们在该演示中没有做任何昂贵的事情)。 -
感谢您的建议@TLama。我已经尝试过使用我自己的高度集合,但还没有完全成功地制作出一个完整的工作版本。节点的重绘时间与 stringgrid 有点不同。
标签: delphi optimization virtualtreeview tvirtualstringtree