【问题标题】:Disable default PopUp (Context) Menu禁用默认弹出(上下文)菜单
【发布时间】:2015-01-01 03:45:33
【问题描述】:

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

在 VCL 中,您可以轻松地在 ContextPopup (link) 中设置 Handled := true

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

有没有办法在 Firemonkey 中存档?

【问题讨论】:

    标签: delphi firemonkey delphi-xe7


    【解决方案1】:

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

    TStyledEdit 内部检查(在 TStyledEdit.ShowContextMenu() 中)是否 PopupMenu 属性不为零,如果是,则显示用户定义的弹出菜单,否则显示默认弹出菜单。然而,这有一个效果,如果右键单击 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() 的调用,如果未启用,则有效地阻止弹出窗口。

    【讨论】:

      猜你喜欢
      • 2017-11-08
      • 1970-01-01
      • 2012-11-13
      • 2012-05-06
      • 2019-11-21
      • 1970-01-01
      • 1970-01-01
      • 2019-01-24
      • 1970-01-01
      相关资源
      最近更新 更多