Zeoslib - 在计算字段上循环

时间:2011-07-17 10:57:48

标签: delphi sqlite zeos

我有一个使用Zeoslib 6.6.6和Sqlite3的Delphi 7项目。 在表单上,​​我有一个Zquery从一个示例数据库表中选择所有内容以及一堆计算字段(TFloatField; TCurrencyField)。查询的OnCalcFields事件运行正常,并设置了所有字段值。 但是,当我尝试遍历数据集时,我一直得到一个'List index out of bounds(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连接到查询,它可以正常工作。有什么想法吗?

2 个答案:

答案 0 :(得分:0)

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

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

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

但是,如果您确实在60k + stringgrid行中收到此错误,则可能会发生的情况是您遇到字符串网格行长度限制。

由于您显然没有发布所有代码,因此很难知道字符串网格中的行数在何处以及如何增长。

如果您达到了StringGrid不再运行的限制,我建议您删除StringGrid并使用ExgridView或其他一些可以处理非常大量数据的虚拟网格视图。

答案 1 :(得分:0)

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

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

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

似乎解决了这个问题。