fix для "AV при доступе к последней строке TStringGrid&

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
Padre_Mortius
энтузиаст
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

fix для "AV при доступе к последней строке TStringGrid&

Сообщение Padre_Mortius »

В svn версии Lazarus при доступе к последней строке StringGrid программа вылетает с AV. Ошибка была найдена в модуле grids.pas

Оригинальный код

Код: Выделить всё

function TVirtualGrid.GetCells(Col, Row: Integer): PCellProps;
begin
  // todo: Check range
  Result:=nil;
  if (Col<0) or (Row<0) or (Col>=ColCount) or (Row>=RowCount) then
    raise EGridException.CreateFmt(rsIndexOutOfRange, [Col, Row]);
  Result:=FCells[Col,Row];
end;


Исправленный код

Код: Выделить всё

function TVirtualGrid.GetCells(Col, Row: Integer): PCellProps;
begin
  // todo: Check range
  Result:=nil;
  if (Col<0) or (Row<0) or (Col>ColCount) or (Row>RowCount) then
    raise EGridException.CreateFmt(rsIndexOutOfRange, [Col, Row]);
  Result:=FCells[Col,Row];
end;


Может быть то-нить из тех у кого с английским лучше чем у меня сообщит об этой ошибке

P.S. Patch

Код: Выделить всё

Index: grids.pas
===================================================================
--- grids.pas   (revision 12076)
+++ grids.pas   (working copy)
@@ -6722,7 +6722,7 @@
 begin
   // todo: Check range
   Result:=nil;
-  if (Col<0) or (Row<0) or (Col>=ColCount) or (Row>=RowCount) then
+  if (Col<0) or (Row<0) or (Col>ColCount) or (Row>RowCount) then
     raise EGridException.CreateFmt(rsIndexOutOfRange, [Col, Row]);
   Result:=FCells[Col,Row];
 end;
Павел Ишенин
постоялец
Сообщения: 475
Зарегистрирован: 24.03.2007 09:16:52

Сообщение Павел Ишенин »

Сообщил тому, кто гридом занимается
Павел Ишенин
постоялец
Сообщения: 475
Зарегистрирован: 24.03.2007 09:16:52

Сообщение Павел Ишенин »

Разработчик просит тестовое приложение
Padre_Mortius
энтузиаст
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Сообщение Padre_Mortius »

Куда отправить можно? Отправлю скорее всего н выходных. Там времени будет немного больше.
Аватара пользователя
shade
энтузиаст
Сообщения: 879
Зарегистрирован: 21.02.2006 19:15:48
Откуда: http://shamangrad.net/
Контактная информация:

Сообщение shade »

Padre_Mortius
Не вижу ошибки.
1. нумерация с нуля, потому не могут быть отрицательные индексы
2. нумерация с нуля, потому индекс (Row/Col)Count не допустим, например если ColCount = 3, то допустимо три индекса 0, 1, 2

потому оригинальная проверка

Код: Выделить всё

(Col<0) or (Row<0) or (Col>=ColCount) or (Row>=RowCount)

верна

Индекс последней строки будет RowCount - 1, если RowCount <> 0
Если RowCount = 0, то последней строки просто нет :wink:
Padre_Mortius
энтузиаст
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Сообщение Padre_Mortius »

Значит туплю жутко. :oops: Прийду домой еще раз все перепроверю.
Павел Ишенин
постоялец
Сообщения: 475
Зарегистрирован: 24.03.2007 09:16:52

Сообщение Павел Ишенин »

Если что, то можно скидывать в баг трекер
Аватара пользователя
Browny
новенький
Сообщения: 37
Зарегистрирован: 31.08.2007 10:42:55

Сообщение Browny »

Padre_Mortius
не подтверждаю. В svn 11933, snapshot 04.09.2007, всё работает корректно, независимо от FixedRows и RowCount. При обращении к несуществующей ячейке исправно возникает Exception.

Другой вопрос, что странное поведение при RowCount=0 или ColCount=0. Если эти значения выставлены в DesignTime, то при запуске в RunTime появляется дефолтная сетка 5x5. Приходится убирать ячейки в RunTime. Сейчас попробую посмотреть код...
Аватара пользователя
Browny
новенький
Сообщения: 37
Зарегистрирован: 31.08.2007 10:42:55

Сообщение Browny »

Да, в grid.pas конструктор TCustomGrid.Create в рантайме делает ячейки. Предлагаю убрать оттуда и поставить default <значение> для proprty RowCount и property ColCount.
Аватара пользователя
alexs
долгожитель
Сообщения: 4066
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

напиши автору грида - Jesus Reyes
Ответить