Delphi 如何快速向TStringGrid添加多行?
我在谷歌上搜索并找到了很多建议,但这些建议似乎都有好几年的历史了,而且都没有任何帮助 我有一个包含8列的字符串网格,一旦我得到了超过几百行,填充就需要2秒钟(我使用GetTickCount进行了比较) 我尝试了Delphi 如何快速向TStringGrid添加多行?,delphi,tstringgrid,Delphi,Tstringgrid,我在谷歌上搜索并找到了很多建议,但这些建议似乎都有好几年的历史了,而且都没有任何帮助 我有一个包含8列的字符串网格,一旦我得到了超过几百行,填充就需要2秒钟(我使用GetTickCount进行了比较) 我尝试了StringGrid.Perform(WM_SETREDRAW,0,0)(最后是0,1)。我试着设置 可见:=更新时为False。两者都没有用 没有BeginUpdate()方法 有什么建议吗?德尔福XE2起动器。如果经过尝试和测试,我愿意使用FOSS第三方VCL字符串网格 [更新]正在
StringGrid.Perform(WM_SETREDRAW,0,0)
(最后是0,1
)。我试着设置
可见:=更新时为False
。两者都没有用
没有BeginUpdate()
方法
有什么建议吗?德尔福XE2起动器。如果经过尝试和测试,我愿意使用FOSS第三方VCL字符串网格
[更新]正在使用TDrawGrid。。。TDrawGrid没有像其兄弟TStringGrid那样的属性“Cells”。您的代码必须计算数据的显示位置,然后必须在网格的“画布”上绘制数据的表示形式 对我来说,这似乎是一项艰巨的工作:-( 使用VirtualTreeView-如果足够快,听起来还可以。我只是不会有任何子节点。(更新++我只是在“Virtual Treeview非常快。添加一百万个节点只需700毫秒”)上读到了这一点。那么速度上没有问题。但是使用字符串网格会很好。特别是用户可以单击和排序的网格 或者,stringgrid只有20行高。也许我可以处理scrolbar的点击,并在用户scrols时清除并重新填充这20行 [Furtehr update]我从TStringGrid更改为TListView,其中代码具有
Beginupdate())
,但这造成了微不足道的差异。哦,我忘了“虚拟模式”-brb
顺便说一句,数据是只读的,只是为了显示
当然这是一个非常常见的问题?从下到上添加行,和/或随后设置
行数。我刚刚添加了90000行,速度提高了约25%
不过,这最多需要1.5秒。因为您所说的只是几百行,我相信填充网格不是这里的负担。取而代之的是,检索和/或转换数据所需的时间似乎很短
没有BeginUpdate()
方法
TStringGrid
确实有beginUpdate
:您需要通过TStrings
的Rows[]
或Cols[]
数组访问它,但对于添加新数据,使用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;
我确信我以前使用过这个,速度有所提高。添加到其他建议使用虚拟字符串网格,我想插入TdzVirtualStringGrid
,它构建在TDrawGrid
上,并添加事件以返回要显示的字符串。我用它来制作非常大的网格,效果很好
下载它
(您需要来自同一存储库的更多文件,这只是主要组件源代码。)
编辑:我所说的“来自同一存储库的更多文件”是指,该组件使用dzlib库中的其他单元,因此您可能应该检查整个shebang,并将其添加到程序的搜索路径中(里面有很多有用的东西,因为每当我遇到需要更一般化解决方案的东西时,我都会添加到其中)或者只提取组件所依赖的单元。dzlib根据MPL获得许可。最佳性能将通过将TStringGrid
更改为虚拟网格来实现,例如虚拟模式下的TDrawGrid
,它将通过事件从分离的数据列表中检索单元格内容。这将比他的IMHO。我使用TDrawGrid
对数千行进行即时访问,例如-例如,在我的笔记本电脑上,一个280 MB的日志文件在不到一秒钟的时间内打开。在七点以下,显示“打开的文件”需要更多的时间对话框窗口,而不是读取和索引280 MB的内容。您可以学习VirtualTreeView,而不是TDrawGrid
。它不仅仅是一个听起来像树的视图;-)使用虚拟模式的每个控件都会比TStringGrid
提供更好的性能。不能仅仅因为它们看起来不同就将TDrawGrid
与VirtualTreeView
进行比较,但两者都比TStringGrid
更有效,这是肯定的。根据我个人的喜好,我建议您使用VirtualTreeView
,因为您可以做比使用TDrawGrid
多得多的事情。但是,如果您真的需要一个具有非常基本功能的外观陈旧的网格,TDrawGrid
可能就足够了。@Mawg,您能告诉我们在这种情况下使用TStringGrid
的目的是什么吗?它是用来显示或编辑数据的吗?如果您只需要显示数据,那么即使是TListView
也会给您带来足够的性能提升,如果您在“虚拟模式”中使用它,您将获得更多的性能提升。然而,我必须同意@TLama关于VirtualTreeView
——它只是最好的组件。我很久以前就停止使用TStringGrid了,我再也没有回头。为了响应您的编辑:将数据放在内存客户端数据集中,并通过一个数据库网格显示它,它只“加载”可见的行,可能也会更好。行和列是索引属性,不授予访问权限到BeginUpdate
或EndUpdate
。但是填充网格并不是问题所在。cols只是一个tstring数组,该数组的每个元素都有BeginUpdate/EndUpdatefor i:=0 to grid.colcount-1 do grid.cols[i]。BeginUpdate
和相应的try..finally+1确实加快了速度!很抱歉第一次没有理解。+1@dummzeuch加上更多内容,用于解释所需内容;-)如果您在@Mawg解释“来自同一存储库的更多文件”,则所需时间将减少50%以上:速度将增加一倍以上。