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

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

Ответить
mwoland

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

Сообщение 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 - безуспешно.
Идей больше нет, прошу Вашей помощи. Заранее спасибо.
k_vit
Постоянный обитатель
Сообщения: 143
Зарегистрирован: 09 авг 2006, 16:40
Откуда: Россия, Тюмень, ОАО "Сибирский Научно-Аналитический Центр"

Сообщение k_vit »

Следите за патчами и переводите на них своё меню.
Алексей
Местный житель
Сообщения: 2896
Зарегистрирован: 24 июн 2005, 12:12
Откуда: Иркутская область

Сообщение Алексей »

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


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


Как быть?
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5187
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Сообщение edward_K »

наверное забыли прописать компонентную принадлежность.
Vik
Местный житель
Сообщения: 370
Зарегистрирован: 28 сен 2006, 15:43
Откуда: Санкт-Петербург
Контактная информация:

Сообщение 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 символов портит жизнь, поэтому пришлось сначала распарсить строку, склеить все менюшки по отдельности и в получившееся добавить свое.
Алексей
Местный житель
Сообщения: 2896
Зарегистрирован: 24 июн 2005, 12:12
Откуда: Иркутская область

Сообщение Алексей »

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


Vik спасибо, буду пробовать.
Алексей
Местный житель
Сообщения: 2896
Зарегистрирован: 24 июн 2005, 12:12
Откуда: Иркутская область

Сообщение Алексей »

В общем порыв немного форум и хелп написал так.
У меня работает.

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

#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.
Ответить