МЕТОД JOIN КЛАССОВ МЕТАСХЕМЫ
Процедура контекстного меню, вызываемого по нажатию ENTER на объектах в браузере указывается в методе JOIN класса метасхемы. Процедура должна иметь 6-ть входных параметров описанных в joinpar.i. Следовательно, данный инклюд-файл должен быть подключен в процедуре метода.
За создание контекстного меню отвечает инклюд-файл procjoin.i. Данный инклюд-файл должен быть подключен исключительно в конце процедуры метода JOIN.
Данному инклюд-файлу могут переданы следующие аргументы:
- &FrameTitle - заголовок меню;
- &Prefix - префикс таблицы контекстного меню;
- &Params - параметры процедур по умолчанию;
- &F6Disable - если установлен в NO - отключается показ скрытых пунктов по F6;
- &ChkDown - сравнивается значение &ChkDown и класса для BrowseLd;
- &showsingle - показывать единственный пункт меню (параметр определен) или нет (не определен);
Создание пунктов меню и определение вызываемых ими процедур осуществляется двумя процедурами CreateJoin и CreateJoinLd, описанными в procjoin.i. Процедура CreateJoin предназначена для вызова произвольной процедуры, в то время как, CreateJoinLd осуществляет вызов процедур браузеров объектов метасхемы и обладает соответствующим набором параметров.
CreateJoin (in-name, in-proc, in-flag).
- in-name - значение CHAR типа, определяющее наименование создаваемого пункта меню;
- in-proc - значение CHAR типа, определяющее имя вызываемой процедуры и передаваемых ей параметров. Разделителем между значением имени процедуры и передаваемых ей параметров является символ верхней одиночной кавычки - "'". Имя вызываемой процедуры указывается без расширения ".p". Параметры передаются списком с разделителем запятая - ",". proc-name + "'" + param1 + "," ... + "," + paramN;
- in-flag - значение LOGICAL типа, определяющее видим ли пункт меню сразу, или по нажатию F6.
CreateJoinLd (in-name,
in-proc,
ipClassChar,
ipCodeLstChar,
ipValLstChar,
ipLockFldChar,
ipLevel,
in-flag).
- in-name - значение CHAR типа, определяющее наименование создаваемого пункта меню;
- in-proc - значение CHAR типа, определяющее процедуру запуска - browseld;
- ipClassChar - значение CHAR типа, определяющее класс объекта браузера;
- ipCodeLstChar - значение CHAR типа, определяющее список полей для предустановки;
- ipValLstChar - значение CHAR типа, определяющее список значений полей;
- ipLockFldChar - значение CHAR типа, определяющее список полей для блокировки;
- ipLevel - значение INT64 типа, определяющее уровень отображения фрейма браузера;
- in-flag - значение LOGICAL типа, определяющее видим ли пункт меню сразу, или по нажатию F6.
Создаваемые пункты меню записываются во временную таблицу {&Prefix}join, объявляемую в инклюд-файле tt-join.i. Данная временная таблица содержит всю основную информацию о создаваемом меню: наименование пунктов меню, вызываемые ими процедуры и передаваемые им параметры.
Если при создании пункта меню не были указаны параметры вызываемой им процедуры, то по умолчанию процедуре будут переданы параметры указанные в аргументе &Params.
При вызове контекстного меню в нем отображаются не все его пункты, а только те, для которых флаг видим имеет значение TRUE. Скрытые пункты меню могут быть отображены по нажатию клавиши F6. Аргумент &F6Disable позволяет отключить такую возможность вывода скрытых пунктов меню по F6. Если все пункты контекстного меню являются скрытыми, то при его вызове будет отображено соответствующее сообщение и вывод меню не будут осуществлен.
Если контекстное меню содержит всего один единственный пункт (учитывая и скрытые пункты меню), то возможен его автоматический вызов без отображения самого контекстного меню. Такое поведение определяется аргументом &showsingle.
Вызов контекстного меню может быть реализован по нажатию произвольной клавиши отличной от ENTER. Для этого используется специальный инклюд-файл run.i, который необходимо указать в качестве аргумента &join в navigate.cqr, передав ему два аргумента:
{navigate.cqr
&join="RUN.i
&proc=<процедура метода join>
&key=<label клавиши> "
}
Пример:
{joinpar.i}
{globals.i}
FIND loan WHERE ROWID(loan) = TO-ROWID(iROWID) NO-LOCK NO-ERROR.
IF NOT AVAIL loan THEN RETURN "-1".
RUN CreateJoin("Картотека счетов",
"lacc`" +
loan.contract + "," +
loan.cont-code + "," +
"1" + "," + "1" + "," +
STRING(level + 1),
YES).
RUN CreateJoinLd ("Обеспечение",
"browseld",
"term-obl-gar",
"contract" + CHR(1) + "cont-code"
+ CHR(1) + "since",
loan.contract + CHR(1) + loan.cont-code
+ CHR(1) + STRING(loan.open-date),
"",
level + 1,
YES).
{procjoin.i
&Prefix = "loan"
&frametitle = "'[ ДОГОВОР ' + loan.doc-ref + ' ]'"
}
RETURN '0'.