Search code examples
controlslazarusmouse-cursor

Lazarus find control under cursor


I am using the following code from this posting. Code from Checked Answer

I need to get the Control (Label.Caption) under the mouse cursor from one of several TLabel and it worked fine when the Label was on the Main From. I put the Labels on a Panel on the Main form and now this only finds the Panel. I only want this to work on a select few of the Labels of the many that are on the Panel.

I tried changing the Z-Order for the Labels as "Bring To Front" but it made no difference, still got the Panel. How can I again find a Label under the cursor now that they are on the Panel?

Lazarus does not appear to have FindVCLWindow or 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;

Solution

  • Try:

    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;