在Delphi XE7 Firemonkey项目中,我想阻止当用户在控件上按下鼠标右键时显示的默认弹出菜单。
在VCL中,您可以轻松地在ContextPopup中设置Handled := true
(link)
不幸的是,这个事件在FMX中并不存在。
有没有办法在Firemonkey中实现这个目标?
答案 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()的调用,如果没有启用,则会有效地阻止弹出窗口。