Firemonkey Delphi 10.4中TPopupMenu定位的一个问题

vsaztqbk  于 2023-03-08  发布在  其他
关注(0)|答案(2)|浏览(216)

我之前关于这个问题的问题格式很差,所以我决定删除之前的问题,用一个更好(更小)的例子重新提出它。
我在**Firemonkey( Delphi 10.4)**中遇到了TPopupMenu组件的一个非常奇怪的行为。为了模拟这个问题,我创建了一个FORM并放置了:
1.窗体上的TPopupMenu组件,并分配了几个项
1.上面的TLayout(Firemonkey中的FORM没有PopupMenu属性)
1.出于同样的原因,使用PopupMenu1作为属性
1.一个T按钮在表单的中心嗯,它发生了,只有几次右键按下弹出菜单出现,当它出现时,它是远离鼠标光标。有什么分配必须做之前,“弹出”弹出窗口?我做错了什么?我搜索了Embarcadero文档没有成功。我已经准备了一点代码。
这是单位的代码:

unit MainUnitTestPopup;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
  FMX.Controls.Presentation, FMX.StdCtrls, FMX.Layouts, FMX.Menus;

type
  TForm2 = class(TForm)
    Layout1: TLayout;
    Button1: TButton;
    PopupMenu1: TPopupMenu;
    MenuItem1: TMenuItem;
    MenuItem2: TMenuItem;
    Panel1: TPanel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

{$R *.fmx}

procedure TForm2.Button1Click(Sender: TObject);
begin
   Application.Terminate;
end;

end.

这是FORM的文本代码

object Form2: TForm2
  Left = 0
  Top = 0
  Caption = 'Form2'
  ClientHeight = 480
  ClientWidth = 640
  FormFactor.Width = 320
  FormFactor.Height = 480
  FormFactor.Devices = [Desktop]
  DesignerMasterStyle = 0
  object Layout1: TLayout
    PopupMenu = PopupMenu1
    Size.Width = 177.000000000000000000
    Size.Height = 480.000000000000000000
    Size.PlatformDefault = False
    TabOrder = 0
    object Button1: TButton
      Position.X = 216.000000000000000000
      Position.Y = 168.000000000000000000
      Size.Width = 185.000000000000000000
      Size.Height = 65.000000000000000000
      Size.PlatformDefault = False
      TabOrder = 0
      Text = 'CLICK ME!'
      OnClick = Button1Click
    end
  end
  object Panel1: TPanel
    PopupMenu = PopupMenu1
    Position.X = 176.000000000000000000
    Position.Y = 232.000000000000000000
    Size.Width = 465.000000000000000000
    Size.Height = 257.000000000000000000
    Size.PlatformDefault = False
    TabOrder = 2
  end
  object PopupMenu1: TPopupMenu
    Left = 520
    Top = 56
    object MenuItem1: TMenuItem
      Text = 'MenuItem1'
      object MenuItem2: TMenuItem
        Locked = True
        Text = 'MenuItem2'
      end
    end
  end
end

这是这个项目的代码

program TestPopupProject;

uses
  System.StartUpCopy,
  FMX.Forms,
  MainUnitTestPopup in 'MainUnitTestPopup.pas' {Form2};

{$R *.res}

begin
  Application.Initialize;
  Application.CreateForm(TForm2, Form2);
  Application.Run;
end.

我希望这次我能写出一个格式正确的问题。谢谢你的帮助(请原谅我在提问方面缺乏专业知识)。

qfe3c7zg

qfe3c7zg1#

当我尝试它时(也是用 Delphi 10. 4),弹出菜单如预期的那样在光标位置打开。
然而,它只在右击面板时出现,因为TLayout忽略鼠标点击。要改变这一点,请选中对象检查器中的HitTest框。然后您也可以在TLayout上弹出菜单。
此外,如果您希望弹出菜单在窗体上的任何位置都有效,则应该让TLayout填充窗体。最好将其Align属性设置为ClientContents。尽管即使这样,右键单击另一个控件时它仍然不起作用,如按钮(除非还将控件的PopupMenu属性设置为弹出菜单)。

luaexgnf

luaexgnf2#

我已经厌倦了与这个问题作斗争,这可能与无数的可能性有关。事实上,我的 Delphi 10.4.2安装与你们的安装不同,这让我认为我的安装可能有一些损坏或损坏。我会重复安装,一旦我有时间这样做。所以我自己创建了一个弹出菜单类,它在我需要的所有情况下都能很好地工作,而且它不到200行代码,包括弹出元素的声明。让我对Philip J. RaymentTom Brunberg说一句非常感谢的话,感谢你们的大力支持。

相关问题