delphi - 动态创建的 FireMonkey TPopupMenu 不弹出
问题描述
启动一个新的多设备应用程序并在其上放置一个按钮。在表单中声明一个成员变量POP: TPopupMenu
。双击按钮并在事件中插入以下代码:
var
MI : TMenuItem;
I : Cardinal;
begin
FreeAndNIL(POP); // POP is a member variable of the form
POP:=TPopupMenu.Create(Self);
FOR I:=1 TO 10 DO BEGIN
MI:=TMenuItem.Create(POP);
MI.Text:=IntToStr(I);
MI.OnClick:=Button1Click;
POP.AddObject(MI)
END;
POP.Popup(100,100)
end;
(我知道将 Button1Click 分配给 OnClick 会导致递归调用,但我将其包括在内是为了抢占没有与TMenuItem
.
当您单击按钮时,它应该弹出一个菜单,但它没有(实际上,它有点 - 它会弹出一个 0 像素宽度的弹出菜单,您可以验证按钮不会“发光”时你将鼠标移到它上面,直到你点击某个地方来“关闭”这个(看不见的)弹出菜单)。
我可以看到(如果我追踪到POP.PopUp
)它将TMenuItem
s 转换为新的弹出菜单类型,并开始计算弹出菜单的大小。但是当它遍历项目时,它会跳过处理菜单项文本宽度的部分(没有“TextObject”,即它是 NIL)。
如果我在 VCL 中执行类似的代码,它可以正常工作,那么 FMX 有什么不同导致它不起作用?我需要“提交”TPopupMenu
更改还是什么?
解决方案
在FMX
框架中,aTPopupMenu
需要设置PopupComponent
或设置Parent
属性,以便在调用时变得可见。由于您要创建一个不与任何特定控件绑定的弹出菜单作为控制弹出菜单(通过右键单击使其可见),因此您必须分配其Parent
属性:
POP.Parent := Self; // The form in your example
请注意,POP.Popup()
尽管有父设置,但传递给的坐标是屏幕坐标。
推荐阅读
- c# - ASP.net if else FluentValidation 条件
- mongodb - 启用身份验证后无法从 local.system.replset 中删除文档
- python - Kivy - 保存对象的值在弹出窗口中更改,以便在关闭它后,当我再次打开弹出窗口时,它会以新值打开
- reactjs - 在多个组件上重用相同的 React-Redux 的 useDispatch 是否有效?
- python-3.x - 在 MacO 上卸载 python3
- apache-spark - Helm /bitnami/spark - 如何将文件加载到 extraVolumeMounts?
- rtsp - 如何将(RTSP)rtp数据从流转换为jpg图像
- mysql - 获取在提到的时间段之前不存在的条目的特定日期之间的数据
- amazon-web-services - Terraform 错误“您的查询未返回任何结果”
- python - 应用于索引时,熊猫数据框的“应用”速度很慢