Delphi TVirtualStringTree-可变行高优化

Delphi TVirtualStringTree-可变行高优化,delphi,optimization,virtualtreeview,tvirtualstringtree,Delphi,Optimization,Virtualtreeview,Tvirtualstringtree,在我们的应用程序中,我将从TStringGrid迁移到TVirtualStringTree组件。正在显示大量数据(最多50000行和5列)。一列包含一行或多行文本。我成功地在stringgrid中使用“DrawCell”实现了多行功能,并获得了最佳性能:即时重画所有行(调整大小时)和无挂接滚动(我在内存中有一个行高列表,需要重画时将更新该列表) 将此多行功能传输到VirtualStringTree的性能不如stringgrid替代方案。我尝试了许多实现,但尚未成功。这在VirtualString

在我们的应用程序中,我将从TStringGrid迁移到TVirtualStringTree组件。正在显示大量数据(最多50000行和5列)。一列包含一行或多行文本。我成功地在stringgrid中使用“DrawCell”实现了多行功能,并获得了最佳性能:即时重画所有行(调整大小时)和无挂接滚动(我在内存中有一个行高列表,需要重画时将更新该列表)

将此多行功能传输到VirtualStringTree的性能不如stringgrid替代方案。我尝试了许多实现,但尚未成功。这在VirtualStringTree安装包的演示应用程序中很容易复制:

  • 在“Multilinemo”表单中,将VirtualStringTree的“rootNodeCount”设置为10.000
  • 运行演示时,选择“自动将节点高度调整为节点文本”
  • 初始重绘/重绘将花费大量CPU时间。每次调整大小后,跳到顶部/底部会导致相同的现象,甚至会导致“堆栈溢出”异常(但这是另一个问题…)。“OnMeasureItem”方法调用得太多了,这在我看来(即使在“MouseMove”事件中也是如此)

    有人遇到过这个问题并设法找到了解决方案吗

    这在的演示应用程序中很容易复制 VirtualStringTree安装包

    通过将对
    ReinitNode()
    的调用包装在
    BeginUpdate()
    EndUpdate()
    中,至少可以轻松解决此性能问题:


    我今天稍微修改了样例项目和虚拟树视图,样例项目现在工作得更顺利了。试试。

    我还没有检查演示是如何实现的,但是如果它使用测量事件,那么您可以尝试另一种方法。您说过已经准备好了行高度集合,因此在填充树时,可以尝试使用
    NodeHeight
    属性静态设置节点高度。然而,我并不期望有显著的区别(假设他们在演示中没有做任何昂贵的事情)。我已经尝试使用我自己的高度集,但还没有完全成功地制作出一个完整的工作版本。节点的重画计时与stringgrid的有点不同。
     MLTree.BeginUpdate();
      try
        MLTree.ReinitNode(nil, True);
      finally
        MLTree.EndUpdate();
      end;