1

我有一个使用 Zeoslib 6.6.6 和 Sqlite3 的 Delphi 7 项目。在表单上,​​我有一个 Zquery 从示例数据库表中选择所有内容以及一堆计算字段(TFloatField;TCurrencyField)。查询的 OnCalcFields 事件运行良好,所有字段值均已设置。但是,当我尝试遍历数据集时,我始终得到一个“列表索引超出范围(62893)”异常,尽管我完全在字段计数限制内(第一个计算字段约为 14)。

片段:gd 是 TStringGrid,ZQuery4 是 TZQuery

while not ZQuery4.Eof do
begin
   row := row + 1;
   gd.Cells[0, row] := IntToStr(gd.Row);
   gd.Cells[1, row] := ZQuery4pid.Value; //Known column
   gd.Cells[2, row] := FormatFloat('0.00', ZQuery4area.Value); //known column

   for i := 3 to ZQuery4.FieldCount - 1 do
   begin
     field := Zquery4.Fields[i]; //crashes here when accessing the first calculated field.

     if field.IsNull
       then gd.Cells[i, row] := ''
       else gd.Cells[i, row] := field.AsString;
   end;
end;

奇怪的是,如果我将 DBGrid 连接到查询,它工作正常。有任何想法吗?

4

2 回答 2

0

当 gd.cells[x,row] 超过您在字符串网格中设置的行数时会发生什么?可能那是你的错误。如果您将 stringgrid 设置为 62000 行,那很好,那是您的错误。否则,我怀疑你达到了极限。

我总是让我的字符串网格行数像这样增长,在 row=row+1 之后有逻辑:

  if gd.RowCount<=row then gd.RowCount := row+1;

但是,如果您确实在 60k+ stringgrid 行处遇到此错误,则可能是您正在达到字符串网格行长度限制。

由于您显然没有发布所有代码,因此很难知道是什么设置了字符串网格中的行数,以及它是如何增长的。

如果您已达到 StringGrid 不再运行的限制,我建议您放弃 StringGrid 并使用 ExgridView 或其他可以处理非常大量数据的虚拟 gridview。

于 2011-07-18T01:18:21.587 回答
0

我似乎偶然发现了至少一种解决方法:改变

gd.Cells[i, row] := field.AsString;

gd.Cells[i, row] := field.DisplayText;

似乎已经解决了这个问题。

于 2011-07-19T09:40:08.423 回答