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

Maw*_*awg 4 delphi tstringgrid

我用Google搜索并找到了很多建议,但这一切似乎已经好几年了,但没有任何帮助.

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

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

没有BeginUpdate()方法.

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


[更新]使用TDrawGrid ..."TDrawGrid没有属性"Cells",就像它的兄弟TStringGrid一样.你的代码必须计算显示数据的位置,然后它必须在"Canvas"上绘制数据的表示"电网."

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

使用VirtualTreeView - 如果足够快,听起来不错.我不会有任何子节点.(更新++我刚刚在主页上阅读了这篇文章"Virtual Treeview非常快.添加一百万个节点只需要700毫秒").那么速度没问题.但是只使用字符串网格会很好.特别是用户可以点击和排序的地方.

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

[Furtehr更新]我从TStringGrid更改为TListView代码有Beginupdate()),但这可以忽略不计.Ops,我忘记了"viortual模式" - brb.

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

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

NGL*_*GLN 5

从下到上添加行,和/或RowCount之后设置.我刚做了一点测试,增加了90.000行,获得了大约.速度提高25%.

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


Mat*_*ood 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;
Run Code Online (Sandbox Code Playgroud)

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

  • cols只是一个TStrings数组,这个数组的每个元素都有BeginUpdate/EndUpdate`对于i:= 0到grid.colcount-1做grid.cols [i] .beginupdate`和相应的try..finally (3认同)