delphi 动态创建的FireMonkey TPopupMenu不弹出

k4emjkb1  于 2023-03-08  发布在  其他
关注(0)|答案(1)|浏览(185)

启动一个新的多设备应用程序,并在其上放置一个按钮。以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;

(我知道将Button 1Click赋值给OnClick将导致递归调用,但我将其包括在内是为了避免暗示没有与TMenuItem关联的事件)。
当你点击按钮时,它应该弹出一个菜单,但它没有(实际上,它有点弹出--它弹出了一个0像素宽的弹出菜单,你可以验证当你把鼠标移到按钮上时,按钮不会“发光”,直到你点击了某个地方“关闭”这个(看不见的)弹出菜单)。
我可以看到(如果我跟踪POP.PopUp)它将TMenuItem转换成一个新的弹出菜单类型,并开始计算弹出菜单的大小,但是当它遍历菜单项时,它跳过了处理菜单项文本宽度的部分(没有“TextObject”,即它是NIL)。
如果我在VCL中做类似的代码,它工作正常,那么在FMX中有什么不同使它不能工作呢?我需要“提交”TPopupMenu更改还是什么?

zbsbpyhn

zbsbpyhn1#

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

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

注意,不管父设置如何,传递到POP.Popup()的坐标都是屏幕坐标。

相关问题