| 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ができます。