TVirtualStringTree - 可变行高度优化

时间:2015-05-13 13:42:49

标签: delphi optimization virtualtreeview tvirtualstringtree

在我们的应用程序中,我将从TStringGrid移动到TVirtualStringTree组件。显示了大量数据(最多50000行和5列)。一列包含一行或多行文本。我设法使用' DrawCell'来实现多线功能。在具有最佳性能的stringgrid中:所有行的即时重绘(在调整大小时)和滚动没有故障(我在内存中有行高度列表,在需要重绘时会更新)。

将此多行功能传输到VirtualStringTree的效果不如stringgrid替代方案。我尝试了很多实现,但还没有成功。这在VirtualStringTree安装包的Demo应用程序中很容易重现:

  1. 在' MultilineDemo'表单,设置' rootNodeCount' VirtualStringTree为10.000。
  2. 运行演示时,选择“自动将节点高度调整为节点文本”。'
  3. 使用大量CPU进行初始重绘/重绘需要一段时间。 Ater每次调整大小,跳到顶部/底部都会导致相同的现象,甚至导致堆栈溢出'例外(但这是另一个问题......)。 ' OnMeasureItem'方法被称为方式太多,我看到的方式(甚至在鼠标移动事件中)。

    是否有人遇到此问题并设法找到解决方案?

1 个答案:

答案 0 :(得分:2)

  

这在演示应用程序中很容易重现   VirtualStringTree安装包

至少可以通过将ReinitNode()BeginUpdate() EndUpdate()中的 MLTree.BeginUpdate(); try MLTree.ReinitNode(nil, True); finally MLTree.EndUpdate(); end; 的来电包裹起来轻松解决此问题:

1
2
0
2
1
2
3
2
...

我今天稍微改进了示例项目和Virtual Treeview,示例项目现在工作得更顺畅了。试试latest source code from GitHub