我有一个使用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连接到查询,它可以正常工作。有什么想法吗?
答案 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;
似乎解决了这个问题。