You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FireMonkey中TPopupMenu弹出位置偏离鼠标光标问题求助

Delphi 10.4 FireMonkey TPopupMenu 弹出位置偏移问题的解决方法

问题原因

在FireMonkey环境中,将TPopupMenu直接绑定到TTabControl这类容器组件的PopupMenu属性时,菜单弹出位置偏离鼠标光标,核心原因是FMX的坐标转换逻辑缺陷:

  • 绑定组件的PopupMenu会默认基于该组件的客户端坐标计算弹出位置,但TTabControl的客户端区域仅包含标签页的内容部分,不覆盖顶部标签栏区域;
  • 若表单存在DPI适配、缩放或组件嵌套层级,全局屏幕坐标到组件局部坐标的转换会出现偏差,而只读属性PopupPoint无法直接修正该偏移。

解决方法

放弃直接绑定PopupMenu属性,通过组件的OnMouseDown事件手动触发菜单,基于屏幕坐标直接弹出,绕过FMX的坐标转换bug。

代码示例

假设测试项目中有TabControl1(TTabControl)和PopupMenu1(TPopupMenu):

procedure TForm1.TabControl1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Single);
var
  ScreenPos: TPointF;
begin
  if Button = mbRight then
  begin
    // 获取鼠标当前屏幕坐标
    ScreenPos := Mouse.CursorPos;
    // 基于屏幕坐标直接弹出菜单
    PopupMenu1.Popup(ScreenPos);
  end;
end;

补充说明

  • 若需要区分点击区域(标签栏/内容区),可通过TabControl1.HitTest(X, Y)获取点击元素类型后再做对应处理;
  • 该方案同样适用于TScrollBox、TPageControl等其他FMX容器组件的PopupMenu偏移问题。

内容的提问来源于stack exchange,提问作者Sergio Bonfiglio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 09:02:35