2017-08-06 1 views
2

次の手順を使用して、Delphi XE3でマウスのコントロールを識別しています。すべてはvcl.contolsのためにうまくいきます。ただし、マウスがTImageを超えると、コントロール名は返されません。マウスカーソルの下にあるコンポーネントを識別するには、TImageコントロールでは機能しません。

procedure TMainForm.ApplicationEvents1Idle(Sender: TObject; var Done: oolean);  
var 
    ctrl : TWinControl; 
begin  
    ctrl := FindVCLWindow(Mouse.CursorPos);  
    if ctrl <> nil then begin  
    Label2.caption := ctrl.Name;  
    //do something if mouse is over TLabeledEdit  
    if ctrl is TLabeledEdit the begin  
     Caption := TLabeledEdit(ctrl).Text;  
    end; 
    end; 
end; 

TImageの名前にアクセスするための簡単な方法がある - 私は何かが本当に簡単行方不明ですか?

+0

として再宣言しなければならないことに注意してください、私が持っているのTControl – WobblyBob

+0

を使用例を探した - FindDragTarget(constの順位:TPoint; AllowDisabled:ブール):TControlの しかし、一つを見つけることができませんでした:( は誰が正しい方向に私を指すか、任意のOBJなどの例を提供することができますects/itemsを 'uses'セクションに追加する必要がありますか? – WobblyBob

+3

私の友好的なアドバイスは、「コピー貼り付けプログラマー」をやめることです。ドキュメントを読んで考えてみてください。 'FindVCLWindow()'がなぜあなたのために機能しないのか、そして代わりに何の機能を使うべきなのかが分かっています。関数が何を返すのか知っていれば、 'ctrl'変数をその型に変更します。あなたがそれを推測できない場合、追加の 'AllowDisabled'パラメータが何を意味するのかを見てください。 –

答えて

4

FindVCLWindowは、TWinControlの子孫を見つける。 TImageはウィンドウコントロールではなく、TWinControlから継承しないため、FindVCLWindowはそれを見つけることができません。祖先のなかでTWinControlクラスを持たない他のコントロールを見つけることができないように。

ただし、ウィンドウ以外のものも含め、すべてのVCLコントロールを返す同じ機能があります。FindDragTargetAllowDisabledそれが無効にコントロールを返したりしませんかどうかを制御 -

この機能は、それは追加の引数を持っているだけでFindVCLWindow

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

のように、Vcl.Controlsで宣言されています。

次のようにあなたの方法を書き換える必要があります - FindDragTarget(constの順位:TPoint; AllowDisabled:ブールの): - 私は使用例を探していますctrlTControl

procedure TMainForm.ApplicationEvents1Idle(Sender: TObject; var Done: Boolean); 
var 
    ctrl : TControl; 
begin 
    ctrl := FindDragTarget(Mouse.CursorPos, true); 
    if ctrl <> nil then 
    begin 
     Label2.caption := ctrl.Name; 
     ... 
    end; 
end; 
+0

ありがとうDalija - 私の問題は修正されました - あなたは星です;) – WobblyBob

関連する問題