Delphi MDI-обработка открытия / закрытия / активации дочерней формы



Я разрабатываю приложение MDI, которое назначает вкладку для каждого созданного дочернего элемента MDI. Мне нужно "поймать" onactivate, OnCreate и OnDestroy события дочерней формы в основном (Родительском) коде формы. Простой вызов кода в форме children для меня невозможен, так как есть много классов формы, которые используются в качестве детей MDI, также плагин может загрузить свою собственную форму...



Итак, мой вопрос: Как поймать, что дочерняя форма MDI была активирована / деактивирована без использования дочерней формы события ?

547   2  

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

    Ничего не найдено.