2

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

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

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

初始重绘/重绘会占用大量 CPU 时间。每次调整大小时,跳到顶部/底部会导致相同的现象,甚至导致“堆栈溢出”异常(但这是另一个问题......)。'OnMeasureItem' 方法被称为太多,我看到它的方式(即使在'MouseMove' 事件上)。

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

4

1 回答 1

2

这在VirtualStringTree安装包的Demo应用中很容易复现

至少这个性能问题可以通过将调用包装ReinitNode()在 a BeginUpdate()and中轻松解决EndUpdate()

 MLTree.BeginUpdate();
  try
    MLTree.ReinitNode(nil, True);
  finally
    MLTree.EndUpdate();
  end;

我今天稍微修改了示例项目和虚拟树视图,示例项目现在工作得更加顺畅。只需尝试来自 GitHub 的最新源代码

于 2015-07-14T20:26:13.043 回答