2017-06-09 9 views
1

私はこの投稿から次のコードを使用しています。 Code from Checked AnswerLazarusカーソル下のコントロールを見つける

複数のTLabelのうちの1つからマウスカーソルの下にControl(Label.Caption)を取得する必要があります。LabelがM​​ain Fromにあったときにうまくいきました。私はメインフォーム上のパネルにラベルを貼りましたが、これはパネルを見つけるだけです。私はこれがパネル上にある多数のラベルのうち、いくつかの選択されたラベルでしか動作しないようにしたい。

「Bring To Front」としてラベルのZオーダーを変更しようとしましたが、違いはなく、まだパネルがあります。パネル上にあるので、カーソルの下のラベルを再度見つける方法はありますか?

LazarusはFindVCLWindowまたはObjectAtPointを持っていないようです。

procedure TForm1.Button1Click(Sender: TObject); 
var 
    ctrl : TControl; 
    point : TPoint; 
begin 
    point := Mouse.CursorPos; // Mouse pos at screen 
    Dec(point.X, Left); // Adjust for window. 
    Dec(point.Y, Top); 
    Dec(point.Y, GetSystemMetrics(SM_CYCAPTION)); // Adjust to client area. 

    ctrl := ControlAtPos(point, True, True, True); 

    // I added the following 
    tStr:=ctrl.Name; // DEBUG: This now shows "Panel2" 
    aStr:=(ctrl as TLabel).Caption; // This used to work 

end; 

答えて

2

試してみてください。

procedure TForm1.Button1Click(Sender: TObject); 
var 
    ctrl: TControl; 
    pt: TPoint; 
begin 
    pt := ScreenToClient(Mouse.CursorPos); 
    ctrl := ControlAtPos(pt, [capfRecursive, capfAllowWinControls]); 
    if Assigned(ctrl) then 
     Caption := ctrl.Name 
    else 
     Caption := Format('%d, %d', [pt.x, pt.y]); 
end; 
+0

素晴らしい、ありがとうございました。それはパネル上でうまく動作します。 – X10WannaBe

関連する問題