SideMenu как компонент прикладника
menu — это компонент в plugin controls, и он в runtime работает как
самостоятельный объект (SideMenu) с коллекцией SideMenuItems и SideMenuItem.
Документ фиксирует именно прикладочные нюансы: что видно в XML, что можно менять
в рантайме и как не словить ... не найден.
Что важно знать сначала
XML атрибуты меню
На узле самого контрола (<menu ...>) поддерживаются:
NoSearch="1|0"— отключить поиск.NoFavorites="1|0"— отключить избранное.Mode="Full|Compact"— режим отображения.Background="0xRRGGBB"— фоновый цвет.Items="..."(опционально) — XML текст для вложенных элементов.
Если Items отсутствует, контроль ищет вложенные Popup/Item прямо внутри узла.
Элементы меню
<Item .../><Popup ...>...</Popup><Separator/>
Атрибуты Item/Popup:
TextилиCaption— подпись,Name— имя пункта,Command— имя обработчика,Image— id иконки,Visible—0|1,Enabled—0|1,Expanded(для popup) — раскрыт/свёрнут.
Пример:
<menu NoSearch="1" Mode="Full">
<Items>
<Popup Text="Задачи">
<Item Text="Общий список" Name="taskReference" Command="OnTaskReferenceClick"/>
<Item Text="Мои задачи" Name="MyTaskReference" Command="OnMyTaskReferenceClick"/>
</Popup>
<Separator/>
<Item Text="Настройки" Command="OnSettingsClick"/>
</Items>
</menu>
Как формируется имя обработчика
Сейчас реализовано правило:
- если
Commandуже в видеOn...Click, используется как есть, - если
Commandбез префикса/sufix — при необходимости приводится к видуOn<Name>Click. - если
Commandпустой,Nameберется как fallback для команды.
С практической точки зрения:
- лучше указывать явно
Commandв стилеOnXClick, Nameиспользуйте как понятный идентификатор для поиска в коде (SideMenu.Items.Item("X")).
Рантайм API SideMenu
Для объекта menu доступны поля:
Enabled(bool)Items(коллекцияSideMenuItems)ItemCount(число элементов)
Коллекция SideMenuItems:
CountItem(index)Item(string)
SideMenuItem:
Caption/TextVisibleEnabledNameCommandClick()
Сигнатуры и поведение основаны на регистрациях в runtime.
Как использовать программно (Pascal)
Получение по индексу:
Procedure OnX;
Begin
Menu.Items.Item(0).Caption := 'Новый текст';
Menu.Items.Item(0).Visible := 1;
Menu.Items.Item(0).Enabled := 1;
End;
Получение по имени:
Procedure OnY;
Begin
If Menu.Items.Item('Settings').Name = 'Settings' Then
Menu.Items.Item('Settings').Command := 'OnSettingsClick';
End;
Вызов обработчика:
Procedure OnZ;
Begin
Menu.Items.Item('taskReference').Click;
End;
Диагностика SideMenu.Command: ... не найден
Это сообщение появляется когда:
Commandпустой/невалидный,- указанное имя обработчика отсутствует в скрипте,
- расхождение регистра/опечатка.
Правильный путь:
- Проверьте
Commandна каждомItem. - Убедитесь, что в
program.pasобъявленProcedure <Command>;илиProcedure <OnNameClick>;. - Для контролов без
CommandпроверяйтеNameи правило автогенерации.
Что делает редактор (важное)
В редакторской форме меню можно:
- перетаскивать узлы,
- задавать иерархию
Popup/Item, - настраивать
Command/Name.
По сути это статическая редакторская форма над тем же XML.
Когда меню «не работает как будто»
- Если
Commandв runtime перерисовывается/теряется — проверьте не дублируются ли обработчики между модулями. - Если у пункта только стрелка/иконка, но нет действия — это корректно для
Popup(разделитель-узел). Действия должны вешаться наItem. - Если в коде используется
menu.Command = ...(не существующий API), ничего не произойдет — нуженSideMenuItem.Command.
Параметры отображения, которые обычно путают
- В
Items-режиме важен порядок и уровень вложенности. Popup.Expandedвлияет только на визуальную раскладку, не на обработчики.TextиNameне обязательно совпадают:Nameдля обработки,Textдля UI.