Как динамически создавать пункты подменю в PopupMenu
procedure TForm1.PopupMenu2Popup(Sender: TObject);
var
mi, msub: TmenuItem;
beginwith (Sender as TPopupMenu) dobegin// Удаляем все пункты меню// while Items.Count > 0 do Items.delete(0);// Предыдущий код имел утечку памяти. Коррекция от Andrew Stewart (astewart@Strobes.co.nz)while Items.Count > 0 do
Items[0].Free;
// Создаем обычный пункт "Первый"
mi := TMenuItem.Create(self);
with mi dobegin
Caption := 'Первый';
OnClick := MyClick;
end;
Items.Insert(0, mi);
// Создаем подменю "Подменю" c двумя пунктами "Подменю1" и// "Подменю2"
mi := TMenuItem.Create(self);
with mi dobegin
Caption := 'Подменю';
msub := TMenuItem.Create(self);
with msub dobegin
Caption := 'Подменю1';
OnClick := MyClick;
end;
Insert(0, msub);
msub := TMenuItem.Create(self);
with msub dobegin
Caption := 'Подменю2';
OnClick := MyClick;
end;
Insert(1, msub);
end;
Items.Insert(1, mi);
end;
end;
procedure TForm1.MyClick(Sender: TObject);
begin
beep;
end;
Переданный код создает динамически меню.popup, вставляя элементы и подэлементы в свойство Items компонента TPopupMenu. Однако, это подход имеет некоторые ограничения:
Он создает новые экземпляры класса TMenuItem для каждого элемента и подэлемента, что может привести к утечкам памяти, если не будет правильно освобождаться.
Код тесно связан с UI-компонентами, что делает его трудным для повторного использования или изменения.
Чтобы создавать динамически меню.popup элементы более эффективно, рекомендуется использовать иерархическую структуру данных (например, дерево) для хранения элементов меню и их отношений. Затем можно проходить по этой структуре при отображении меню.
Альтернативный подход:
Создайте класс TMenuItem, который обертывает свойства элемента меню (например, заголовок, обработчик события клика и т.д.).
Создайте список или массив для хранения этих объектов TMenuItem.
Проходите по этому списку при отображении меню и вставляйте каждый элемент в свойство Items.
Пример реализации:
typeTMenuItem=classprivateFCaption:string;FOnClick:TNotifyEvent;publicconstructorCreate(Caption:string;OnClick:TNotifyEvent);procedureInsertIntoMenu(PopupMenu:TPopupMenu);end;constructorTMenuItem.Create(Caption:string;OnClick:TNotifyEvent);beginFCaption:=Caption;FOnClick:=OnClick;end;procedureTMenuItem.InsertIntoMenu(PopupMenu:TPopupMenu);varmi:TMenuItem;beginmi:=TMenuItem.Create(FCaption,FOnClick);PopupMenu.Items.Add(mi);end;// Использование:varpopupMenu:TPopupMenu;menuItems:array[0..2]ofTMenuItem;begin// Создайте меню.popuppopupMenu:=TPopupMenu.Create(self);// Создайте элементы менюfori:=Low(menuItems)toHigh(menuItems)domenuItems[i]:=TMenuItem.Create('Item '+IntToStr(i),MyClick);// Вставьте элементы меню в меню.popupfori:=Low(menuItems)toHigh(menuItems)domenuItems[i].InsertIntoMenu(popupMenu);end;
В этом примере TMenuItem обертывает свойства элемента меню и предоставляет метод InsertIntoMenu, чтобы добавить себя в меню.popup. Список объектов TMenuItem создается динамически и затем вставляется в меню.popup.
Обратите внимание, что этот подход отделяет создание и управление элементами меню от UI-компонентов, что делает его более гибким и повторно используемым.
Динамически создавая пункты подменю в PopupMenu, можно использовать процедуру TForm1.PopupMenu2Popup(Sender: TObject), которая удаляет все существующие пункты меню, создает новый пункт и подменю с двумя подклассами.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.