禁用默认弹出(上下文)菜单
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() 的调用,如果未启用则有效防止弹出窗口。
在 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() 的调用,如果未启用则有效防止弹出窗口。