2011-06-27 42 views
2

私は多数のMDI子ども(MDI以外のフォームも含む)を持つMDIアプリケーションを持っており、どのフォームが現在アクティブで、いつもフォーカスを持っているかをトラッキングしたい。ユーザーがアプリケーション内のあるフォームから別のフォームに切り替えると、ウィンドウのアクティブ化メッセージをトラップして、バックグラウンドでグローバル変数をアクティブなフォームのプロパティに設定します(このプロパティは基本クラスから継承されます)。私はもともと(私のアプリケーションのすべてのフォームを使用する)基本クラスのOnActivateイベントハンドラにコードを入れましたが、このイベントが必ずしも発生しないことに気づきました。何か案は?Delphi - 現在のフォーカスを持つウィンドウ/フォームのキャプチャ

私はDelphi 2006 BDSを使用しています。

+0

フォーカスを正確にはどういう意味ですか?入力フォーカスを意味する場合は、Windows.GetFocusを呼び出してFindControlに結果を渡し、最後にフォームに到達するまで親階層を歩くことができます。 –

+2

@David:階層の一番上が見つかるまで(Parent = nil)と言います。フォームは、フォーム内のフレーム内のフォーム内のフレーム内に埋め込むことができます。 –

+0

@マージャン良い点。 –

答えて

3

グローバルScreen変数は、すべてのフォームを追跡します。 Screen.ActiveCustomFormは、フォーカスを持つフォームを指し、Screen.OnActiveFormChangeは、フォーカスが別のフォームに変わるたびに発生するイベントです。イベントハンドラでプロパティを更新することができます。

type 
    TMainForm = class(TForm) 
    ... 
    private 
    procedure ActiveFormChanged(Sender: TObject); 
    end; 

procedure TMainForm.FormCreate(Sender: TObject); 
begin 
    Screen.OnActiveFormChange := ActiveFormChanged; 
end; 

procedure TMainForm.ActiveFormChanged(Sender: TObject); 
begin 
    { Do what you want to do } 
end; 
5

ActiveMDIChildプロパティは、探しているプロパティですか?

+0

あなたの入力していただきありがとうございます。うまくいけばそれをあまり曖昧にしないための質問... – PDM

関連する問題