Файл vih:
Код: Выделить всё
#ifndef __MenuHelper_vih__
#define __MenuHelper_vih__
ObjInterface ObjMenuBuilder;
  #doc
    Назначение:
       Создать построителя динамического меню.
    Параметры:
       p_NameMenu - имя меню (с указанием компоненты), на основе которого будет построено дин. меню
  #end
  function buildDynMenu(p_NameMenu: string[80]) : objMenuBuilder;
  #doc
    Назначение:
       Добавить пункт в меню
    Параметры:
       p_NameItem - имя пункта
       p_Command - команда
  #end
  function addItem(p_NameItem: string[80]; p_Command: word) : objMenuBuilder;
  #doc
    Назначение:
       Добавить разделитель в меню
  #end
  function addSeparator : objMenuBuilder;
  #doc
    Назначение:
       Добавить в меню подменю
    Параметры:
       p_SubMenuName - имя добавляемого подменю (с указанием компоненты)
       p_MainMenuItem - пункт меню, отображаемый в главном меню
  #end
  function addSubMenu(p_SubMenuName, p_MainMenuItem: string[80]) : objMenuBuilder;
  #doc
    Назначение:
       Получить ссылку на меню
  #end
  function getMenu: longint;
  #doc
    Назначение:
       Проверка, не освобожден ли на данный момент хендл меню
  #end
  function isDispose: boolean;
  #doc
    Назначение:
       Сохранить меню и освободить хендл
  #end
  procedure storeAndDispose ;
end;
#doc
  Функции для работы с меню
#end
VipInterface MenuHelper Licensed(Free);
static:
  public function  DynMenuExist(p_NameMenu : string[80]): boolean;
  public function  GetDynMenuBuilder(p_NameMenu: string[80]): objMenuBuilder;
  public procedure DeleteAllDynMenuFromComponent(p_NameComp: string[80]);
end;
VipInterface MenuBuilder implements ObjMenuBuilder  Licensed(Free);
#endifКод: Выделить всё
#include MenuHelper.vih
Interface MenuHelper ;
const
  MENU_PREFFIX : string[5] = 'MENU ';
end;
create view
from
 X$Resources
;
public function DynMenuExist(p_NameMenu : string[80]): boolean;
{
   p_NameMenu := MENU_PREFFIX + p_NameMenu;
   result := (RecordExists  X$Resources where (( 3 ==  X$Resources.XR$Type and p_NameMenu == X$Resources.XR$Name))
              = tsOk)
}
public function GetDynMenuBuilder(p_NameMenu: string[80]): objMenuBuilder;
{
   var menuBuilder : MenuBuilder new ;
   result := menuBuilder.buildDynMenu(p_NameMenu);
}
public procedure DeleteAllDynMenuFromComponent(p_NameComp: string[80]);
{
   p_NameComp := MENU_PREFFIX + p_NameComp + '::%' ;
   delete x$Resources where ((3 ==  X$Resources.XR$Type))
          and X$Resources.XR$Name like p_NameComp;
}
end.
interface MenuBuilder;
var
  m_Menu: longint;
  m_MenuName   : string[80];
  m_isDispose  : boolean;
create view;
HandleEvent
  cmOnVipLoad:
   {
      m_Menu := 0;
      m_MenuName    := '';
      m_isDispose   := false;
   }
end;
function buildDynMenu(p_NameMenu: string[80]) : objMenuBuilder;
{
   if (m_Menu = 0)
   {
     m_MenuName := p_NameMenu;
     DeleteMenuHowDynamics (m_MenuName);
     m_Menu := LoadMenuEx (m_MenuName, true, false);
     m_isDispose   := false;
   }
   result := objMenuBuilder(self);
}
function addItem(p_NameItem: string[80]; p_Command: word) : objMenuBuilder;
{
   if (m_Menu != 0)
      AddMenuItem(m_Menu, p_NameItem, p_Command );
   result := objMenuBuilder(self);
}
function addSeparator : objMenuBuilder;
{
   if (m_Menu != 0)
      AddMenuItem(m_Menu, 'separator', 666 );
   result := objMenuBuilder(self);
}
function addSubMenu(p_SubMenuName, p_MainMenuItem: string[80]) : objMenuBuilder;
{
   if (m_Menu != 0)
      AddSubMenuDynamic(m_Menu, p_SubMenuName, p_MainMenuItem, '', '');
   result := objMenuBuilder(self);
}
function getMenu: longint;
{
   result := m_Menu;
}
function isDispose: boolean;
{
   result := m_isDispose;
}
procedure storeAndDispose ;
{
   if (m_Menu != 0)
    {
       StoreMenuHowDynamics (m_Menu, m_MenuName);
       DisposeLoadMenu (m_Menu);
       ReinitHeaderMenu;
       m_isDispose := true;
    }
}
end.Код: Выделить всё
#include MenuHelper.vih
#Component "L_KATORG"
alter interface KATORG;
Window WKATORG
HandleEvent
cmValue41:
{
  Message('!');
};
end
end;
HandleEvent
cmInit :
{
  if (Inherited::HandleEvent(cmInit) != heOk)
  {
    Abort;
    Exit;
  }
  if (not MenuHelper::DynMenuExist('L_KATORG::mnuKatOrgEdit'))
    if (Message('Изменить меню?', Confirmation + YesNo
               )
         = cmYes
         )
     {
         MenuHelper::GetDynMenuBuilder('L_KATORG::mnuKatOrgEdit')
           .addSeparator()
           .addItem('Дополнительный пункт 1', cmValue41)
           .addItem('Дополнительный пункт 2', cmValue41)
           .storeAndDispose();
     }
};//cmInit
end;
end.