Содержание |
Подсистема контекстов и меню определяет вид главного меню и подменю, контекстных меню, а также интерфейс проекта с пользователем, т.е. происходящие по выбору пункта меню или нажатию акселератора события. Часть событий с точки зрения пользователя происходит мгновенно, например, переход к редактированию следующего поля или смена текущего индекса в таблице. Другие события, например, редактирование, поднятие справочного окна, приводят к созданию процессов, которые выполняются длительно и взаимодействуют с пользователем по своим правилам. Процессы бывают модальными и немодальными. Из модального процесса (в отличие от немодального) переключение в любой другой процесс невозможно. Например диалог является модальным процессом, а обзор таблицы БД - немодальным. Модальные процессы взаимодействуют с пользователем по правилам, жестко заданным системой, и поэтому с точки зрения программиста мало чем отличаются от событий. Зато интерфейс немодальных процессов задается программистом в описании контекстов.
В общем случае имя контекста может состоять из четырех частей, описывающих сам процесс и объект процесса:
Все события и процессы имеют предопределенные системой имена, называемые опциями. Полный список опций приведен в приложении. Имена процессов и событий, приводящих к созданию этих процессов совпадают. Опция может иметь параметры, которые уточняют действие и/или задают объект действия. Предопределено шесть немодальных процессов: Edit (редактирование), Ins (вставка), ShowWin (просмотр), View (обзор таблицы), Ask (поднятие справочника), Survey (просмотр отчета). Дополнительно для части близких по смыслу немодальных процессов предопределены алиасы, выражающие обобщенные понятия. Так например EdIns является алиасом для Edit и Ins. Смысл алиасов - в возможности выделить общую часть интерфейса нескольких процессов в один общий контекст. Полный список алиасов приведен в таблице.
Опция | Описание | Алиас |
---|---|---|
EdPlane | Редактирование в панели | Edit |
EdTable | Редактирование в рулоне | Edit" |
InsPlane | Вставка в панели | Ins |
InsTable | Вставка в рулоне | Ins |
Edit | Редактирование (в панели или в рулоне) | EdIns |
Ins | Вставка (в панели или в рулоне) | EdIns |
EdIns | Редактирование или вставка | "" (пустая строка) |
View | Обзор (в рулоне) | "" (пустая строка) |
ShowPlane | Просмотр в панели | ShowWin |
ShowTable | Просмотр в рулоне | ShowWin |
Как минимум, в имени контекста должна присутствовать опция или алиас, остальные части можно опустить. Контексты, имя которых состоит только из опции/алиаса, называются системными и относятся ко всем окнам процесса. В имени контекста нельзя указать окно без опции/алиаса, зону - без окна, а поле - без зоны. Следовательно, существует четыре семейства контекстов:
За счет того, что алиасом для EdIns и View является пустая строка, получаются три вырожденных варианта имен контекстов:
Вырожденные варианты относятся к процессам редактирования, вставки и обзора, но не относятся к процессам просмотра и поднятия справочника.
Все части имени контекста должны быть написаны в правильном регистре. Регистр имени окна должен соответствовать тому, на котором имя окна указано в команде открытия окна. Например, после выполнения View(Staff 1) окно Staff может использовать контекст с именем Staff (регистр берется из параметра опции), а после выполнения Edit(@ 0) имя и регистр контекста окна будет определяться начертанием имени подчиненного окна в свойствах зоны, запись которой требуется отредактировать. В случае обнаружения разночтений в момент загрузки окна программист получит предупреждение.
Начиная с версии 14.189.110 контекст View_Окно_Зона считается заместителем контекста Ask_Окно_Зона; если второй не определен, в качестве замены используется первый. Начиная с версии 14.190.050 добавлено исключение: если контекст View_Окно_Зона (или один из его предков) переопределяет действие по клавише Enter, такой контекст в качестве заместителя не используется.
Контекст задает часть интерфейса процесса, то есть соответствие акселераторов и пунктов меню событиям (в том числе поднятию нового меню). Описание контекста начинается с восклицательного знака, за которым следует имя контекста. Весь текст начиная со следующей строки и до начала описания другого контекста состоит из описаний элементов контекста: акселераторов и меню. Например, системный контекст EdTable определен следующим образом.
!EdTable PrvRec(Save) | CtrlUp PrvRec(NoSave) | AltUp PrvRec | Up NxtRec(Save) | CtrlDown NxtRec(NoSave) | AltDown NxtRec | Down
Контекст EdTable содержит определение шести акселераторов. Текст определения акселератора должен находиться на одной строке; слева от символа '|' определяется список событий, а справа - список последовательностей комбинаций клавиш, каждая из последовательностей приводит к наступлению событий из списка событий. Элементы списка разделяются запятыми. К примеру, приведенное ниже описание акселератора нужно понимать так: либо по нажатию комбинации CtrlH, либо по нажатию последовательности из двух комбинаций клавиш AltF5 и AltF6 происходят следующие события: запускается процесс CALL для выполнения процедуры DspRep.DspRp, после успешного завершения запускается средство просмотра отчетов Survey.
!Example CALL(DspRep.DspRp()), Survey | AltF5 AltF6, CtrlH
В большинстве случаев описание событий гораздо разумнее помещать в меню. Предыдущий пример можно переделать так:
!Example Menu | F9 [CF DR] CALL(DspRep.DspRp()), Survey | AltF5 AltF6, CtrlH | "DspRp {С}уточный отчет диспетчера" EndMenu
В данном случае по нажатию кнопки F9 в окне Example поднимается всплывающее меню из одного пункта: "Суточный отчет диспетчера". Такое меню называют контекстным. В квадратных скобках определены атрибуты меню: комбинация из возможных символов "BCDFMRTW".
Символ | Сокращение | Описание |
---|---|---|
B | bar | Строчное меню. Как правило в виде строчного меню оформляется главное меню проекта |
C | classic | Классическое выпадающее меню |
D | dependent | Позиция меню зависит от позиции верхнего окна или меню |
F | frame | Меню с рамкой. Как правило классическое меню задается с рамкой, а строчное - без нее |
M | main | Главное меню проекта. Будет автоматически подниматься при отсутствии окон на экране |
R | removal | Смысла не имеет, разрешен только для совместимости с предыдущими версиями |
T | title | Меню имеет заголовок. Имеет смысл только в консольной версии для меню с рамкой |
W | wide | Вместе с атрибутом 'B' означает строчное меню, автоматически расширяемое на весь экран |
Если указан атрибут T, в той же строке можно определить заголовок меню в двойных кавычках. Если же не указан атрибут D, в той же строке необходимо определить позицию меню (x, y). По умолчанию используется позиция (0, 0).
Menu [CFTR] "заголовок меню" (10, 5) ... EndMenu
Контекст может быть определен через описания других контекстов, как показано ниже, это называется арифметикой контекстов. В результирующем контексте можно доопределять акселераторы.
!Ask=ViewAskCommon+ForAsk
!Ask=ViewAskCommon EnterCur | Enter
Полное определение синтаксиса файлов контекстов в виде правил Бекуса-Наура (BNF) можно посмотреть в приложении "Синтаксис файлов контекстов и меню".
Описания меню и контекстов физически находятся в файлах двух типов: файлах контекстов и файлах меню. Файлы обоих типов имеют расширение MNU. Каждый контекст можно описать только в одном файле контекстов и только один раз. В момент создания нового процесса исполнительной системой производится поиск контекстов для заполнения стека в следующем порядке.
При использовании арифметики контекстов файл, в котором хранится родительский контекст, может быть указан явно, например
!RWayS3 = RWayS.RWayS
Имеется ввиду, что контекст RWayS3 определяется через контекст RWays, находящийся в файле меню RWayS.mnu
Описание меню (подменю) может быть
вынесено из файла контекстов в отдельный файл
меню; в этом случае в файле контекстов пишется
вызов:
Menu(MenuFileName)
| | "Пункт 1"
а в файле MenuFileName.mnu описывается тело меню:
Menu(MenuFileName)
[CF DR]
Bell | |
"Подпункт 1"
Separator
Bell | |
"Подпункт 2"
EndMenu
По нажатию комбинации клавиш Alt+Ctrl+Shift+F10 исполняется опция EditCont. Если поднято меню, будет выполнен переход в редактор Ted на строку описания текущего пункта меню, если меню нет - на описание верхнего контекста из стека контекстов.
Файлы контекстов кэшируются и могут быть перечитаны по сигналу NPM в момент перехода от процесса к процессу. Пункт меню программиста (Ctrl+Shift+F1) "Отладка - Кэш файлов контекстов и меню" позволяет увидеть кэш MNU-файлов и список ошибок. Кроме того, ошибки, обнаруженные в файлах контекстов и меню, протоколируются в журнал событий Проект.ecn. Если исходные файлы из текущего стека контекстов содержат ошибки, отображается системный красный промпт. Пункт меню, содержащий ошибку в описании, выделяется красным цветом текста; при попытке выбрать его система выдаст сообщение об ошибке.
Каждому процессу соответствует упорядоченный набор контекстов - стек контекстов из не более чем 10 элементов. На вершине стека находится контекст с наиболее точно заданной областью действия, далее по расширению области действия. В самом низу стека располагается особый системный контекст Global, действующий в любом процессе для любого окна. Если B является алиасом для A, в стеке A будет расположен выше B. Если контекст A определен через контекст B (см. ниже), в стеке A будет расположен выше B.
Стек контекстов формируется единожды в момент создания процесса последовательной установкой контекста Global, затем контекстов из системного, оконного и зонного семейства. Файлы контекстов и меню могут быть перечитаны по сигналу NPM в момент переключения процессов. В результате перечитывания может исчезнуть контекст, задействованный в стеке существующего процесса, и/или появиться новый контекст, теоретически подходящий процессу. В первом случае контекст будет изъят из стека, во втором - стек останется без изменений. Пункт меню программиста (Ctrl+Shift+F1) "Прочее - Информация о текущем процессе" позволяет увидеть стек контекстов текущего процесса.
В ходе исполнения процесса программными обработчиками событий устанавливается/изменяется ASL-интервал стека контекстов (методом FORM_PROCESS.ReplaceContexts). И поверх, только на время редактирования поля устанавливается полевое семейство контекстов; в момент перехода в другое поле оно заменяется/удаляется.
Ниже приведен стек процесса редактирования в панельной зоне, составленный в предположении, что все перечисленные контексты определены. На практике часть контекстов обычно не определена.
Контекст, находящийся выше в стеке контекстов, может определить некий акселератор иным образом, нежели нижележащий контекст. В этом случае предпочтение отдается контексту, находящемуся выше в стеке; говорят, что вышележащий контекст перекрыл часть интерфейса нижележащего. Если пользователь попытается выбрать пункт меню, на который назначен акселератор, перекрытый в вышележащем контексте, система отреагирует сообщением об ошибке. Однако для меню, описанных в контексте Global, сделано исключение, в таких меню перекрытый пункт выбрать можно.
Главное меню приложения - строчное меню из контекста Global, помеченное атрибутом M (main). Автоматически поднимается (и не скрывается), когда в приложении нет открытых окон. В момент открытия окна скрывается, но может быть поднято одиночным отжатием клавиши Alt или подведением курсора снизу к заголовку главного окна приложения.
Контекстное меню процесса - меню, назначенное на клавишу F9 в стеке контекстов текущего процесса. Также может быть поднято по отжатию APPS по отжатию правой кнопки мыши в зоне процесса. В контекстное меню процесса в качестве подменю автоматически добавляются меню управления, меню стандартных сервисных процедур, меню рабочего места и меню пользователя, если они определены и непусты.
Меню управления - меню, назначенное на клавишу F6 в стеке контекстов текущего процесса. Также может быть поднято по отжатию правой кнопки мыши с удержанием Shift в зоне процесса.
Меню стандартных сервисных процедур - меню, назначенное на клавишу F7 в стеке контекстов текущего процесса. Также может быть поднято по отжатию правой кнопки мыши с удержанием Alt в зоне процесса.
Меню рабочего места - меню, назначенное на клавишу F8 в стеке контекстов текущего процесса. Также может быть поднято по отжатию правой кнопки мыши с удержанием Ctrl в зоне процесса.
Меню пользователя - специальное меню, которое формируется пользователем из пунктов обычного меню (при помощи пункта метаменю "Добавить в меню пользователя") и хранится в USR-файле пользователя. Текст пункта меню пользователя - это формальный путь к пункту регулярного меню (без начальной комбинации клавиш). Меню пользователя автоматически вклеивается в контекстное меню процесса в качестве подменю, а также может быть явно включено в любое меню при помощи опции UserMenu.
Метаменю - системное контекстное меню, контекстом для которого является пункт обычного меню. Поднимается по отжатию Ctrl+APPS или по отжатию правой кнопки мыши на пункте регулярного меню или меню пользователя. Состав метаменю зависит от конкретного пункта меню.
Текст пункта метаменю | Область применения | Действие |
---|---|---|
"Дополнительно о деловой процедуре" | Пункт любого меню, содержащий деловую процедуру |
Выполнение опции CallBP с поднятым флагом RTI.CallBP_wShift |
"Показывать скрытые пункты (Вкл/Выкл)" | Любой пункт любого меню | Изменение режима показа скрытых пунктов |
"Копировать имя пункта" | Любой пункт любого меню | Копирование в буфер обмена суммарного (от контекста Global) пути к пункту меню |
"Скрыть пункт меню" | Нескрытый пункт регулярного меню | Скрытие пункта |
"Показать пункт меню" | Скрытый пункт регулярного меню в режиме отображения скрытых пунктов | Раскрытие пункта |
"Добавить в меню пользователя" | Пункт регулярного меню, не включенный в меню пользователя | Помещение пункта в меню пользователя |
"Убрать из меню пользователя" | Пункт регулярного меню, включенный в меню
пользователя Любой пункт меню пользователя |
Удаление пункта из меню пользователя |
"Передвинуть выше" | Непервый пункт меню пользователя | Перемещение пункта в меню пользователя |
"Передвинуть ниже" | Непоследний пункт меню пользователя | Перемещение пункта в меню пользователя |
"Вставить сепаратор" | Пункт меню пользователя, перед которым нет сепаратора | Вставка сепаратора в меню пользователя |
"Убрать сепаратор" | Меню пользователя, перед которым есть сепаратор | Удаление сепаратора из меню пользователя |
Различия отображения меню в текстовом и графическом виде сведены в таблицу ниже.
Детали отображения/поведения | Текстовый вид | Графический вид |
---|---|---|
Переключение в другое приложение | Меню не скрывается | Меню скрывается |
Отображение заголовка меню | Отображается на рамке | Не отображается |
Отображение иконки | Не поддерживается | Предопределенные иконки для некоторых опций и текстов пунктов меню (см. ниже) |
Выделение идентификатора пункта меню (см. ниже) | Не выделяется | Цветом текста |
Отображение постфикса идентификатора пункта меню (см. ниже) | Вместе с идентификатором | Второй иконкой (см. ниже), расположенной после текста пункта меню |
Выделение деловой процедуры | Звездочкой | В отсутствие идентификатора пункта меню - звездочкой При наличии идентификатора пункта меню таковой отображается гиперссылкой |
Выделение быстрой клавиши | Цветом текста | Подчеркиванием |
Выделение акселераторов | Не выделяются | Бледно-серым цветом текста |
Выделение верхнего меню | Двойной рамкой | Более светлым цветом фона |
В графическом регулярном меню некоторые типовые опции или тексты пункта меню автоматически снабжаются иконками. Начиная с v14.262.070 иконку можно задать явно, указав идентификатор иконки пункта меню в необязательном четвертом столбце описания пункта меню. Допустимые идентификаторы иконок перечислены в таблице ниже.
!Example
Menu | F9
[CF DR]
CALL(DspRep.DspRp()), Survey | CtrlH | "DspRp {С}уточный отчет диспетчера"
| Reports
EndMenu
Иконка в графическом представлении | Пункты меню, автоматически снабжаемые иконкой | Примечание | ||
---|---|---|---|---|
Вид | Идентификатор иконки | Описание | ||
Коричневый штурвал | Меню управления в локальном меню | |||
Серая шестеренка без оси | Меню стандартных сервисных процедур в локальном меню | |||
Синий компьютер | Меню рабочего места в локальном меню | |||
Синий человечек | Меню пользователя в локальном меню | |||
Звездочка | Опция CallBP | Только в отсутствие идентификатора пункта меню | ||
LookupTables | Синяя лупа | "Справочники" | ||
Properties | Рука с документом | "Свойства", "Все свойства", "Свойства документа" |
При наличии пункта в локальном меню или меню пользователя появляется кнопка на нижней панели | |
Принтер | "Печать", "Печать документов", "Печатать", "Печатать файл" |
При наличии пункта в локальном меню или меню пользователя появляется кнопка на нижней панели | ||
PrintToFile | Синяя стрелка вниз поверх принтера | "Печать в файл" | ||
Reports | Документ в синей рамке | "Отчеты" | ||
ServiceProcedures | Серая шестеренка с синей осью | "Сервисные процедуры" | ||
Summary | Синяя сигма заглавная | "Итоги" | ||
AssociatedDocuments | Синяя стрелка ведет из одного документа в другой | "Связанные документы" | При наличии пункта в локальном меню или меню пользователя появляется кнопка на нижней панели | |
Cut | Красные ножницы | Опция Cut | ||
Copy | Два документа один под другим | Опция Copy, "Изготовление копии", "Метаменю - Копировать имя пункта" |
||
Paste | Документ в желтой рамке | Опция Paste | ||
Delete | Косой красный крест | Опция DelChrR, "Удалить", "Метаменю - Убрать из меню пользователя" |
При наличии пункта в локальном меню или меню пользователя появляется кнопка на нижней панели | |
Insert | Синий плюс | "Добавить", "Метаменю - Выбрать способы доступа к пункту меню", "Метаменю - Добавить в меню пользователя" |
При наличии пункта в локальном меню или меню пользователя появляется кнопка на нижней панели | |
Edit | Две встречные горизонтальные синие стрелки | "Изменить" | При наличии пункта в локальном меню или меню пользователя появляется кнопка на нижней панели | |
Rollback | Синяя полукруглая стрелка влево вниз | "Откат" | При наличии пункта в локальном меню или меню пользователя появляется кнопка на нижней панели | |
Processing | Синяя полукруглая стрелка вправо вниз | "Обработка" | При наличии пункта в локальном меню или меню пользователя появляется кнопка на нижней панели | |
ProcessingLog | Синяя полукруглая стрелка вправо вниз и лупа | "Протокол обработки" | При наличии пункта в локальном меню или меню пользователя появляется кнопка на нижней панели | |
AccountingEntries | Костяшки деревянных счетов | "Проводки", "Проводки по документу" |
При наличии пункта в локальном меню или меню пользователя появляется кнопка на нижней панели | |
AttachedFiles | Черная скрепка | "Прикрепленные файлы" | При наличии пункта в локальном меню или меню пользователя появляется кнопка на нижней панели | |
EntryReferencing | Синие стрелки, ведущие из одной точки в три | "Использование", "Использование за период" | При наличии пункта в локальном меню или меню пользователя появляется кнопка на нижней панели | |
Left | Синяя стрелка влево | |||
Right | Синяя стрелка вправо | |||
Up | Синяя стрелка вверх | |||
Down | Синяя стрелка вниз | |||
List | Три синие точки и тире | Добавлен в версии 14.262.070. При наличии пункта в локальном меню или меню пользователя появляется кнопка на нижней панели |
||
TBS | Решетка | "Оборотно-сальдовая ведомость" | Добавлен в версии 14.263.270. При наличии пункта в локальном меню или меню пользователя появляется кнопка на нижней панели |
Некоторые пункты локального меню или меню пользователя, снабженные иконками, порождают соответствующую кнопку на нижней панели окна. Эти пункты помечены в колонке "Примечания".
Идентификатор пункта меню - идентификатор в начальной части текста пункта меню, распознаваемый на основании следующих критериев.
Если в меню не соблюдено выравнивание (или другие перечисленные выше условия), идентификаторы не распознаются и считаются частью текста. В графическом представлении идентификатор выделяется цветом, а постфикс идентификатора отображается второй иконкой, расположенной после колонки текста.
Постфикс идентификатора пункта меню | Вторая (правая) иконка в графическом представлении | Смысл | |
---|---|---|---|
Вид | Описание | ||
"[W]" | Иконка Word | Отчет - документ MSWord, создаваемый по шаблону | |
"[E]" | Иконка Excel | Отчет - документ MSExcel, создаваемый по базису | |
"[e]" | Иконка Excel с документом | Отчет - документ MSExcel, создаваемый без базиса | |
"[O]" | Иконка Excel с молнией | Отчет - документ MSExcel, использующий сервер автоматизации ASB |