2011-07-17 62 views
1

我有一个使用Zeoslib 6.6.6和Sqlite3的Delphi 7项目。 在窗体上,我有一个Zquery从一个示例数据库表中选取所有东西以及一堆计算字段(TFloatField; TCurrencyField)。查询的OnCalcFields事件运行正常,并设置所有字段值。 但是,当我尝试遍历数据集时,我始终得到'列表索引超出范围(62893)'异常,尽管我处于字段数限制(约14的第一个计算字段)内。Zeoslib - 循环计算字段

段: 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

当索引超出范围时,我会检查调用堆栈。它可能不是用于处理它的'i',而是在它后面的代码中的某处使用的索引...(像这样循环访问数据集将导致数据集的事件触发!) –

回答

0

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

我总是有我的弦格行数成长就是这样,用逻辑行后=行+ 1:

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

然而,如果你真的是在60K + stringgrid行收到此错误,有可能而是发生了什么是您正在击中一个字符串网格行长度限制。

由于您没有明确地发布所有代码,因此很难知道什么设置了字符串网格中的行数以及它的增长方式。

如果你已经超过了StringGrid不再运行的限制,我建议你放弃StringGrid并使用ExgridView或其他一些可以处理非常大量数据的虚拟gridview。

0

我似乎已经在至少一种变通方法绊倒: 改变

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

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

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