Страница 5 из 6

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

Добавлено: 02 фев 2011, 18:20
Vik
Есть еще отчеты пользователя, рабочие места и тд. Я, например, просто сделал несколько групп в отчетах пользователя и помещаю туда свои какие-то наработки, не трогая главное меню.

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

Добавлено: 03 фев 2011, 15:00
n0where
отчеты пользователя пока решили проблему. Спасибо

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

Добавлено: 17 фев 2011, 16:17
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.
Я так понимаю, что лучше этот код действительно выполнять при обновлении реестра настроек. Был бы очень признателен за пример, как это реализовать:)

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

Добавлено: 21 фев 2011, 11:22
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(); // какие-то нужные вам действия с меню
}

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

Добавлено: 16 фев 2012, 10:38
RAJAH
Возникла необходимость не добавить, а скрыть некоторые пункты контекстного меню для большинства пользователей, оставив стандартное только особо избранным. n0where уже поднимал вопрос о раздельном доступе к меню. Как я понял, это невозможно, так как отредактированное меню хранится в БД, и потому одинаково для всех? Как лучше организовать доступ?

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

Добавлено: 16 фев 2012, 11:03
n0where
Докомпиляцией... а как ещё?
Функция SetMenuItemState устанавливает состояние элемента меню.
Описание
SetMenuItemState(menuID : longInt; itemName : string; itemCommand : integet; state : byte) : boolean

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

Добавлено: 16 фев 2012, 11:07
RAJAH
n0where писал(а):а как ещё?
:-) Лучше я суппортом тогда отредактирую.

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

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

Может, не лучшее решение, но работает. Про горячие клавиши 99% пользователей слыхом не слыхивали...

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

Добавлено: 07 авг 2012, 18:26
Ольга
LaaLaa писал(а):

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

PutHotCommand(RunMenu('mnuKatOrgEdit'));

заменили на

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

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

Что это за зверь, и как его съесть? Может, у кого есть информация?

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

Добавлено: 08 авг 2012, 15:57
Starry
Пользовался немного функцией RunDynMenu при доработке стандартных меню, всплывающих по правому клику. В качестве параметра передаем ей строку, состоящую из наименований меню (можно и с указанием компонентной принадлежности) - стандартных или собственной разработки. Как я понимаю, она разбирает полученные меню (и разделители) по пунктам и добавляет их по одному.
Если у вас второе меню не находится, попробуйте "поиграть" с компонентной принадлежностью, может в этом причина.

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

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

Наименования меню, компонентов, наличие меню в ресурсах - проверено, дело не в этом, что-то есть еще.

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

Добавлено: 09 авг 2012, 17:54
Ольга
Посыпаю голову пеплом! :oops:
Все мои проблемы были из-за пробелов после ";". Без пробелов все ОК - получилось отличное меню. :)

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

Добавлено: 16 ноя 2012, 14:14
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.

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

Добавлено: 19 ноя 2012, 16:37
zna
Bandito_Gangsterito писал(а):...
Пример.
...
Работает! :-)
+1

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

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

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