Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как отловить активацию MDI окон из главной формы [D7, WinXP]


AndrewK ©   (2005-05-30 14:45:00) 

Доброго времени суток!

Подскажите, пожалуйста, как отловить момент создани, активации (и момент переключения между дочерними окнами) и уничтожения Child-формы из главной формы?


Erik1   (2005-05-31 12:27:00) [1]

Плохой совет!
Лучше:
protected
 procedure Activate; override;

constructor TBaseForm.Create(AOwner: TComponent; AFormID: string; IData:
 IMainLayer);
begin
 fIMain := IData;
 fUnicID := Random(MaxInt);
 fFormID := AFormId;
end;
procedure TBaseForm._StateChanged(Owner: TObject; Event: TOwnerEvent);
begin
 if not Application.Terminated and Assigned(fIMain) then
   fIMain.StateChanged(Owner, Event);
end;

procedure TBaseForm.Activate;
begin
 _StateChanged(Self, evActive);
 inherited;
end;


AndrewK   (2005-05-31 11:46:00) [2]

> Семен Сорокин

Огромное спасибо! :-)
Это то, что нужно!


Семен Сорокин   (2005-05-30 20:41:00) [3]

Screen.OnActiveFormChange возможно может помочь


Игорь Шевченко   (2005-05-30 17:46:00) [4]

AndrewK   (30.05.05 17:31) [7]

Я в каждом дочернем окне посылал главному окну сообщение.


> Да и не хочется через какое-то время вспоминать что надо
> дописать в child, чтобы все работало


Посылка сообщения была в общем для всех MDIChild окон проекта предке.


AndrewK   (2005-05-30 17:31:00) [5]

> да куда уж "автоматичней" ..

Наверное не правильно выразился.

Передо мной стоит задача сделать некое приложение, которое будет управлять дочерними окнами.

Что оно будет с ними делать:
1. При создании окна создавать закладку на специальной панели
2. При удалении окна эту закладку удалять.
3. При выборе закладки - активизировать привязанное к ней окно
4. При выборе окна мышкой - выделять нужную закладку

Наверняка можно сделать так, чтобы все это делалось автоматически без переопределения событий у дочернего окна и без изменения конструкторов.

Например, создал окно и оно сразу показалось на закладке, без кокого-либо дополнительного кода. Да и не хочется через какое-то время вспоминать что надо дописать в child, чтобы все работало.  :)


Digitman   (2005-05-30 17:16:00) [6]


> Хочется чего-нибудь более автоматического


да куда уж "автоматичней" ..

в конструкторе класса child-формы получаешь ссылку на объект parent-формы, приводишь ее класс к нужному типу - и всех делов ..


AndrewK   (2005-05-30 17:09:00) [7]

> Digitman:
Попробовал, работает. Хочется чего-нибудь более автоматического.
Хотя может быть это уже излишества...

> All:
А как отловить переключение между окнами при помощи API, например, WM_MDIACTIVATE?

Есть код (скачал где-то):



 ...
 private
   FClientInstance : TFarProc;
   FPrevClientProc : TFarProc;
   procedure ClientWndProc (var Message: TMessage);
 ...

procedure ...FormCreate(Sender: TObject);
begin

 FClientInstance := MakeObjectInstance(ClientWndProc);
 FPrevClientProc := Pointer(GetWindowLong(ClientHandle, GWL_WNDPROC));
 SetWindowLong(ClientHandle, GWL_WNDPROC, LongInt(FClientInstance));

end;

...

procedure ...ClientWndProc(var Message: TMessage);
begin
 with Message do
  case Msg of
    WM_MDIACTIVATE:
    begin
      ShowMessage('Activated');
    end;
    WM_MDIDESTROY:
    begin
      ShowMessage('Destroyed');
    end;
  else
    Result := CallWindowProc(FPrevClientProc,
                             ClientHandle,
                             Msg,
                             wParam,
                             lParam);
  end;
end;


Уничтожение отлавливает, переключение нет.

Где-то ошибка?


Avals-Z   (2005-05-30 16:01:00) [8]

так наверно получится с открытием и закрытием точно, а вот с переключением непробовал.

if FindWindow(nil, 'заголовок окна') <> 0 then
 ShowMessage('Окно есть')
else
 ShowMessage('Окноа НЕТ');


Digitman   (2005-05-30 15:33:00) [9]

опиши и реализуй обработчики этих событий в классе MDIParent-формы

а при создании экземпляров MDIСhild-форм просто назначай им готовые соответствующие обработчики


AndrewK   (2005-05-30 15:30:00) [10]

Мне надо сделать так, чтобы не описывать события отдельно у дочерних форм.


Digitman   (2005-05-30 14:48:00) [11]

так же как и для обычных форм :
OnActivate
OnDestroy


Наверх

Титульная страница Поиск, карта сайта Написать письмо