Как определить всплывающее окно подменю всплывающего меню (и как его заполнить динамически)? - PullRequest
4 голосов
/ 11 мая 2010

У меня есть всплывающее меню, которое содержит несколько пунктов меню, и один из них может иметь дочерние элементы. Эта запись имеет маленькую стрелку справа, и когда вы наводите , наведите на нее курсор мыши, откроется подменю (без щелчка) Теперь я хочу заполнить это подменю во время выполнения, но только если пользователь действительно открывает его. Если пользователь никогда не открывает подменю, оно будет пустым (возможно, содержит заполнитель). Как я мог сделать это? Можно ли изменить всплывающее меню, когда оно уже отображается?

Спасибо за вашу помощь!

1 Ответ

10 голосов
/ 11 мая 2010

Нет никакой разницы между подменю в стандартных меню или контекстных (всплывающих) меню: если к пункту меню прикреплено подменю, его событие OnClick сработает непосредственно перед отображением подменю (обратите внимание, что вам не нужно щелкните, чтобы он появился), и в этом обработчике событий вы можете изменить подменю (либо установить свойства существующих элементов, либо добавить новые элементы / удалить существующие элементы).

Демонстрационный код о динамическом добавлении и удалении элементов:

procedure TForm1.FormCreate(Sender: TObject);
var
  Popup: TPopupMenu;
  Item, SubItem: TMenuItem;
begin
  Popup := TPopupMenu.Create(Self);
  PopupMenu := Popup;
  Item := TMenuItem.Create(Popup);
  Item.Caption := 'Test submenu';
  Item.OnClick := PopupClick;
  Popup.Items.Add(Item);

  SubItem := TMenuItem.Create(Item);
  SubItem.Caption := 'dummy';
  Item.Add(SubItem);
end;

procedure TForm1.PopupClick(Sender: TObject);
var
  SubmenuItem, Item: TMenuItem;
begin
  SubmenuItem := Sender as TMenuItem;
  // delete old items (leave at least one to keep the submenu)
  while SubmenuItem.Count > 1 do
    SubmenuItem.Items[SubmenuItem.Count - 1].Free;
  // create new items
  while SubmenuItem.Count < 3 do begin
    Item := TMenuItem.Create(SubmenuItem);
    Item.Caption := Format('new item created %d', [GetTickCount]);
    SubmenuItem.Add(Item);
  end;
end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...