4

我在谷歌上搜索并找到了很多建议,但这一切似乎都是几年前的事情,而且没有任何帮助。

我有一个包含 8 列的字符串网格,一旦我得到超过几百行,就需要 2 秒以上的时间来填充(我使用 GetTickCount 进行了比较)。

我试过了StringGrid.Perform(WM_SETREDRAW, 0, 0)0, 1最后)。 Visible := False我在更新时尝试设置。两个都没用。

没有BeginUpdate()方法。

有什么建议吗?德尔福 XE2 启动器。如果经过试用和测试,我愿意使用 FOSS 3rd 方 VCL 字符串网格。


[更新] 使用 TDrawGrid ...“TDrawGrid 没有属性“单元格”,就像它的兄弟 TStringGrid 一样。您的代码必须计算显示数据的位置,然后它必须在“画布”上绘制数据表示“的网格。”

这对我来说听起来像是很多工作:-(

使用 VirtualTreeView - 如果速度足够快,听起来还可以。我只是没有任何子节点。(update++我刚刚在主页上读到这个“虚拟树视图非常快。添加一百万个节点只需要700毫秒”)。那么速度上没有问题。但是只使用字符串网格会很好。尤其是用户可以单击和排序的地方。

或者,字符串网格只有 20 行高。也许我可以在用户滚动时处理滚动条点击并清除并重新填充这 20 行?

[进一步更新] 我将代码从 TStringGrid 更改为 TListView Beginupdate()),但这产生的差异可以忽略不计。操作,我忘记了“虚拟模式”-brb。

顺便说一句,数据是只读的,仅用于显示。

当然这是一个非常常见的问题?

4

3 回答 3

5

从下到上添加行,和/或RowCount之后设置。我只是做了一个小测试,添加了 90.000 行,获得了大约 1000 行。25% 的速度。

不过,这最多需要 1.5 秒。由于您谈论的只是几百行,因此我确信填充网格不是这里的负担。相反,检索和/或转换数据所需的时间似乎是。

于 2012-10-12T07:54:56.120 回答
5

没有BeginUpdate()方法。

TStringGrid确实有BeginUpdates:您需要通过Rows[]或的Cols[]数组来访问它TStrings,但对于添加新数据,使用Cols[]数组最有意义:

for i := 0 to Grid.ColCount - 1 do
begin
  Grid.Cols[i].BeginUpdate;
  try
    //Add row data
    for j := 1 to Grid.RowCount - 1 do
      Grid.Cols[i][j] := ...;
  finally  
    Grid.Cols[i].EndUpdate;
  end;
end;

我敢肯定我以前用过这个,并注意到速度的提高。

于 2012-10-12T08:14:55.510 回答
2

添加到其他人建议我想插入一个虚拟字符串网格,TdzVirtualStringGrid它建立在 a 上TDrawGrid并添加事件以返回要显示的字符串。我将它用于非常“大”的网格,并且效果很好。

在这里下载。

(您需要来自同一存储库的更多文件,这只是主要组件源代码。)

编辑:通过“来自同一存储库的更多文件”我的意思是,该组件使用 dzlib 库中的其他单元,因此您可能应该检查整个 shebang 并将其添加到程序的搜索路径中(有很多更有用那里的东西,因为每当我遇到需要更通用解决方案的东西时我都会添加它)或者只是提取组件所依赖的那些单元。dzlib 在 MPL 下获得许可。

于 2012-10-12T13:43:39.370 回答