2009-09-15 10 views
5

私は、作成された各MDI子にタブを割り当てるMDIアプリケーションを開発しています。私はメイン(親)フォームコードの子フォームのOnActivate、OnCreate、およびOnDestroyイベントを「キャッチ」する必要があります。単に子供のフォームでコードを呼び出すことは不可能です。MDIの子として使用されるフォームのクラスがたくさんあるので、プラグインはそれ自身のフォームをロードすることができます。Delphi MDI - オープン/クローズ/アクティブな子フォームの処理

私の質問は: MDIの子フォームは、子フォームのイベントを使用せずにを有効または無効にしました

答えて

3

私は数年前にタスクバータイプのコンポーネントを書いていますが、このタイプのものだけです。 これはTrmMDITaskbarと呼ばれています。 Torrysにそのコピーがあります。これはrmControlsライブラリパッケージの一部です。活性化、最小化、最大化などを処理します。

MDIChildイベントを探すMDIParentsウィンドウハンドルをフックし、それらのイベントに基づいて処理します。

あなたが自分で書くことを望んでいるのであれば、私はそれを始めるには良い場所としてお勧めします。 Ryan。

P.S. Torrysのバージョンは少し古いですが、まだ動作するはずです。私は私のサポートウェブサイトで入手できる新しいバージョンを持っています。 (Mills Enterprise

+0

ありがとうございました。最後に、SpTBXLibのコードを使ってWH_CBTフラグをフックするコードを使って解決しました。:) – migajek

+0

こんにちは、私はそのコンポーネントを試してみたいと思っていますが、サポートウェブサイトにはエラー403があります。あなたは特権を持っていません。) –

+0

@Alin Sfetcu、私は最近私のホスティングサービスを変更しましたが、まだ私のリンクとフォーラムをすべて再インストールする必要がありません。真実を伝えるために、私はすでにサポートフォーラムが機能していると思った。私はそのことをできるだけ早く調べます。あなたのために申し訳ありません。私が述べたように、Torryサイトのコピーはまだ動作するはずです。 –

1

実行時にコードから「事後」のイベントをいつでもフックすることができます。 (フォームを作成した後、最も可能性の高い右)あなたのプログラムの中でいくつかの点であなたのジェネリック版にイベントハンドラを設定するInitChildFormを呼び出して次に

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; 

:基本的には次のようになり、一般的なOnActivateイベントを作成します。もちろん、メインフォームのクロージャを実行すると、SavedEvents(およびリンクされたオブジェクト)を解放することができます。

関連する問題