我之前关于这个问题的问题格式很差,所以我决定删除之前的问题,用一个更好(更小)的例子重新提出它。
我在**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.
我希望这次我能写出一个格式正确的问题。谢谢你的帮助(请原谅我在提问方面缺乏专业知识)。
2条答案
按热度按时间qfe3c7zg1#
当我尝试它时(也是用 Delphi 10. 4),弹出菜单如预期的那样在光标位置打开。
然而,它只在右击面板时出现,因为
TLayout
忽略鼠标点击。要改变这一点,请选中对象检查器中的HitTest
框。然后您也可以在TLayout
上弹出菜单。此外,如果您希望弹出菜单在窗体上的任何位置都有效,则应该让
TLayout
填充窗体。最好将其Align
属性设置为Client
或Contents
。尽管即使这样,右键单击另一个控件时它仍然不起作用,如按钮(除非还将控件的PopupMenu
属性设置为弹出菜单)。luaexgnf2#
我已经厌倦了与这个问题作斗争,这可能与无数的可能性有关。事实上,我的 Delphi 10.4.2安装与你们的安装不同,这让我认为我的安装可能有一些损坏或损坏。我会重复安装,一旦我有时间这样做。所以我自己创建了一个弹出菜单类,它在我需要的所有情况下都能很好地工作,而且它不到200行代码,包括弹出元素的声明。让我对Philip J. Rayment和Tom Brunberg说一句非常感谢的话,感谢你们的大力支持。