启动一个新的多设备应用程序,并在其上放置一个按钮。以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
更改还是什么?
1条答案
按热度按时间zbsbpyhn1#
在
FMX
框架中,TPopupMenu
需要设置PopupComponent
或Parent
属性,才能在调用时可见。由于要创建一个不与任何特定控件绑定的弹出式菜单,作为控制弹出式菜单(通过右键单击使其可见)的,因此必须分配其Parent
属性:注意,不管父设置如何,传递到
POP.Popup()
的坐标都是屏幕坐标。