Страница 1 из 1

Динамическое формирование локального меню стандартных интерф

Добавлено: 21 июл 2009, 17:05
mwoland
Задача: в интерфейсе редактирования заказа НИОКР добавить пункт в локальное меню и написать его обработчик. Мои попытки увенчались провалом, "и чем я его только ни пробовала"(c).
1. Пробовал добавить через сапорт/консоль управления/меню. Пункт добавился и даже вызывался его обработчик. Только у меня возникло подозрение, что меню при этом переписывается полностью в ресурс пользователя, что не есть гуд: если в следующем патче будет добавлен новый пункт меню, то мое меню его перекроет; это недопустимо. Видимо добавить пункт в сапорте - это тоже самое, что подключить ресурсник в котором описана конструкция вида:

Код: Выделить всё

НазваниеСтандартногоМеню Menu {
  - Пункт стандартного меню 1
  - Пункт стандартного меню 2
  ...
  - Добавляемый пункт меню
}
2. Пробовал докомпилить интерфейс (alter interface) и в handleevent cmInit (а потом еще и в cmHotKeys) описывал следующую конструкцию:

Код: Выделить всё

var MenuId: longint;
MenuId := LoadMenu('HOTSTAGEWIN');
AddMenuItem(MenuId, 'Новый пункт меню', cmAddedMenuItem1);
inherited::handleevent(cmInit);
Ясное дело, не получилось, т.к. я создал свой экземпляр меню, который никак не соотносится с тем меню, которое вызывает стандартный обработчик
3. Пробовал найти точку расширения на формирование меню в cmHotkey, думал, может реализовано так же, как для накладных через RunDynMenu - безуспешно.
Идей больше нет, прошу Вашей помощи. Заранее спасибо.

Добавлено: 24 июл 2009, 17:07
k_vit
Следите за патчами и переводите на них своё меню.

Добавлено: 14 апр 2010, 06:35
Алексей
Столкнулся с тем же. Можно сделать через саппорт и получив ресурс подключить его, но следить за возможным изменением оригинального меню не хочется. Тем более - нет даже скрипта который можно было бы запустить как сборку конфигуратора и при случае изменения успокоится. Я не уверен что вспомню через год что я там делал и для
чего.


Попробовал через саппорт: нашел нужное меню, написал новую строчку, в ней указываю что это вызов интерфейса:
1. при попытке указать название нажатием ф3 - интерфейсы системы galnet не показывают, не смотря на то что она выбрана активной.
2. написал название интерфейса вручную - при запуске в галактике вылетает окно с просьбой указать какой интерфейс запускать.


Как быть?

Добавлено: 14 апр 2010, 10:53
edward_K
наверное забыли прописать компонентную принадлежность.

Добавлено: 14 апр 2010, 11:16
Vik
Я как-то добавлял свои пункты меню в интерфейс SoprDoc и SoprDocB, сделав alter interface. Выглядело так примерно:

#component "L_SOPRDOC"

Код: Выделить всё

alter Interface SoprDocB
 ('')
 overload
end;

cmHotKeys:
{

 _try
 {

  if (CurTable = #KatSopr) and (KatSopr.VidSopr = 101)
  {
     var sDynMenu : string;

     sDynMenu := oSoprMenu.MakeSoprMenu(KatSopr.VidSopr, 0); 
     var Menu1: longint;

     MenuHelper::ExtractMenuFromString(sDynMenu, ';', Menu1) 

     AddMenuItem(Menu1,'separator',666);

     AddMenuItem(Menu1,'Загрузить из файла', cmLoadFromFile);

     PutHotCommand(RunLoadMenu(Menu1));

   }
   else // загружаем стандартное меню
   {
        if inherited :: HandleEvent(cmHotKeys) <> heOk
          Abort;
    }                               
 }
 _except on
    ExAddMenuItemError :
    {
        if inherited :: HandleEvent(cmHotKeys) <> heOk
          Abort;
    }
}
Добавлять через ";"название своего меню к строке sDynMenu нельзя - это дурацкое ограничение на длину строки в 256 символов портит жизнь, поэтому пришлось сначала распарсить строку, склеить все менюшки по отдельности и в получившееся добавить свое.

Добавлено: 14 апр 2010, 11:29
Алексей
edward_K писал(а):наверное забыли прописать компонентную принадлежность.
в том то и дело что не забыл. пробовал интерфейсы и внутри компонентов и без компонентов. не получается никак.
самое интересное что в момент редактирования в саппорте - из возможных интерфейсов - дает фесы саппорта а не галнета - хотя активной системой стоит именно галнет.


Vik спасибо, буду пробовать.

Добавлено: 14 апр 2010, 12:36
Алексей
В общем порыв немного форум и хелп написал так.
У меня работает.

Код: Выделить всё

#Component "Z_STAFFCAT"
const 
   cmIface = 3001;
end
alter interface pickcatalog2;
var menuID:longint;
create view;
HandleEvent
 cmHotKeys:
 {
  menuId := LoadMenu('EXTERNALINFO');
  AddMenuItem (menuID,'Свой пункт меню',cmIface);
  PutHotCommand(RunLoadMenu(menuID));
 }
 cmIface: 
 {
  RunInterface('myComp::myface');
 }
end;
end.