При разработке приложений с использованием множественного документа (MDI) в Delphi часто возникает потребность в обработке событий дочерних форм. В частности, разработчики сталкиваются с необходимостью "перехватить" события OnActivate, OnCreate и OnDestroy дочерних форм в коде родительской формы. Это может быть полезно, например, для управления вкладками, соответствующими созданным дочерним формам, или для выполнения определенных действий при активации, создании или закрытии дочерних форм.
Проблема
Разработчик MDI-приложения столкнулся с необходимостью обработки событий дочерних форм в родительской форме, не используя непосредственно события дочерних форм, так как в приложении используется множество классов форм, которые могут быть загружены как MDI-дочерние, а также плагины, которые могут загружать собственные формы.
Решение
Один из подходов к решению данной проблемы заключается в использовании компонента TrmMDITaskbar, который позволяет обрабатывать активацию, минимизацию, максимизацию и другие события MDI-дочерних форм. Компонент реализует "перехват" событий, связанных с MDI-дочерними формами, и выполняет определенные действия на основе этих событий. Код для перехвата доступен для скачивания на сайте Torrys в составе библиотеки rmControls.
Также в качестве альтернативного подхода можно использовать код на языке Object Pascal, который позволяет создавать общие обработчики событий, которые вызываются после фактического создания событий в вашем коде во время выполнения. Примерный код, который может помочь в этом, представляет собой создание универсальных обработчиков для событий активации, и привязку этих обработчиков к дочерним формам через переопределение их стандартных обработчиков:
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
// Здесь может быть ваш специальный код обработки, который вызывается для дочерней формы.
i := SavedEvents.IndexOf(Sender.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;
Этот код необходимо вызвать после создания дочерней формы, чтобы установить общие обработчики событий. Не забудьте освободить SavedEvents и связанные объекты при закрытии главной формы.
Заключение
В данной статье были рассмотрены два подхода к обработке событий дочерних форм в MDI-приложениях на Delphi без использования непосредственно событий дочерних форм. Использование компонента TrmMDITaskbar или реализация собственных обработчиков событий позволяет гибко управлять поведением дочерних форм в MDI-приложениях.
Разработка MDI-приложений в Delphi требует механизмов для обработки событий дочерних форм в родительской форме, что позволяет управлять поведением форм и взаимодействием плагинов с приложением.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS