Контексты и меню

Содержание

  1. Структура имени контекста
  2. Контекст-заместитель
  3. Синтаксис файлов контекстов и меню
  4. Размещение описаний контекстов
  5. Стек контекстов и перекрытия
  6. Специальные меню
  7. Текстовый и графический виды меню

Структура имени контекста

Подсистема контекстов и меню определяет вид главного меню и подменю, контекстных меню, а также интерфейс проекта с пользователем, т.е. происходящие по выбору пункта меню или нажатию акселератора события. Часть событий с точки зрения пользователя происходит мгновенно, например, переход к редактированию следующего поля или смена текущего индекса в таблице. Другие события, например, редактирование, поднятие справочного окна, приводят к созданию процессов, которые выполняются длительно и взаимодействуют с пользователем по своим правилам. Процессы бывают модальными и немодальными. Из модального процесса (в отличие от немодального) переключение в любой другой процесс невозможно. Например диалог является модальным процессом, а обзор таблицы БД - немодальным. Модальные процессы взаимодействуют с пользователем по правилам, жестко заданным системой, и поэтому с точки зрения программиста мало чем отличаются от событий. Зато интерфейс немодальных процессов задается  программистом в описании контекстов.

В общем случае имя контекста может состоять из четырех частей, описывающих сам процесс и объект процесса:

Все события и процессы имеют предопределенные системой имена, называемые опциями. Полный список опций приведен в приложении. Имена процессов и событий, приводящих к созданию этих процессов совпадают. Опция может иметь параметры, которые уточняют действие и/или задают объект действия. Предопределено шесть немодальных процессов: 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. Каждый контекст можно описать только в одном файле контекстов и только один раз. В момент создания нового процесса исполнительной системой производится поиск контекстов для заполнения стека в следующем порядке.

  1. В файле контекстов, явно назначенном окну в редакторе форм Wed; если нет явного назначения - в файле контекстов с именем, совпадающим с именем окна.
  2. Во всех активных файлах контекстов. Файл контекстов считается активным в данный момент, если хотя бы один контекст из него находится в стеке одного из активных процессов. Следовательно, контексты, относящиеся к определенному окну, могут храниться в заведомо активных на момент обращения файлах контекстов. Например, контексты подчиненных окон могут храниться в файле контекстов базового окна.
  3. В файле контекстов с именем ИмяПроекта.MNU. Поддерживается только для совместимости с предшествующими версиями, использовать не рекомендуется.
  4. В системном файле контекстов V32.MNU. Этот файл хранится вместе с исполняемыми файлами клиента ASB и предназначен для размещения системных контекстов.

При использовании арифметики контекстов файл, в котором хранится родительский контекст, может быть указан явно, например

!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 Рука с документом "Свойства",
"Все свойства",
"Свойства документа"
При наличии пункта в локальном меню или меню пользователя появляется кнопка на нижней панели
Print Принтер "Печать",
"Печать документов",
"Печатать",
"Печатать файл"
При наличии пункта в локальном меню или меню пользователя появляется кнопка на нижней панели
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