如何快速添加许多行到TStringGrid?

时间:2012-10-12 07:39:39

标签: delphi tstringgrid

我用Google搜索并发现了很多建议,但这些建议似乎都已有好几年了,而且没有任何帮助。

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

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

没有BeginUpdate()方法。

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


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

这对我来说听起来很多: - (

使用VirtualTreeView - 如果足够快,听起来不错。我不会有任何子节点。 (更新++我刚刚在the homepage上看到了这一点。“Virtual Treeview非常快。添加一百万个节点只需要700毫秒”)。那么速度没问题。但是只使用字符串网格会很好。特别是用户可以点击&排序

或者,stringgrid只有20行高。也许我只能处理滚动条点击并清除&当用户scrols时重新填充这20行?

[Furtehr update]我从TStringGrid改为TListView,代码有Beginupdate()),但这个差别微乎其微。 Ops,我忘记了“viortual模式” - brb。

顺便说一句,数据是只读的,只是为了显示。

当然这是一个非常常见的探测器?

3 个答案:

答案 0 :(得分:5)

从下到上添加行,和/或之后设置RowCount。我刚刚a little test添加了90.000行,获得了大约。速度提高25%。

尽管如此,最多需要1.5秒。既然你只谈了几百行,我肯定在这里填充网格不是负担。相反,检索和/或转换数据所需的时间似乎是。

答案 1 :(得分:5)

  

没有BeginUpdate()方法。

TStringGrid确实有BeginUpdates:您需要通过Rows[]的{​​{1}}或Cols[]数组访问它,但是为了添加新数据,请使用TStrings数组最有意义:

Cols[]

我确信我之前已经使用了这个速度来提高速度。

答案 2 :(得分:2)

添加其他人建议虚拟字符串网格我想插入构建在TdzVirtualStringGrid上的TDrawGrid并添加事件以返回要显示的字符串。我将它用于非常“大”的网格,它工作正常。

下载here

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

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