Delphi 如何快速向TStringGrid添加多行?

Delphi 如何快速向TStringGrid添加多行?,delphi,tstringgrid,Delphi,Tstringgrid,我在谷歌上搜索并找到了很多建议,但这些建议似乎都有好几年的历史了,而且都没有任何帮助 我有一个包含8列的字符串网格,一旦我得到了超过几百行,填充就需要2秒钟(我使用GetTickCount进行了比较) 我尝试了StringGrid.Perform(WM_SETREDRAW,0,0)(最后是0,1)。我试着设置 可见:=更新时为False。两者都没有用 没有BeginUpdate()方法 有什么建议吗?德尔福XE2起动器。如果经过尝试和测试,我愿意使用FOSS第三方VCL字符串网格 [更新]正在

我在谷歌上搜索并找到了很多建议,但这些建议似乎都有好几年的历史了,而且都没有任何帮助

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

我尝试了
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/EndUpdate
for i:=0 to grid.colcount-1 do grid.cols[i]。BeginUpdate
和相应的try..finally+1确实加快了速度!很抱歉第一次没有理解。+1@dummzeuch加上更多内容,用于解释所需内容;-)如果您在@Mawg解释“来自同一存储库的更多文件”,则所需时间将减少50%以上:速度将增加一倍以上。