Динамически создаваемый FireMonkey TPopupMenu не всплывает - PullRequest
0 голосов
/ 06 сентября 2018

Запустите новое приложение для нескольких устройств и поместите на него кнопку. Объявите переменную-член в форме 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 изменения или как?

1 Ответ

0 голосов
/ 07 сентября 2018

В платформе FMX для TPopupMenu должно быть установлено либо свойство PopupComponent, либо Parent, чтобы оно стало видимым при вызове. Поскольку вы хотите создать всплывающее меню, которое не привязано к какому-либо конкретному элементу управления, как всплывающее меню, которое управляет всплывающим меню (отображается правой кнопкой мыши), вы должны назначить его свойство Parent:

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

Обратите внимание, что координаты, переданные в POP.Popup(), являются экранными координатами, несмотря на родительскую настройку.

...