Zeoslib - цикл по вычисляемым полям - PullRequest
1 голос
/ 17 июля 2011

У меня есть проект Delphi 7, использующий Zeoslib 6.6.6 и Sqlite3. В форме у меня есть 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 к запросу, он работает нормально. Есть идеи?

Ответы [ 2 ]

0 голосов
/ 19 июля 2011

Кажется, я наткнулся, по крайней мере, на обходной путь: изменение

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

на

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

, похоже, решило проблему.

0 голосов
/ 18 июля 2011

Что происходит, когда gd.cells [x, row] превышает количество строк, которые вы установили в сетке строк? Вероятно, это твоя ошибка. Если вы установили в своей сетке 62000 строк, отлично, это ваша ошибка. В противном случае, я подозреваю, что вы достигли предела.

Я всегда использовал, чтобы количество строк в моей сетке строк росло так, с логикой после строки = строка + 1:

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

Если, однако, вы действительно получаете эту ошибку при 60k + строки строк, возможно, что вместо этого вы достигаете предела длины строки строки сетки.

Поскольку вы, очевидно, не опубликовали ВСЕ свой код, трудно понять, что определяет количество строк в сетке строк и как оно растет.

В случае, если вы достигли предела, после которого StringGrid больше не работает, я предлагаю вам удалить StringGrid и использовать ExgridView или какой-либо другой виртуальный вид сетки, который может обрабатывать очень очень большой объем данных.

...