TCustomGrid вызывает Exception при вызове из FormClose

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

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

TCustomGrid вызывает Exception при вызове из FormClose

Сообщение Browny » 08.07.2010 23:06:49

Всех приветствую!
(Lazarus 0.9.29)
Описание недоразумения: если динамически создать TCustomGrid или его потомка, потом кликнуть мышью внутри по любой ячейке, а потом попытаться сделать MyGrid.Free из обработчика события OnClose главной формы, то возникает ошибка: Проект вызвал класс исключения... (см. картинку во вложении). После этого среда отображает файл Grids и подсвечивает строчку в методе класса TCustomGrid:
Код: Выделить всё
function TCustomGrid.ColRowToOffset(IsCol, Relative: Boolean; Index:Integer;
  var StartPos, EndPos: Integer): Boolean;
var
  Dim: Integer;
begin
  Result:=false;
  with FGCache do begin
    if IsCol then begin
>>>      StartPos:=integer(PtrUInt(AccumWidth[index]));
      Dim:=GetColWidths(index);


Ошибка возникает, если удалять объект так:
Код: Выделить всё
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
  If Assigned(testGrid) then testGrid.Free;
end;


Но если удалить объект ДО закрытия формы или сделать так:
Код: Выделить всё
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
  If Assigned(testGrid) then
     Begin
      testGrid.Parent:= Nil;
      testGrid.Free;
     end;
end;

.. то всё проходит гладко. Вопрос: где-то в компоненте "забыли" проверить статус, что парент удаляется/выгружается (или подобное)? Если кто знает причину - хотелось бы услышать..

P.S. Если это уже широко известная проблема - мои извинения..
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Browny
новенький
 
Сообщения: 37
Зарегистрирован: 31.08.2007 10:42:55

Re: TCustomGrid вызывает Exception при вызове из FormClose

Сообщение Mr.Smart » 08.07.2010 23:11:41

А зачем использовать TCustomGrid?
Удаление делайте в OnDestroy
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: TCustomGrid вызывает Exception при вызове из FormClose

Сообщение alexs » 08.07.2010 23:46:35

а зачем руками убивать грид при уничтожении формы? форма и сама его нормально уничтожит.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4064
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: TCustomGrid вызывает Exception при вызове из FormClose

Сообщение Browny » 09.07.2010 10:20:30

Mr.Smart, не вижу препятствий для уничтожения мною runtime созданного Grid (TStringGrid в т.ч.) в обработчике OnClose - чуть ниже покажу новое об ошибке. Всё же считаю это ошибкой.
alexs, а на основании чего, позвольте? Что форма является парентом и овнером Grid'а и Grid входит в соответствующие списки? А если мне важен порядок уничтожения? Если у меня, предположим, какой-либо объект-тред-файл взаимодействуют с Grid? Нет уж - сам создал в runtime - сам очисть, мне как-то спокойнее так...

Итак, всё же ошибка - делаю такой вывод на основании того, что аналогичный код в Lazarus 0.9.29 SVN: 21647 отрабатывает БЕЗ ошибки. У меня же ошибка возникла на SVN 26377. И действительно, при переносе тестового кода Lazarus ругнулся на некоторые части кода..
Например, был у меня переопределён метод DrawGridCheckboxBitmaps:

Код: Выделить всё
SVN 26377
procedure DrawGridCheckboxBitmaps(const aCol,aRow: Integer; const aRect: TRect; const aState: TCheckboxState); virtual;
SVN 21647
procedure DrawGridCheckboxBitmaps(const aRect: TRect; const aState: TCheckboxState); virtual;


Итак, код grids.pas менялся основательно. Позже попробую сравнивать ранний и поздний модули... Если кто-то тоже заинтересован, выкладываю обе версии модуля в аттаче.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Browny
новенький
 
Сообщения: 37
Зарегистрирован: 31.08.2007 10:42:55


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Majestic-12 [Bot] и гости: 246

Рейтинг@Mail.ru