我正在使用此帖子中的以下代码。 Code from Checked Answer
我需要从几个TLabel中的一个获取鼠标光标下的Control(Label.Caption),当Label在Main From上时它工作正常。我将标签放在主窗体上的面板上,现在只能找到面板。我只希望这可以在Panel上许多标签中选择一些标签。
我尝试将标签的Z顺序更改为“带到前面”,但它没有任何区别,仍然有Panel。现在,如果它们在Panel上,我怎么能再次在光标下找到一个Label?
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;
答案 0 :(得分: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;