戻る ホーム 上へ 進む

コントロールを見つける方法

Tip

VCLには座標やウィンドウハンドルをコントロールのオブジェクト参照に変換するルーチンが Controls ユニットにいくつか用意されています。全てヘルプに載っている関数ですが、ヘルプの記述が不十分なので、若干の補足を加えておきました。よく使うので覚えておくと何かと便利です。

 

function FindControl(Handle: HWnd): TWinControl;

FindControlはウィンドウハンドルをウィンドウコントロール(TWinControlから継承するクラス)のオブジェクト参照に変換します。FindControl はこれを呼び出すコードと同じ、スレッド、モジュール(インスタンスハンドル)に属すウィンドウだけをオブジェクト参照に変換します。

サービスアプリケーションでグローバルアトムが破棄された場合はプロセスだけがチェックされます。

 

function FindVCLWindow(const Pos: TPoint): TWinControl;

FindVCLWindow は指定されたスクリーン座標にあるウィンドウコントロールのオブジェクト参照を返します。FindVCLWindow は WindowFromPoint API を使ってスクリーン座標からその下にあるウィンドウのウィンドウハンドルを得て、FindControl関数でオブジェクト参照に変換します。この関数は、表示されていない隠された(Hideされた)ウィンドウや、マウス入力とキーボード入力を無効にされた(Disableされた)ウィンドウを見つけることはできません。

function TWinControl.ControlAtPos(const Pos: TPoint; AllowDisabled,
AllowWinControls: Boolean = false): TControl;

指定された座標にある、ウィンドウコントロールの子コントロールを返します。AllowDisable = True なら、Enabled プロパティが False な子コントロールも見つけられます。AllowWinControl = True なら、子コントロールがウィンドウコントロールでも見つけられます。

function FindDragTarget(const Pos: TPoint; AllowDisabled: Boolean): TControl;

この関数は FindVCLWindow に似ていますが、指定されたスクリーン座標にあるコントロールのオブジェクト参照を返します。つまり、指定された座標の下に非ウィンドウコントロールが有る場合は、非ウィンドウコントロールが戻ります。名前の通り、Drag&Dropでドラッグ先のコントロールを見つけるのに使われるルーチンですが、便利なのでいろいろな処理で使われます。

FindDragTarget はまず FindVCLWindow を使って指定された座標にウィンドウコントロールが有るか調べます。従って、ウィンドウが隠されていたり、Disable されている場合は Nil が戻ります。ウィンドウコントロールが有ったなら、ウィンドウコントロールの ControlAtPosメソッドを使って指定された座標に非ウィンドウコントロールが有るかチェックします。有ればそのコントロールが、なければウィンドウコントロールが返ります。AllowDisable が True の場合、Enableプロパティが False の非ウィンドウコントロールも見つけられます。

解説

Inside VCL の中で説明しましたように、VCL はウィンドウを作るとき、その「プロパティ」にウィンドウコントロールのオブジェクト参照をセットします。従ってウィンドウハンドルからオブジェクト参照を簡単に得ることができます。これを行ってくれるのが FindControl です。

FindControl は VCL が作ったウィンドウを識別するために、ウィンドウに登録された「プロパティ」を使って、ウィンドウを作ったスレッドとモジュール(インスタンスハンドル)を識別します。

従って、パッケージを使わない場合、DLL で作成したウィンドウのウィンドウハンドルをEXE側で FindControl を使ってコントロールの参照に変換することはできません。

パッケージを使うと、ウィンドウはパッケージ(vcl50.bpl, vcl60.bpl)のインスタンスハンドルを使って作られるので、EXE と DLL の双方がパッケージを使用していれば、DLLが作ったウィンドウのウィンドウハンドルをEXEで FindControl を使ってコントロールの参照に変換することtができます。

戻る ホーム 上へ 進む

 

inserted by FC2 system