実行時にコードから「事後」にいつでもイベントをフックできます。基本的に、次のような汎用の 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 を呼び出して、プログラムのある時点でイベント ハンドラーを汎用バージョンに設定します (ほとんどの場合、フォームを作成した直後)。もちろん、メイン フォームを閉じると、SavedEvents (およびリンクされたオブジェクト) を解放する必要があります。