动态创建的FireMonkey TPopupMenu不会弹出

问题描述 投票:1回答:1

启动一个新的多设备应用程序并在其上放置一个按钮。以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)它将TMenuItems转换为新的弹出菜单类型,并开始计算弹出窗口的大小。但是当它遍历项目时,它会跳过处理菜单项文本宽度的部分(没有“TextObject”,即它是NIL)。

如果我在VCL中执行类似的代码它可以正常工作,那么FMX中的不同之处在于它不起作用?我是否需要“提交”TPopupMenu更改或什么?

delphi firemonkey delphi-10.2-tokyo
1个回答
2
投票

FMX框架中,TPopupMenu需要具有PopupComponentParent属性集,在被调用时变得可见。由于您要创建一个与任何特定控件无关的弹出菜单,因为它控制弹出菜单(通过右键单击可见),您必须指定其Parent属性:

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

请注意,尽管父设置,传递给POP.Popup()的坐标仍是屏幕坐标。

© www.soinside.com 2019 - 2024. All rights reserved.