Очень странное поведение StringGrid.
В обработчике события написано:
- Код: Выделить всё
ShowMessage('1') ;
try
SG.RowCount:=4 ;
except
on E:Exception do begin
ShowMessage('error get') ;
end;
end;
ShowMessage('2') ;
При выполнении этого кода, сначала появляется сообщение с текстом "1", а потом сразу стандартное окно исключения Lazarus (Press ok to ignore, press cancel to kill). Никакого текста "error get" не появляется.
Т.е., конструкция try except не работает, что на мой взгляд, даже не баг, а просто повод переписать проект на чем-нибудь другом, дабы не встрять позже.
Путем вычеркивания всех событий во всей программе, установил, что конструкция try except начинает работать, если я убираю у объекта StringGrid события OnPrepareCanvas и OnSelectCell. Но приложение однопоточное - потому, все, что происходит в присваивании SG.RowCount, должно обрабатываться блоком try except, как я полагаю. При этом даже обрамление кода этих обработчиков в свои собственные блоки try..except не помогает - только полное удаление.
Windows Vista 32bit, Lazarus 0.9.30, FreePascal .2.4.2
Что это вообще происходит?
Добавлено спустя 9 минут 45 секунд:
На всякий случай, решил проверить, обрабатывает ли FPC исключения во вложенных процедурах.
- Код: Выделить всё
program teste ;
{$mode objfpc}{$h+}
uses Sysutils;
procedure DoEx() ;
begin
raise exception.Create('yyy') ;
end ;
begin
try
raise exception.Create('xxx') ;
except
on E:Exception do Writeln(E.Message) ;
end ;
try
DoEx ;
except
on E:Exception do Writeln(E.Message) ;
end ;
end.
Вывод программы очевиден и ожидаем.
xxx
yyy