delphi - TVirtualStringTree - 可变行高优化

标签 delphi optimization virtualtreeview tvirtualstringtree

在我们的应用程序中,我正在从 TStringGrid 组件迁移到 TVirtualStringTree 组件。正在显示大量数据(最多 50000 行和 5 列)。一列包含一行或多行文本。我设法在字符串网格中使用“DrawCell”实现多行功能,并具有最佳性能:即时重绘所有行(调整大小时)并顺利滚动(我在内存中有一个行高列表,需要重绘时将更新) .

将此多行功能转移到 VirtualStringTree 的性能不如 stringgrid 替代方案。我尝试了很多实现但尚未成功。这可以在 VirtualStringTree 安装包的演示应用程序中轻松重现:

  1. 在“MultilineDemo”表单中,将 VirtualStringTree 的“rootNodeCount”设置为 10.000。
  2. 运行演示时,选择“根据节点文本自动调整节点高度”。

初始重绘/重绘将需要一段时间,使用大量 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/

相关文章:

delphi - 是否可以使用 VirtualStringTree 作为主细节 GridView ?

delphi - 如何追踪访问冲突 "at address 00000000"

java - Android MediaRecorder JNI(Delphi)的问题

delphi - TVirtualDrawTree - 如何将节点放置在一行中?

delphi - 在虚拟 TreeView (TVirtualStringTree) 中制作主从 View ,其中每个项目组都有一个标题栏

c++ - 是否允许编译器在重载解析期间选择 const ref 而不是 ref?

Delphi7 TMS TDBAdvGrid 单击列标题时对数据进行排序

delphi - 不兼容的类型 - TArray<System.Byte> 和 Byte

python - 无需 for 循环即可对数组元素进行运算

javascript - 当您不知道属性是什么时,有没有一种方法可以在 javascript 中干净地使用隐藏类?