Возможна ли программная докомпиляция меню
-
- партнер
- Сообщения: 82
- Зарегистрирован: Ср, 19/09/2007 08:35
- Имя Фамилия: Максим Шагубаков
- Откуда: Галактика-Урал
- Контактная информация:
Возможна ли программная докомпиляция меню
Суть проблемы:
нам довольно часто бывает необходимо добавить в локальное меню какого-нибудь документа новый пункт меню для вызова своих функций.
Для этого нужно:
1. В саппорте докомпилировать меню
2. В випе докомпилировать интерфейс (добавить обработчик события)
3. Написать свой интерфейс, реализующий функционал
2 и 3 пункт у нас размещен в отдельном проекте, а вот с 1-м - основная морока
Для докомпиляции меню надо подключить к саппорту ресурс с докомпилированным интерфейсом и в интерактивном режиме добавить пункт.
При этом докомпиляция меню остается в отдельном маленьком ресурсе.
Можно ли каким-то образом, написав на випе код, докомпилировать меню?
нам довольно часто бывает необходимо добавить в локальное меню какого-нибудь документа новый пункт меню для вызова своих функций.
Для этого нужно:
1. В саппорте докомпилировать меню
2. В випе докомпилировать интерфейс (добавить обработчик события)
3. Написать свой интерфейс, реализующий функционал
2 и 3 пункт у нас размещен в отдельном проекте, а вот с 1-м - основная морока
Для докомпиляции меню надо подключить к саппорту ресурс с докомпилированным интерфейсом и в интерактивном режиме добавить пункт.
При этом докомпиляция меню остается в отдельном маленьком ресурсе.
Можно ли каким-то образом, написав на випе код, докомпилировать меню?
-
- топ-софт
- Сообщения: 197
- Зарегистрирован: Чт, 06/09/2007 17:38
- Имя Фамилия: Вадим Володько
- Откуда: ТопСофт
- Контактная информация:
меню (любое количество) можно ращмещать прямо в теле вип-исходника, например:
Код: Выделить всё
...
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;
}
}
-
- партнер
- Сообщения: 82
- Зарегистрирован: Ср, 19/09/2007 08:35
- Имя Фамилия: Максим Шагубаков
- Откуда: Галактика-Урал
- Контактная информация:
Вадим, согласен, я могу описать сколько угодно своих меню
Но мне надо именно добавить новый пункт меню в существующее.
Если я возьму это меню из исходника целиком в свой проект, то может возникнуть ситуация, что разработчики добавят в меню новый пункт, а в моем меню этот пункт не появится.
Данная ситуация исключена, если использовать докомпиляцию меню
Но мне надо именно добавить новый пункт меню в существующее.
Если я возьму это меню из исходника целиком в свой проект, то может возникнуть ситуация, что разработчики добавят в меню новый пункт, а в моем меню этот пункт не появится.
Данная ситуация исключена, если использовать докомпиляцию меню
-
- партнер
- Сообщения: 82
- Зарегистрирован: Ср, 19/09/2007 08:35
- Имя Фамилия: Максим Шагубаков
- Откуда: Галактика-Урал
- Контактная информация:
Виталий, не могли бы вы привести пример скрипта, который добавляет новый пункт меню в существущее стандартное локальное меню.
Например, в одно из
//L_DOGOVOR::MNUDOGOVOR - меню в таблице для договоров
//L_DOGOVOR::MNUDOGOVORATTAC - меню в таблице для доп.соглашений
//L_DOGOVOR::MNUDOGOVOREDIT - меню в анкетной форме для договора
//L_DOGOVOR::MNUDOGOVORATTACEDIT - меню в анкетной форме для доп.соглашений
или любое другое по вашему выбору
Например, в одно из
//L_DOGOVOR::MNUDOGOVOR - меню в таблице для договоров
//L_DOGOVOR::MNUDOGOVORATTAC - меню в таблице для доп.соглашений
//L_DOGOVOR::MNUDOGOVOREDIT - меню в анкетной форме для договора
//L_DOGOVOR::MNUDOGOVORATTACEDIT - меню в анкетной форме для доп.соглашений
или любое другое по вашему выбору
-
- партнер
- Сообщения: 82
- Зарегистрирован: Ср, 19/09/2007 08:35
- Имя Фамилия: Максим Шагубаков
- Откуда: Галактика-Урал
- Контактная информация:
Виталий, у меня есть подозрение что это уже возможно
Потому что саппорт умеет на основе действий пользователя создать ресурс, который добавляет пункт меню.
Как вы думаете, стоит ли в ПИР занести проблему, чтобы дали возможность с помощью ВИПа или конфигуратора добавить новый пункт меню?
И еще вопрос по конфигуратору - не могли бы вы выложить (или прислать на почту) пару примеров конфигурационных скриптов для конфигуратора и пояснить - как их можно компилировать с помощью випа
Например, по добавлению нового поля в брауз или кнопки в скрин?
Потому что саппорт умеет на основе действий пользователя создать ресурс, который добавляет пункт меню.
Как вы думаете, стоит ли в ПИР занести проблему, чтобы дали возможность с помощью ВИПа или конфигуратора добавить новый пункт меню?
И еще вопрос по конфигуратору - не могли бы вы выложить (или прислать на почту) пару примеров конфигурационных скриптов для конфигуратора и пояснить - как их можно компилировать с помощью випа
Например, по добавлению нового поля в брауз или кнопки в скрин?
- larin
- топ-софт
- Сообщения: 228
- Зарегистрирован: Пн, 10/09/2007 12:13
- Имя Фамилия: Михаил Ларин
- Откуда: ТопCофт
- Контактная информация:
Есть еще один способ, который появился в Атлантисе 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;
встряхнуть глпавное меню
Пример:
Появилась возможность динамически изменять/заменять любое меню в том числе и главное меню (не деск)
Нужно либо создать с нуля либо изменить готовое меню/подменю затем сохранить его как динамическое и при следующей загрузке главного меню оно заменит собой меню/подменю с таким же именем
Добавлены новые функции
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.
-
- топ-софт
- Сообщения: 566
- Зарегистрирован: Пт, 21/09/2007 15:19
- Имя Фамилия: Фёдор Терсин
- Откуда: Галактика Софт
- Контактная информация:
Сейчас "докомпиляция меню" - те дополнительные возможности, которые реализованы в Консоли управления, но которых нет в Конфигураторе меню - умеет накатываться Консолью управления и Патчменеджером. На момент конфигурации меню в Консоли управления создаётся (помимо готового меню в ресурсе) специальный объект, который тоже сохраняется в ресурс, а умеет обрабатываться только Саппортом и Патчменеджером.Максим Шагубаков писал(а):Можно ли каким-то образом, написав на випе код, докомпилировать меню?
Соответствующих конструкций языка вип просто не существует. И в принципе они не очень там нужны, т.к. вип скорее для создания своего проекта с нуля, а для доработок есть Консоль управления.
- Screw
- топ-софт
- Сообщения: 73
- Зарегистрирован: Пт, 14/09/2007 22:54
- Имя Фамилия: Виталий Корзюк
- Откуда: ТопСофт
- Контактная информация:
Скрипты как способ накатывания пользовательских конфигураций мне кажутся удобнее, чем использование Консоли управления или Патчменеджера. Хотя бы потому, что все изменения описаны в явном виде и их просто корректировать. И их можно накатить прямо из Галактики, то есть, даже без помощи стороннего приложения. Дизайнеры - это, конечно, очень хорошо, но вряд ли можно придумать что-то проще скриптов.
-
- партнер
- Сообщения: 82
- Зарегистрирован: Ср, 19/09/2007 08:35
- Имя Фамилия: Максим Шагубаков
- Откуда: Галактика-Урал
- Контактная информация:
Здравствуйте
Во-первых, полностью согласен с Виталием
Пробовал предложенные варианты в следующем порядке:
1. С помощью конфигурационного скрипта
Создал конфигурационный скрипт
Сохранил его в файл cnf, добавил в проект
При компиляции выдается предупреждение
Предупреждение: Нельзя создать объект 'M_cmvalue30' с типом 'MenuItem' в контейнере 'MENU_F_OFP::OFPANALIZ_HOTKEYS' (стр. 2, поз. 32, 022_1_Расчет_движения_ДС\menu.cnf)
Этот вариант отпадает
2. С помощью создания динамического меню
Докомпилировал событие cmInit интересующего меня интерфейса, чтобы при запуске интерфейса для локального меню создавалось динамическое
В сообщении выдается, что результат добавления пункта меню - TRUE
Но при этом меню не изменилось
Анализ данного способа еще не окончен, так как наметились кое-какие подвижки
После получения устойчивого результата опубликую в данной теме то, что станет известно
Во-первых, полностью согласен с Виталием
Я бы еще добавил, что это удобно потому, что проект, содержащий добавление конкретного функционала, будет собран в один ресурс, то есть, являться единым целым, что позволит значительно облегчить сопровождение.Виталий Корзюк писал(а):Скрипты как способ накатывания пользовательских конфигураций мне кажутся удобнее, чем использование Консоли управления или Патчменеджера. Хотя бы потому, что все изменения описаны в явном виде и их просто корректировать.
Пробовал предложенные варианты в следующем порядке:
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
При компиляции выдается предупреждение
Предупреждение: Нельзя создать объект '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.
Но при этом меню не изменилось
Анализ данного способа еще не окончен, так как наметились кое-какие подвижки
После получения устойчивого результата опубликую в данной теме то, что станет известно
-
- топ-софт
- Сообщения: 566
- Зарегистрирован: Пт, 21/09/2007 15:19
- Имя Фамилия: Фёдор Терсин
- Откуда: Галактика Софт
- Контактная информация:
Вообще говоря консоль управления почти для всех своих манипуляций формирует скрипты, позволяет их выгружать, сохраняет их в ресурсе, и на них ориентируется патч-менеджер при установке обновлений.
Мне странно видеть апологетов скриптов. Ведь последние годы я встречаю только апологетов программирования мышкой.
Мне странно видеть апологетов скриптов. Ведь последние годы я встречаю только апологетов программирования мышкой.