gpt4 book ai didi

delphi - 动态创建的 FireMonkey TPopupMenu 不弹出

转载 作者:行者123 更新时间:2023-12-01 18:02:58 28 4
gpt4 key购买 nike

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

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

最佳答案

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

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

请注意,无论父设置如何,传递给 POP.Popup() 的坐标都是屏幕坐标。

关于delphi - 动态创建的 FireMonkey TPopupMenu 不弹出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52202953/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com