Форум: "Основная";
Текущий архив: 2005.06.14;
Скачать: [xml.tar.bz2];
ВнизКак отловить активацию 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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.042 c