Модератор: Модераторы
procedure TForm2.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
CloseAction := caFree;
end;
frm_test := Tfrm_test.Create(Application);
frm_test.ShowModal;
if frm_test.Free <> nil then frm_test.Free;
tria писал(а):Пробовал. Выдает сообщение об ошибке.
tria писал(а):По моему, эта строка в корне неверна. Во-первый, Free - это процедура а не функция, во вторых frm_test<>nil - это не гарантия, что форма существует и Free может вызвать ошибку.
tria писал(а):Извиняюсь за отсутствие. Уточню свой вопрос.
Формы открываются немодально.
Существует, по сути, МДИ приложение. Пользователь может открыть произвольное число форм. Соответственно, в произвольном порядке может закрывать их...
Вот именно!Atrus писал(а):Если MDI форма при caFree выдаёт ошибку, то это уже баг, надо оформлять...
А в чем смысл:
>if frm_test.Free <> nil then frm_test.Free;
По моему, эта строка в корне неверна. Во-первый, Free - это процедура а не функция, во вторых frm_test<>nil - это не гарантия, что форма существует и Free может вызвать ошибку.
frm_test := Tfrm_test.Create(Application);
frm_test.ShowModal;
if frm_test <> nil then frm_test.Free;
Atrus писал(а): Free специально сделана для безопасного вызова деструктора. Она должна проверять существование объекта. Однако, я слишком часто натыкаюсь, что FPC реализация сделана на живую нитку...
Работать не будет даже создание формы с именем, идентичным имени уже существующей формы. Я точно не уверен, но думаю, что это обязательное условие и для дельфи. Иначе RTTI работать не сможет. Сейчас, кажется, именование создаваемых форм вручную уже не требуется, т.к. LCL научили это делать самостоятельно.tria писал(а):В статье предполагается, что работает CloseAction := caFree;, а у меня почему-то после этого возникает ошибка.
Это только у меня одного? У кого-то такой код работает?
И еще из статьи:
"Все объекты приложения должны иметь уникальные имена" - это условие правильности работы любого LCL приложения? (в примере в статье при невыполнении этого условия не будет работать код
(Application.FindComponent(FormName) as TForm).SetFocus)
На Делфи у меня это условие не выполнялось и все нормально работало...
f1.FormClose()
begin
CloseAction := caFree
end;
f2.FormClose()
begin
Inherited;
... - делаем действия
end;
f2.FormClose()
begin
... - делаем действия
Inherited;
end;
procedure TApplication.FreeComponent(Data: PtrInt);
begin
TComponent(Data).Free;
end;
FreeAndNil()
Form1.Free;
Form1 := nil;
var
frm: TForm1;
begin
if Assigned(frm) then
FreeAndNil(frm)
else
begin
frm := TForm1.Create(Application);
frm....
....
end;
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 51