Возможна ли программная докомпиляция меню

Приемы и подходы, обмен опытом

Модераторы: Screw, larin

Ответить
Max_Ural
партнер
Сообщения: 82
Зарегистрирован: Ср, 19/09/2007 08:35
Имя Фамилия: Максим Шагубаков
Откуда: Галактика-Урал
Контактная информация:

Возможна ли программная докомпиляция меню

Сообщение Max_Ural »

Суть проблемы:
нам довольно часто бывает необходимо добавить в локальное меню какого-нибудь документа новый пункт меню для вызова своих функций.
Для этого нужно:
1. В саппорте докомпилировать меню
2. В випе докомпилировать интерфейс (добавить обработчик события)
3. Написать свой интерфейс, реализующий функционал

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

Можно ли каким-то образом, написав на випе код, докомпилировать меню?
vadim
топ-софт
Сообщения: 197
Зарегистрирован: Чт, 06/09/2007 17:38
Имя Фамилия: Вадим Володько
Откуда: ТопСофт
Контактная информация:

Сообщение vadim »

меню (любое количество) можно ращмещать прямо в теле вип-исходника, например:

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

...
end. // Interface

//------------------------------------------------------------------------------

UserHotMenu menu
{
  - '~П~ечать каталога', cmPrintDoc, 'Печать каталога', hcPrintKat, 'Ctrl-P', kbCtrlP, sci1Esc;
  -------;
  - 'Переключить режим отображения дерево\список', cmAccording, 'Переключает режим отображения с дерева на линейный список и наоборот', hcSwitchTree, 'Alt-S', kbAltS, sci1Esc;
  = 'Групповые операции по экспорту', 'Выберите для пакетной обработки записей', hcGrpOper;
  {
    - 'Выгрузка помеченных элементов в Excel', cmValue1, 'Выберите записи для экспорта', hcExportExcel, '',, sci1Esc;
    - 'Выгрузка помеченных элементов в RTFl', cmValue1, 'Выберите записи для экспорта', hcExportWord, '',, sci1Esc;
  }
}
Max_Ural
партнер
Сообщения: 82
Зарегистрирован: Ср, 19/09/2007 08:35
Имя Фамилия: Максим Шагубаков
Откуда: Галактика-Урал
Контактная информация:

Сообщение Max_Ural »

Вадим, согласен, я могу описать сколько угодно своих меню
Но мне надо именно добавить новый пункт меню в существующее.
Если я возьму это меню из исходника целиком в свой проект, то может возникнуть ситуация, что разработчики добавят в меню новый пункт, а в моем меню этот пункт не появится.
Данная ситуация исключена, если использовать докомпиляцию меню
Аватара пользователя
Screw
топ-софт
Сообщения: 73
Зарегистрирован: Пт, 14/09/2007 22:54
Имя Фамилия: Виталий Корзюк
Откуда: ТопСофт
Контактная информация:

Сообщение Screw »

Конфигурационный скрипт?
Max_Ural
партнер
Сообщения: 82
Зарегистрирован: Ср, 19/09/2007 08:35
Имя Фамилия: Максим Шагубаков
Откуда: Галактика-Урал
Контактная информация:

Сообщение Max_Ural »

Виталий, не могли бы вы привести пример скрипта, который добавляет новый пункт меню в существущее стандартное локальное меню.
Например, в одно из
//L_DOGOVOR::MNUDOGOVOR - меню в таблице для договоров
//L_DOGOVOR::MNUDOGOVORATTAC - меню в таблице для доп.соглашений
//L_DOGOVOR::MNUDOGOVOREDIT - меню в анкетной форме для договора
//L_DOGOVOR::MNUDOGOVORATTACEDIT - меню в анкетной форме для доп.соглашений
или любое другое по вашему выбору
Аватара пользователя
Screw
топ-софт
Сообщения: 73
Зарегистрирован: Пт, 14/09/2007 22:54
Имя Фамилия: Виталий Корзюк
Откуда: ТопСофт
Контактная информация:

Сообщение Screw »

Уверенности не было, поэтому я поэкспериментировал, посмотрел код, и выяснил, что Конфигуратор пока что не умеет создавать новые меню или их пункты. Но что-то подсказывает мне, что реализовать это будет не очень сложно.
Max_Ural
партнер
Сообщения: 82
Зарегистрирован: Ср, 19/09/2007 08:35
Имя Фамилия: Максим Шагубаков
Откуда: Галактика-Урал
Контактная информация:

Сообщение Max_Ural »

Виталий, у меня есть подозрение что это уже возможно
Потому что саппорт умеет на основе действий пользователя создать ресурс, который добавляет пункт меню.

Как вы думаете, стоит ли в ПИР занести проблему, чтобы дали возможность с помощью ВИПа или конфигуратора добавить новый пункт меню?

И еще вопрос по конфигуратору - не могли бы вы выложить (или прислать на почту) пару примеров конфигурационных скриптов для конфигуратора и пояснить - как их можно компилировать с помощью випа
Например, по добавлению нового поля в брауз или кнопки в скрин?
Аватара пользователя
larin
топ-софт
Сообщения: 228
Зарегистрирован: Пн, 10/09/2007 12:13
Имя Фамилия: Михаил Ларин
Откуда: ТопCофт
Контактная информация:

Сообщение larin »

Есть еще один способ, который появился в Атлантисе 5.4.13. Описан в What`s New 101.4917 и в последней редакции документации на Атлантис:

Появилась возможность динамически изменять/заменять любое меню в том числе и главное меню (не деск)

Нужно либо создать с нуля либо изменить готовое меню/подменю затем сохранить его как динамическое и при следующей загрузке главного меню оно заменит собой меню/подменю с таким же именем

Добавлены новые функции

function LoadMenuEx (Name : String; bConfRegister : boolean; blockDynamic : boolean) : LongInt;
к параметрам LoadMenu добавился параметр blockDynamic <блокировать загрузку динамических меню>

function AddMenuItemEx2 (MenuID : LongInt; Name,HelpLine,HelpCtx : String; Command,KeyCode : Word; CommandParams : string) : Boolean; к параметрам AddMenuItemEx добавился параметр CommandParams для задания параметров команды меню

function DeleteMenuItem (MenuID : LongInt; Name : String; Command : Word; CommandParam : String) : Boolean;
удалить из меню MenuID пункт с именем Name командой Command и параметрами команды CommandParam

function AddSubMenuDynamic (MenuID : LongInt; SubMenuName : String; Name,HelpLine,HelpCtx : String) : Boolean;
добавить в меню MenuID ссылку на подменю SubMenuName (при след загрузке в ссылку будет вставлено подменю или она будет удалена если подменю нет)

function StoreMenuHowDynamics (MenuID : LongInt; Name : String) : boolean;
сохранить меню MenuID как динамическое с именем Name

function DeleteMenuHowDynamics (Name : String) : boolean;
удалить динамическое меню с именем Name
(если Name = '' то удаляет все динамические меню)

procedure ReinitHeaderMenu;
встряхнуть глпавное меню


Пример:

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

const
  cmAddDMenu = 3003;
  cmDelDMenu = 3004;
end;

interface aaa;
create view as select * from x$files;

screen sss;
buttons
  cmAddDMenu;
  cmDelDMenu;
<<

  <.Add dMenu.>
  <.Del dMenu.>

>>
end;
handleevent
  cmAddDMenu :
  {
     var M : longint;

     M := CreateMenu;
     AddMenuItemEx2       (M,'Пункт 1','','',cmRunInterface,0,'AtlCalc');
     AddSubMenuDynamic    (M,'Information','Info','','');
     AddMenuItemEx        (M,'Пункт 2','','',cmOk,0);
     //DelMenuItem (M,'Пункт 2',cmOk,'');

     StoreMenuHowDynamics (M,'vspom');
     DisposeLoadMenu (M);

     ReinitHeaderMenu;
  }
  cmDelDMenu :
  {
     DeleteMenuHowDynamics ('vspom');

     ReinitHeaderMenu;
  }
end;
end.
cruger
топ-софт
Сообщения: 566
Зарегистрирован: Пт, 21/09/2007 15:19
Имя Фамилия: Фёдор Терсин
Откуда: Галактика Софт
Контактная информация:

Сообщение cruger »

Максим Шагубаков писал(а):Можно ли каким-то образом, написав на випе код, докомпилировать меню?
Сейчас "докомпиляция меню" - те дополнительные возможности, которые реализованы в Консоли управления, но которых нет в Конфигураторе меню - умеет накатываться Консолью управления и Патчменеджером. На момент конфигурации меню в Консоли управления создаётся (помимо готового меню в ресурсе) специальный объект, который тоже сохраняется в ресурс, а умеет обрабатываться только Саппортом и Патчменеджером.
Соответствующих конструкций языка вип просто не существует. И в принципе они не очень там нужны, т.к. вип скорее для создания своего проекта с нуля, а для доработок есть Консоль управления.
Аватара пользователя
Screw
топ-софт
Сообщения: 73
Зарегистрирован: Пт, 14/09/2007 22:54
Имя Фамилия: Виталий Корзюк
Откуда: ТопСофт
Контактная информация:

Сообщение Screw »

Скрипты как способ накатывания пользовательских конфигураций мне кажутся удобнее, чем использование Консоли управления или Патчменеджера. Хотя бы потому, что все изменения описаны в явном виде и их просто корректировать. И их можно накатить прямо из Галактики, то есть, даже без помощи стороннего приложения. Дизайнеры - это, конечно, очень хорошо, но вряд ли можно придумать что-то проще скриптов.
Max_Ural
партнер
Сообщения: 82
Зарегистрирован: Ср, 19/09/2007 08:35
Имя Фамилия: Максим Шагубаков
Откуда: Галактика-Урал
Контактная информация:

Сообщение Max_Ural »

Здравствуйте
Во-первых, полностью согласен с Виталием
Виталий Корзюк писал(а):Скрипты как способ накатывания пользовательских конфигураций мне кажутся удобнее, чем использование Консоли управления или Патчменеджера. Хотя бы потому, что все изменения описаны в явном виде и их просто корректировать.
Я бы еще добавил, что это удобно потому, что проект, содержащий добавление конкретного функционала, будет собран в один ресурс, то есть, являться единым целым, что позволит значительно облегчить сопровождение.

Пробовал предложенные варианты в следующем порядке:
1. С помощью конфигурационного скрипта
Создал конфигурационный скрипт

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

object 'MENU_F_OFP::OFPANALIZ_HOTKEYS' : Menu {
  object M_cmvalue30 : MenuItem {
    Visible = True;
    Title = 'Получить данные по движению ДС';
    HelpLine = 'Получить данные по движению ДС';
    HotKey = 0;
    MenuItemParams = '';
    MenuItemTask = '';
    Command = 12210;
    HelpCtx = '';
    HelpCtxAvail = '';
    StatusCtx = 0;
    Checked = False;
  } // M_cmvalue30 : MenuItem
} // MENU_F_OFP::OFPANALIZ_HOTKEYS : Menu
Сохранил его в файл cnf, добавил в проект
При компиляции выдается предупреждение
Предупреждение: Нельзя создать объект 'M_cmvalue30' с типом 'MenuItem' в контейнере 'MENU_F_OFP::OFPANALIZ_HOTKEYS' (стр. 2, поз. 32, 022_1_Расчет_движения_ДС\menu.cnf)
Этот вариант отпадает

2. С помощью создания динамического меню
Докомпилировал событие cmInit интересующего меня интерфейса, чтобы при запуске интерфейса для локального меню создавалось динамическое

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

alter interface OFPANSEE;
  handleEvent
    cmInit:{
      INHERITED::handleEvent (cmInit);
      var mId:longint;
      DeleteMenuHowDynamics ('')
      mId := LoadMenuEx ('F_OFP::OFPANALIZ_HOTKEYS', true, false);
      message('Результат добавления пункта меню '+AddMenuItem(mId,'Получить данные по движению ДС',cmValue30));
      StoreMenuHowDynamics (mId, 'F_OFP::OFPANALIZ_HOTKEYS');
      DisposeLoadMenu (mId);
      ReinitHeaderMenu;
    }
...
end.
В сообщении выдается, что результат добавления пункта меню - TRUE
Но при этом меню не изменилось
:conf:

Анализ данного способа еще не окончен, так как наметились кое-какие подвижки
После получения устойчивого результата опубликую в данной теме то, что станет известно
cruger
топ-софт
Сообщения: 566
Зарегистрирован: Пт, 21/09/2007 15:19
Имя Фамилия: Фёдор Терсин
Откуда: Галактика Софт
Контактная информация:

Сообщение cruger »

Вообще говоря консоль управления почти для всех своих манипуляций формирует скрипты, позволяет их выгружать, сохраняет их в ресурсе, и на них ориентируется патч-менеджер при установке обновлений.

Мне странно видеть апологетов скриптов. Ведь последние годы я встречаю только апологетов программирования мышкой.
Ответить