Delphi TVirtualStringTree-可变行高优化
在我们的应用程序中,我将从TStringGrid迁移到TVirtualStringTree组件。正在显示大量数据(最多50000行和5列)。一列包含一行或多行文本。我成功地在stringgrid中使用“DrawCell”实现了多行功能,并获得了最佳性能:即时重画所有行(调整大小时)和无挂接滚动(我在内存中有一个行高列表,需要重画时将更新该列表) 将此多行功能传输到VirtualStringTree的性能不如stringgrid替代方案。我尝试了许多实现,但尚未成功。这在VirtualStringTree安装包的演示应用程序中很容易复制:Delphi TVirtualStringTree-可变行高优化,delphi,optimization,virtualtreeview,tvirtualstringtree,Delphi,Optimization,Virtualtreeview,Tvirtualstringtree,在我们的应用程序中,我将从TStringGrid迁移到TVirtualStringTree组件。正在显示大量数据(最多50000行和5列)。一列包含一行或多行文本。我成功地在stringgrid中使用“DrawCell”实现了多行功能,并获得了最佳性能:即时重画所有行(调整大小时)和无挂接滚动(我在内存中有一个行高列表,需要重画时将更新该列表) 将此多行功能传输到VirtualStringTree的性能不如stringgrid替代方案。我尝试了许多实现,但尚未成功。这在VirtualString
ReinitNode()
的调用包装在BeginUpdate()
和EndUpdate()
中,至少可以轻松解决此性能问题:
我今天稍微修改了样例项目和虚拟树视图,样例项目现在工作得更顺利了。试试。我还没有检查演示是如何实现的,但是如果它使用测量事件,那么您可以尝试另一种方法。您说过已经准备好了行高度集合,因此在填充树时,可以尝试使用
NodeHeight
属性静态设置节点高度。然而,我并不期望有显著的区别(假设他们在演示中没有做任何昂贵的事情)。我已经尝试使用我自己的高度集,但还没有完全成功地制作出一个完整的工作版本。节点的重画计时与stringgrid的有点不同。
MLTree.BeginUpdate();
try
MLTree.ReinitNode(nil, True);
finally
MLTree.EndUpdate();
end;