Как узнать имя локального меню?

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

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

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

Re: Как узнать имя локального меню?

Сообщение Vik »

Есть еще отчеты пользователя, рабочие места и тд. Я, например, просто сделал несколько групп в отчетах пользователя и помещаю туда свои какие-то наработки, не трогая главное меню.
n0where
Местный житель
Сообщения: 499
Зарегистрирован: 30 дек 2010, 08:16

Re: Как узнать имя локального меню?

Сообщение n0where »

отчеты пользователя пока решили проблему. Спасибо
хороший программист — это человек, который переходя улицу с односторонним движением смотрит в обе стороны
Robis
Посетитель
Сообщения: 37
Зарегистрирован: 13 дек 2010, 16:55

Re: Как узнать имя локального меню?

Сообщение Robis »

Добрый день, я потихоньку изучаю галку и vip. Дошли руки до менюшек, я практически полностью разобрался и сделал меню по примеру Vik в картотеке сотрудников. Для меня остался только один непонятный момент.

Наша дополненная менюха клаладётся в X$Resources строкой, в мемо-поле которой она собственно и описана. Код, перед выполнением проверяет наличие нашей строки в X$Resources, и если её там нет - исполняется и добавляет её туды. Вот только до меня никак не доходит куда денется наша строка из X$Resources при обновлении компоненты разработчиком до новой версии? Как узнать, что менюха изменилась и пересоздать её?

Чтобы не искать по теме приведу для удобства тут код:

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

#component "Z_STAFF"

alter interface RECEPTIONMAIN;

create view as select * from
X$Resources(ReadOnly)
;

handleevent
cmNeweraPrintFssDoc:
    {
    
    }
cmInit:
    {
    var newera_menuID    :    longint;
    var newera_menuname    :    string;
    newera_menuname:='Z_STAFF::Receptionmenu';
    if(inherited::handleevent(cmInit)=tsOk){};
    if (RecordExists X$Resources where (( 3 == X$Resources.XR$Type and 'MENU Z_STAFF::Receptionmenu' == X$Resources.XR$Name )) <> tsOK)
        {
        message('куку');
        DeleteMenuHowDynamics(newera_menuname);
        newera_menuID:=LoadMenuEx(newera_menuname, true, false);
        AddMenuItem(newera_menuID, 'Печать заявления в страховую организацию', cmNeweraPrintFssDoc);
        StoreMenuHowDynamics(newera_menuID, newera_menuname);
        DisposeLoadMenu(newera_menuID);
        ReinitHeaderMenu;
        }
    }
end;

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

Re: Как узнать имя локального меню?

Сообщение Vik »

Ничто не мешает разработчику вообще удалить из кода то меню, которое вы используете, либо переименовать его по каким-то соображениям.

А вот возможный пример, который вы просили.

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

#include CreateTune.vih
// установка даты модификации реестра настроек
Handler with replace DateModifyTune_ChangeMenu on ExtensionPoint
  epDateModifyTune (TS : ObjStartCreateTune)
Action
{
  TS.SetLastDateModTune(Day(Cur_Date),Month(Cur_Date),Year(Cur_Date));
  Result := true;
}

Handler with replace CreateTuneComponent_ChangeMenu on extensionPoint
  epCreateTuneComponent (TR: ObjCreateTuneEx) [201]
Action
{  
  var myMenuChanger : MenuChanger ;  // какой-то объект с методами по работе с меню 
  myMenuChanger.changeMenu(); // какие-то нужные вам действия с меню
}
RAJAH
Местный житель
Сообщения: 932
Зарегистрирован: 18 фев 2008, 12:49

Re: Как узнать имя локального меню?

Сообщение RAJAH »

Возникла необходимость не добавить, а скрыть некоторые пункты контекстного меню для большинства пользователей, оставив стандартное только особо избранным. n0where уже поднимал вопрос о раздельном доступе к меню. Как я понял, это невозможно, так как отредактированное меню хранится в БД, и потому одинаково для всех? Как лучше организовать доступ?
n0where
Местный житель
Сообщения: 499
Зарегистрирован: 30 дек 2010, 08:16

Re: Как узнать имя локального меню?

Сообщение n0where »

Докомпиляцией... а как ещё?
Функция SetMenuItemState устанавливает состояние элемента меню.
Описание
SetMenuItemState(menuID : longInt; itemName : string; itemCommand : integet; state : byte) : boolean
хороший программист — это человек, который переходя улицу с односторонним движением смотрит в обе стороны
RAJAH
Местный житель
Сообщения: 932
Зарегистрирован: 18 фев 2008, 12:49

Re: Как узнать имя локального меню?

Сообщение RAJAH »

n0where писал(а):а как ещё?
:-) Лучше я суппортом тогда отредактирую.
KATZ
Местный житель
Сообщения: 473
Зарегистрирован: 29 мар 2005, 17:49

Re: Как узнать имя локального меню?

Сообщение KATZ »

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

Может, не лучшее решение, но работает. Про горячие клавиши 99% пользователей слыхом не слыхивали...
Ольга
Постоянный обитатель
Сообщения: 135
Зарегистрирован: 29 мар 2005, 17:49

Re: Как узнать имя локального меню?

Сообщение Ольга »

LaaLaa писал(а):

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

PutHotCommand(RunMenu('mnuKatOrgEdit'));

заменили на

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

PutHotCommand(RunDynMenu('C_COMMON::Print_HotKeys;SEPARATOR;C_COMMON::AttrClass_HotKeys'));
Заинтересовало. RunDynMenu - Как эта функция собирает меню? А какие-нибудь специальные требования к указанным меню, или спецусловия применения есть?
Хотелось бы попользоваться, но у меня не получается, указываю два меню - второе меню не находит.

Что это за зверь, и как его съесть? Может, у кого есть информация?
Starry
Посетитель
Сообщения: 33
Зарегистрирован: 20 июл 2012, 15:13

Re: Как узнать имя локального меню?

Сообщение Starry »

Пользовался немного функцией RunDynMenu при доработке стандартных меню, всплывающих по правому клику. В качестве параметра передаем ей строку, состоящую из наименований меню (можно и с указанием компонентной принадлежности) - стандартных или собственной разработки. Как я понимаю, она разбирает полученные меню (и разделители) по пунктам и добавляет их по одному.
Если у вас второе меню не находится, попробуйте "поиграть" с компонентной принадлежностью, может в этом причина.
Ольга
Постоянный обитатель
Сообщения: 135
Зарегистрирован: 29 мар 2005, 17:49

Re: Как узнать имя локального меню?

Сообщение Ольга »

Starry писал(а):Пользовался немного функцией RunDynMenu при доработке стандартных меню, всплывающих по правому клику. В качестве параметра передаем ей строку, состоящую из наименований меню (можно и с указанием компонентной принадлежности) - стандартных или собственной разработки. Как я понимаю, она разбирает полученные меню (и разделители) по пунктам и добавляет их по одному.
Если у вас второе меню не находится, попробуйте "поиграть" с компонентной принадлежностью, может в этом причина.
Спасибо, я, собственно, с той же целью интересуюсь... :grin:
Собирала строку в варианте: меню фейса+Separator+свое меню - функция при вызове ругалась, что не найден разделитель (separator), но мое меню было; убрала разделитель - стала ругаться на мое меню. Эксперимента ради поставила вторым стандартное меню (атрибуты) - результат тот же - не находит.
Вот есть ощущение - чего-то вроде как не хватает, не пойму только чего, может инклуда какого. Или параметр - строка составного меню - нужно писать как-то иначе :-(

Наименования меню, компонентов, наличие меню в ресурсах - проверено, дело не в этом, что-то есть еще.
Ольга
Постоянный обитатель
Сообщения: 135
Зарегистрирован: 29 мар 2005, 17:49

Re: Как узнать имя локального меню?

Сообщение Ольга »

Посыпаю голову пеплом! :oops:
Все мои проблемы были из-за пробелов после ";". Без пробелов все ОК - получилось отличное меню. :)
Bandito_Gangsterito
Сообщения: 8
Зарегистрирован: 01 окт 2012, 15:28
Откуда: Брест
Контактная информация:

Re: Как узнать имя локального меню?

Сообщение Bandito_Gangsterito »

Полная информация об интерфейсах, меню, формах содержится в файле GAL810\exe\GALDOC\!GSDK.chm
При этом обратите внимение, что основное меню может содержать вложенные подменю.
Пример.
Клиент попросил привязать договор к организации и добавлять его в назначение платежа в собственном платежном поручении.
К организации я привязал внешний атрибут 'Договор'. В окне платежного поручения я перегрузил меню, добавив свою команду меню 'Добавить договор в назначение платежа'.
Код примера:

#component 'F_PLPOR'
const
cmRunPrim = 9011;
End;

alter interface PLPOR;
var menuID_ni:LongInt;
var sDog : String;
Create view v_dog
var n_rec:comp;
as Select
attrval.Vstring
from attrval, attrnam
where
((
word(1418) == attrval.wtable and
n_rec == katorg.nrec and
katorg.nrec== attrval.crec and
word(1418) == attrnam.wtable and
'Договор'== attrnam.name and
attrnam.nrec== attrval.cattrnam
));
window WIPLDOCEDIT;
HandleEvent
cmHotKeys:
{
//inherited::handleEvent(cmHotKeys);
menuId_ni := LoadMenu('F_PLPOR::PLPOR_HOTKEYSW');
AddMenuItem(menuId_ni,'separator',1);
AddMenuItem(menuId_ni,'Добавить договор в назначение платежа',cmRunPrim);


PutHotCommand(RunLoadMenu(menuId_ni));
ReinitHeaderMenu;
}

cmRunPrim:
{
if(plpor.CPOL<>0)
{
v_dog.n_rec:=plpor.CPOL;
v_dog.getfirst;
sDog:=v_dog.attrval.vstring;
//if(Length(plpor.namepl1)+Length(plpor.namepl2)+Length(plpor.namepl3)+Length(plpor.namepl4)=0)
if(Length(sDog)>0)
{
UPDATE CURRENT plpor SET namepl4:=plpor.namepl4+'Согласно договора '+sDog;
ReReadRecord (#plpor);
}
else Message('В данной организации не заполнен внешний атрибут "Договор"');
}
}
end;
end;
end.
zna
Местный житель
Сообщения: 552
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Челябинск
Контактная информация:

Re: Как узнать имя локального меню?

Сообщение zna »

Bandito_Gangsterito писал(а):...
Пример.
...
Работает! :-)
+1
Алексей
Местный житель
Сообщения: 2896
Зарегистрирован: 24 июн 2005, 12:12
Откуда: Иркутская область

Re: Как узнать имя локального меню?

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

прочитал тему, и всё же внятного ответа на вопрос из первого поста темы не нашел.
как, зная имя интерфейса найти список возможных локальных меню?
тему и документацию прочитал, в саппорте в описании интерфейсов смотрел.
в L_Remont.chm локальных меню очень много.

не имея исходников, я так понял никак не найти?
Ответить