![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как отловить активацию 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