代码之家  ›  专栏  ›  技术社区  ›  HeartWare

动态创建的FireMonkey TPopupMenu不会弹出

  •  1
  • HeartWare  · 技术社区  · 6 年前

    启动一个新的多设备应用程序并在其上放置一个按钮。在窗体中声明成员变量 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;
    

    TMenuItem ).

    它应该弹出一个菜单,当你点击按钮,但它没有(实际上,它有点-它弹出一个0像素宽的弹出菜单,你可以验证按钮不会“发光”当你移动鼠标在它上面,直到你点击某个地方“关闭”这个(看不见的)弹出菜单)。

    POP.PopUp )它转移了 t菜单项 进入新的弹出菜单类型,并开始计算弹出菜单的大小。但是当它在项目上迭代时,它跳过了处理菜单项文本宽度的部分(没有“TextObject”,即NIL)。

    如果我在VCL中做类似的代码,它工作得很好,那么在FMX中有什么不同使它不能工作呢?我需要“承诺”这项任务吗 TPopupMenu

    1 回复  |  直到 6 年前
        1
  •  3
  •   Tom Brunberg    6 年前

    FMX TPopupMenu 必须有 PopupComponent 或者 Parent 属性集,在调用时变为可见。由于要创建一个不绑定到任何特定控件的弹出菜单作为控件弹出菜单(通过右键单击使其可见),因此必须指定其

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

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