Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.046 c
3-1115349628
SergP
2005-05-06 07:20
2005.06.14
Как работать с таблицами DBASE IV имеющими расширение не dbf?


1-1117378688
Destroyer
2005-05-29 18:58
2005.06.14
Как использовать Drag&amp;Drop для разных объектов?


14-1116784178
_silver
2005-05-22 21:49
2005.06.14
Тестирование СБИС.


1-1117537124
Karlson
2005-05-31 14:58
2005.06.14
При добавлении текста в Memo он [текст] переносится по строкам


6-1111426437
Nes
2005-03-21 20:33
2005.06.14
IdTCPClient&amp;IdTCPServer + косячный пример





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский