我有一个10列的TStringGrid。向其中添加500行大约需要2秒钟。这是正常的表现吗?

对我来说似乎有点慢。

我正在从数据库查询中获取数据。如果我遍历查询,但不将结果写入StringGrid,则该过程大约需要100毫秒,因此,不是数据库在减慢速度。

一旦添加了行,StringGrid的性能就可以了。

这是我正在使用的代码

Grid.RowCount := Query.RecordCount;
J := 0;

while not Query.EOF do
begin
    Grid.Cells[0,J]:=Query.FieldByName('Value1').AsString;
    Grid.Cells[1,J]:=Query.FieldByName('Value2').AsString;
    Grid.Cells[2,J]:=Query.FieldByName('Value3').AsString;
    // etc for other columns.
    Inc(J);
    Query.Next();
end;

实际的代码实际上要复杂一点(表列与查询列并不完全对应),但这是基本思想

最佳答案

我发现遍历大量记录时非常重要的另一件事是为每个字段使用适当的TField变量。 FieldByName每次都会遍历Fields集合,因此不是最高效的选项。
在循环之前,如下定义每个字段:

var
  f1, f2: TStringField;
  f3: TIntegerField;

begin
  // MyStringGrid.BeginUpdate; // Can't do this
  // Could try something like this instead:
  // MyStringGrid.Perform(WM_SETREDRAW, 0, 0);
  try
    while ... do
    begin
      rowvalues[0] := f1.AsString;
      rowvalues[1] := f2.AsString;
      rowvalues[2] := Format('%4.2d', f3.AsInteger);
      // etc
    end;
  finally
    // MyStringGrid.EndUpdate; // Can't - see above
    // MyStringGrid.Perform(WM_SETREDRAW, 1, 0);
    // MyStringGrid.Invalidate;
  end;
end;

与BeginUpdate/Endupdate一起,并在适当时调用Query.DisableControls。

10-05 22:42