动态创建的 FireMonkey TPopupMenu 不会弹出

Dynamically created FireMonkey TPopupMenu doesn't Pop Up

启动一个新的多设备应用程序并在其上放置一个按钮。以 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 像素宽度的弹出菜单,你可以验证按钮没有' t "glow" 当你将鼠标移到它上面时,直到你点击某个地方 "close" 这个(看不见的)弹出菜单。

我可以看到(如果我追踪到 POP.PopUp)它将 TMenuItem 转换为新的弹出菜单类型,并开始计算弹出菜单的大小。但是当它遍历项目时,它会跳过处理菜单项文本宽度的部分(没有 "TextObject",即它是 NIL)。

如果我在 VCL 中执行类似的代码它工作正常,那么 FMX 中有什么不同导致它不起作用?我需要 "commit" TPopupMenu 更改还是什么?

FMX 框架中,TPopupMenu 需要设置 PopupComponentParent 属性 集,以便在调用时可见。由于您想创建一个不与任何特定控件绑定的弹出菜单作为控件弹出菜单(通过右键单击可见),您必须为其分配 Parent 属性:

POP.Parent := Self; // The form in your example

请注意,传递给 POP.Popup() 的坐标是屏幕坐标,与父级设置无关。