禁用默认的PopUp(上下文)菜单

时间:2015-01-01 03:45:34

标签: delphi firemonkey delphi-xe7

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

在VCL中,您可以轻松地在ContextPopup中设置Handled := truelink

不幸的是,这个事件在FMX中并不存在。

有没有办法在Firemonkey中实现这个目标?

1 个答案:

答案 0 :(得分:2)

您可以通过向表单添加(无菜单项)TPopupMenu并将其分配给TEdit.PopupMenu来阻止默认popoup菜单。

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

增强功能是定义一个新的TPopupMenu类,您可以使用该类控制是否启用弹出窗口:

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()的调用,如果没有启用,则会有效地阻止弹出窗口。