Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Наследуемым формам задать nil в родителе при закры


Автор: Злоумышленник 27.3.2007, 23:46
В программе использую много MDI-форм внешне схожих, поэтому наследую их от одной формы. При закрытии в родителе ставлю Action := caFree; Но мне нужно также на переменную-указатель "имя формы" при закрытии ставить nil. Сейчас я это делаю в наследниках при закрытии (одно и то же практически при разных именах форм). Как это можно делать в родительской форме один раз? Self := nil не проходит.

Автор: yus 28.3.2007, 06:02
Цитата(Злоумышленник @ 27.3.2007,  23:46)
В программе использую много MDI-форм внешне схожих, поэтому наследую их от одной формы. При закрытии в родителе ставлю Action := caFree; Но мне нужно также на переменную-указатель "имя формы" при закрытии ставить nil. Сейчас я это делаю в наследниках при закрытии (одно и то же практически при разных именах форм). Как это можно делать в родительской форме один раз? Self := nil не проходит.

Если я правильно понял вопрос, то можно при закрытии дочернего окна посылать главной форме сообщение, WM_USER что окно закрывается с передачей указателя дочерней формы и уже из родительской формы освобождать дочернее.
Примерно так:
Родительское:
Код

    procedure WmUser(var Msg: TMessage); message WM_USER + 1;

Код

procedure TMyForm.WmUser(var Msg: TMessage);
begin
  TMyForm(Pointer(Msg.WParam)^).Free;
end;


Дочернее:
Код

  PostMessage(MyForm.Handle, WM_USER + 1, Integer(@Owner), 0)


Автор: ama_kid 28.3.2007, 07:20
Вариант yus достаточно неплох (при условии, что и он, и я правильно поняли вопрос), но может правильней переопределить деструктор MDI-формы?

Автор: Злоумышленник 28.3.2007, 10:23
Вы меня не так поняли. Не главная форма, а родительская, она даже не создаётся, просто инкапсулирует общие для всех форм действия.
А переопределение деструкторОВ MDI-форМ ничего нового, кроме лишнего кода, не даст. 
Вот определение формы, наследуемой от TfmLabxForm:
Код

//.........
type
  TfmLabxForm1 = class(TfmLabxForm)
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
//.........

Я сейчас делаю примерно так в КАЖДОЙ наследуемой форме:
Код

procedure TfmLabxForm1.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
  inherited;
  fmLabxForm1 := nil;
end;
//...........

Хочется fmLabxForm1 := nil; и все остальные (fmLabxForm2, 3, ... ,35) один раз при закрытии в nil ставить в РОДИТЕЛЕ

Автор: Rennigth 28.3.2007, 11:35
Злоумышленник, Что ты хочешь сделать, так нельзя. Я как понимаю это тебе нужно для анализа существования формы(аля создавать или нет)? Нужно писать отдельный менеджер который и будет создавать формы, хранить на них указатели, и анализировать их уничножение. 

Автор: ama_kid 28.3.2007, 11:38
Да позволено мне будет спросить: а откуда родитель может знать о своих потомках? По-моему, в принципах ООП такой связи не предусмотрено... Это потомок знает своего предка в лицо, а наоборот - это нонсенс какой-то...

Автор: Злоумышленник 28.3.2007, 11:52
решено другим способом
http://expert.delphi.int.ru/question_440

"Ответ эксперта:
Задача осложняется тем, что на одну форму может быть не одна переменная-указатель. Что и есть в вашем случае. Self и FormXXX. И форма не сможет обнулить их всех. это даже в теории сложно звучит.
Что делать. Есть два варианта. Один, в формкрейте передавать ссылку на переменную, которую нужно обнулить по выходу. Второе решение заключается в том, (я его часто применяю) что когда форма пропадает, то она пропадает с глобального маасива Screen.Forms. Тоесть, когда создаёте новую форму, вам нужно проверить, а нет ли её ещё. И с помощю банального цикла
for i:=0 to Screen.FormCount-1 do
if TForm(Screen.Forms).XXXXX = XXXXX
then {наша форма найдена!}
мы по какомуто критерию ищем нашу форму. Нашли - указатель на неё валиден. нет - звиняйте. Можно обнулять и создавать новую форму.
Пожалуйста, не забывайте оценивать ответы экспертов! Нам важно Ваше непредвзятое мнение!
Ответ отправил(а): Вадим К
Дата и время отправки ответа: 28.03.2007, 11:31"

Правда, проверить смогу только через 2 недели на работе - сейчас отпуск

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)