Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Как обнилить владельца fsMDIChild формы?  [new]
учусьвсюжизнь
Guest
Имеется форма TFReference = class(TForm) с FormStyle := fsMDIChild.
Также в главной форме с FormStyle := fsMDIForm есть несколько приватных полей:
private
    FMDIRefKinds,
    FMDIRefSpecs,
    FMDIRefTasks,
    FMDIRefTrailers,
    FMDIRefTypes: TFReference;    // MDI формы справочников

Так создается экземпляр MDI формы с соответсвующим заголовком:
  FMDIRefKinds := TFReference.Create(Application);
  with FMDIRefKinds do begin
    Caption := 'Kinds';
    Show;
  end;

и так для всех других FMDIRef...
Закрытие MDI формы:
procedure TFReference.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
end;


Вопрос: как в момент закрытия MDI формы сделать так, чтобы FMDIRefKinds и т.п. стало равным nil? Т.е. как обnilить создателя MDI формы?
6 июл 18, 10:57    [21548615]     Ответить | Цитировать Сообщить модератору
 Re: Как обнилить владельца fsMDIChild формы?  [new]
Virtual Student
Member

Откуда: Belarus
Сообщений: 284
учусьвсюжизнь,

Я бы заслал сообщение... Примерно так в главной форме:
    procedure MDIChildActivate(var Message: TMessage); message em_child_activate;
    procedure MDIChildClose(var Message: TMessage); message em_child_destroy;

И в процедуре MDIChildClose обnilивал нужные переменные.

Ну, и в MDIChild например в Destroy:
PostMessage(MainForm.Handle, em_child_destroy, 0, 0);
6 июл 18, 11:06    [21548659]     Ответить | Цитировать Сообщить модератору
 Re: Как обнилить владельца fsMDIChild формы?  [new]
white_nigger
Member

Откуда: Тула
Сообщений: 1841
Чушь написал. Ссылка на форму и создатель формы не имеют ничего общего. Можешь при создании формы передавать ссылку на эту переменную а в деструкторе формы её обнулять. Хотя это изначально кривой дизайн
6 июл 18, 12:00    [21548982]     Ответить | Цитировать Сообщить модератору
 Re: Как обнилить владельца fsMDIChild формы?  [new]
учусьвсюжизнь
Guest
white_nigger
это изначально кривой дизайн

Хорошо. Как тогда без перебора всех MDIChild
for i := 0 to MDIChildCount - 1 do

и идентификации нужного окна по имени или еще какому признаку узнать, что нужная форма уже открыта и BringToFront ее, а если нет, то создать ее? А так, по переменной сразу было бы видно - открыта (не nil) или нет (nil) форма.
6 июл 18, 13:16    [21549229]     Ответить | Цитировать Сообщить модератору
 Re: Как обнилить владельца fsMDIChild формы?  [new]
white_nigger
Member

Откуда: Тула
Сообщений: 1841
А потом появятся ещё стопицот нужных форм и для них потребуется стопицот переменных... Сделай виртуальную функцию у базового класса MDIChild, которая вернёт свой идентификатор. И функцию которая вернет/активирует MDIChild по этому идентификатору. И да, именно проходом по MDIChildCount
6 июл 18, 15:19    [21549904]     Ответить | Цитировать Сообщить модератору
 Re: Как обнилить владельца fsMDIChild формы?  [new]
учусьвсюжизнь
Guest
white_nigger,
не появятся :)
Всем спасибо за науку, реализовал хотелку через встроенный в VCL механизм
protected
  procedure Notification(AComponent: TComponent; Operation: TOperation); override;

procedure TFMain.Notification(AComponent: TComponent; Operation: TOperation);
begin 
  inherited;

  if (Operation = opRemove) and
     (AComponent is TForm) and
     (TForm(AComponent).FormStyle = fsMDIChild)
  then begin
    // set reference to Child to nil
    case TFReference(AComponent).ID_Ref of
      100: FMDIRefTasks := nil;
      ...
    end;
  end;
end;
6 июл 18, 15:28    [21549976]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить