2017-06-09 72 views
1

我正在使用以下代碼。 Code from Checked AnswerLazarus在光標下找到控件

我需要從幾個TLabel中的一個鼠標光標下獲得控件(Label.Caption),並且它在標籤位於主要From上時工作正常。我將標籤放在主窗體的面板上,現在只能找到面板。我只希望在面板上的衆多標籤中選擇一些。

我試着改變標籤的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

真棒,謝謝。這在Panel上工作得很好。 – X10WannaBe