我用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。
顺便说一句,数据是只读的,只是为了显示。
当然这是一个非常常见的探测器?
答案 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许可的。