Delphi MDI-обработка открытия / закрытия / активации дочерней формы
Я разрабатываю приложение MDI, которое назначает вкладку для каждого созданного дочернего элемента MDI. Мне нужно "поймать" onactivate, OnCreate и OnDestroy события дочерней формы в основном (Родительском) коде формы. Простой вызов кода в форме children для меня невозможен, так как есть много классов формы, которые используются в качестве детей MDI, также плагин может загрузить свою собственную форму...
Итак, мой вопрос: Как поймать, что дочерняя форма MDI была активирована / деактивирована без использования дочерней формы события ?
2 ответов:
Несколько лет назад я написал компонент типа панели задач, который делает именно такие вещи. Он называется TrmMDITaskbar. Вы можете найти его копию наTorrys , это часть пакета библиотеки rmControls. Он обрабатывает активацию, минимизацию, максимизацию и т. д.
Суть того, как это работает, заключается в том, что он цепляет дескриптор окна MDIParents, ищущий события MDIChild, и делает вещи, основанные на этих событиях.
Если вы хотите написать свой собственный, я бы предложил это в качестве хорошее место для начала.
Райан.
P.S. версия на Торрисе немного старше, но все равно должна работать. У меня есть более новая версия, доступная на моем веб-сайте поддержки. (Mills Enterprise )
Вы всегда можете перехватить события "постфактум" из вашего кода во время выполнения. В основном создайте универсальный OnActivate, который выглядит примерно так:
type TEventHolder = class private FSFActivate: TNotifyEvent; published property SavedFormActivate : TNotifyEvent read FSFActivate write fSFActivate; end; type TMainForm = class(Tform) : SavedEvents : tStringList; procedure ChildFormActivate(Sender: TObject); procedure InitChildForm(MdiForm:TForm); end; procedure TMainForm.ChildFormActivate(Sender: TObject); var i : integer; begin // your special processing here this is called for the child form. i := SavedEvents.IndexOf(ClassName); if i <> -1 then tEventHolder(SavedEvents.Objects[i]).SavedFormActivate(Sender); end; procedure TMainForm.InitChildForm(MdiForm:TForm); var OrigEvents : TEventHolder; begin if not Assigned(SavedEvents) then SavedEvents := tSTringlist.create; if Assigned(MdiForm.OnActivate) then begin OrigEvents := tEventHolder.create; OrigEvents.SavedFormActivate := MdiForm.OnActivate; SavedEvents.AddObject(MdiForm.ClassName,OrigEvents); end; MdiForm.OnActivate := ChildFormActivate; end;Затем вызовите InitChildForm, чтобы установить обработчики событий для ваших универсальных версий в какой-то момент в вашей программе (скорее всего, сразу после создания формы). Конечно, при закрытии основной формы вы захотите освободить сохраненные события (и связанные объекты).
Comments