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:

  • Count
  • Item(index)
  • Item(string)

SideMenuItem:

  • Caption / Text
  • Visible
  • Enabled
  • Name
  • Command
  • Click()

Сигнатуры и поведение основаны на регистрациях в 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 пустой/невалидный,
  • указанное имя обработчика отсутствует в скрипте,
  • расхождение регистра/опечатка.

Правильный путь:

  1. Проверьте Command на каждом Item.
  2. Убедитесь, что в program.pas объявлен Procedure <Command>; или Procedure <OnNameClick>;.
  3. Для контролов без Command проверяйте Name и правило автогенерации.

Что делает редактор (важное)

В редакторской форме меню можно:

  • перетаскивать узлы,
  • задавать иерархию Popup/Item,
  • настраивать Command/Name.

По сути это статическая редакторская форма над тем же XML.

Когда меню «не работает как будто»

  • Если Command в runtime перерисовывается/теряется — проверьте не дублируются ли обработчики между модулями.
  • Если у пункта только стрелка/иконка, но нет действия — это корректно для Popup (разделитель-узел). Действия должны вешаться на Item.
  • Если в коде используется menu.Command = ... (не существующий API), ничего не произойдет — нужен SideMenuItem.Command.

Параметры отображения, которые обычно путают

  • В Items-режиме важен порядок и уровень вложенности.
  • Popup.Expanded влияет только на визуальную раскладку, не на обработчики.
  • Text и Name не обязательно совпадают: Name для обработки, Text для UI.