Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.06.14;
Скачать: CL | DM;

Вниз

Как отловить активацию MDI окон из главной формы   Найти похожие ветки 

 
AndrewK   (2005-05-30 14:45) [0]

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

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


 
Digitman ©   (2005-05-30 14:48) [1]

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


 
AndrewK   (2005-05-30 15:30) [2]

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


 
Digitman ©   (2005-05-30 15:33) [3]

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

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


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

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

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


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

> 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;


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

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


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


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


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

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


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

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

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

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

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

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

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


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

AndrewK   (30.05.05 17:31) [7]

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


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


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


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

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


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

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

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


 
Erik1 ©   (2005-05-31 12:27) [11]

Плохой совет!
Лучше:
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;



Страницы: 1 вся ветка

Текущий архив: 2005.06.14;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.044 c
14-1117166797
Иксик
2005-05-27 08:06
2005.06.14
BTC


14-1117132611
Просто Джо
2005-05-26 22:36
2005.06.14
Футбол по-программистски


14-1117203605
Narik
2005-05-27 18:20
2005.06.14
MediaPlayer1


3-1114757222
afanasic
2005-04-29 10:47
2005.06.14
Oracle -> BDE -> Delphi не читается BLOB


4-1114255052
Dr.Faust
2005-04-23 15:17
2005.06.14
LPT port