禁用默认弹出(上下文)菜单

Disable default PopUp (Context) Menu

在 Delphi XE7 Firemonkey 项目中,我想阻止当用户在控件上按下鼠标右键时显示​​的默认弹出菜单。

在 VCL 中,您可以轻松地在 ContextPopup (link)

中设置 Handled := true

很遗憾,FMX 中不存在此事件。

有什么方法可以在 Firemonkey 中实现这个吗?

您可以通过向表单添加 empty(无菜单项)TPopupMenu 并将其分配给 TEdit.PopupMenu.[=11= 来阻止默认弹出菜单]

内部 TStyledEdit 检查(在 TStyledEdit.ShowContextMenu() 中)PopupMenu 属性 是否不为零,如果是,则显示用户定义的弹出菜单,否则显示默认弹出菜单。但是,这有一个效果,如果右键单击 TEdit,它会中断编辑,因为弹出菜单仍会进入其自己的消息循环。因此,用户必须按 Esc 键或左键单击才能继续编辑。

一个改进是定义一个新的 TPopupMenu class,您可以使用它来控制是否启用弹出窗口:

type
  TPopupMenu = class(FMX.Menus.TPopupMenu)
  private
    FEnabled: boolean;
  public
    procedure Popup(X, Y: Single); override;
    property Enabled: boolean read FEnabled Write FEnabled;
  end;

  TForm5 = class(TForm)
    Edit1: TEdit;
    PopupMenu1: TPopupMenu;
    MenuItem1: TMenuItem;
    MenuItem2: TMenuItem;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;


implementation

{$R *.fmx}

procedure TForm5.FormCreate(Sender: TObject);
begin
  PopupMenu1.Enabled := true;
end;

{ TPopupMenu }

procedure TPopupMenu.Popup(X, Y: Single);
begin
  if FEnabled then
    inherited;
end;

拦截对 Popup() 的调用,如果未启用则有效防止弹出窗口。