1

Zeoslib6.6.6とSqlite3を使用したDelphi7プロジェクトがあります。フォームには、計算されたフィールド(TFloatField; TCurrencyField)の束とともに、サンプルデータベーステーブルからすべてを選択するZqueryがあります。クエリのOnCalcFieldsイベントは正常に実行され、すべてのフィールド値が設定されます。ただし、データセットをループしようとすると、フィールド数の制限(最初に計算された約14のフィールド)内にありますが、一貫して「範囲外のリストインデックス(62893)」例外が発生します。

スニペット: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 またはその他の仮想グリッドビューを使用することをお勧めします。

于 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 に答える