ГИ ЭКВМ, создание циклического меню |
Главная / ЭКВМ / Программы / Примеры |
Ранее были рассмотрены примеры одноуровневых и иерархических меню. Иерерхические меню имеют граф в виде дерева, в котором для каждого меню (экранной формы) определены меню как более высокого, так и более низкого уровня. В таких интерфейсах, как правило, при помощи команды ВЫХОД рано или поздно можно перейти в меню самого верхнего уровня - то есть главное. Но в графическом интерфейсе (ГИ) ЭКВМ возможно конструирование системы меню любой топологии. Характерной особенностью представленных здесь циклических меню является нетранзитивность отношения старшинства форм, являющаяся следствием наличия циклов в графе. Циклическое меню без выбора вариантовРассмотрим простейший вариант циклического меню, которое состоит из трёх экранных форм, образующих замкнутый контур. Стрелками здесь показано направление переходов по команде ВВОД. Пример не выполняет никаких действий и предназначен для демонстрации возможностей ГИ.
Текст программы примера приведён ниже и снабжён необходимыми комментариями. Пример 1Файл программы primgui20.mkp на ЯМК - 343 байта, КС 42510/4 Текст программы primgui20.mkl для кросс-компилятора .CHARSET 1251 ; Файл primgui20 ; Пример работы с графическим интерфейсом пользователя ; Пример неиерархического (циклического) меню ; Регистры памяти не используются ; ====================================================== Начало программы .ORG 0 A0: CX ; Обнулить RX и сбросить признак ввода числа 2 PP M 9010 ; Инициализировать графический экран PP M 9200 ; ненулевое значение - разрешение графического интерфейса .NUML TFORM PP M 9201 ; главная таблица форм TFORM 1 PP M 9202 ; текущая форма при запуске - 1 0 PP M 9203 ; активный элемент - 0 A1: 64 ; Код принудительной перерисовки формы A2: PP M 9208 ; Перерисовать форму PP RM 9209 ; Считать результат выполнения операции F X!=0 A3 ; Перейти к опросу клавиатуры при равенстве нулю ; Обработка ошибки интерфейса ; Примечание. Значения 1 и 7 не являются ошибкой, ; но в этом примере ничего нет, кроме переходов между формами, ; поэтому результат всегда должен быть равен нулю .NUML STR1 PP M 9029 ; Вывести строку "Ошибка" R/S ; Останов A3: ; Опрос клавиатуры PP RM 9029 ; Считать код клавиши K NOT ; инверсия (0FFh -> 0) F X!=0 A3 ; если нет нажатия - продолжать опрос K NOT ; повторная инверсия восстанавливает значение в RX GOTO A2 ; Передать код нажатой клавиши в форму ;====================================================== Конец программы STR1: .TEXT "\nОшибка\0" ;===== Главная таблица форм TFORM: ; формы могут иметь произвольные номера от 0 до 252 ; в этой программе нумерация начинается с единицы .DB 1 ; номер формы .DA F1 ; адрес начала формы 1 ; далее аналогично .DB 2 .DA F2 .DB 3 .DA F3 .END ; конец таблицы ;===== Форма 1 F1: ; Заголовок формы .FORM 0, F1DE, F1PI, F1PO, F1PL, F1PR, F1RI, F1KM ; таблица смещений ; максимальный номер элемента 0 (1 элемент) ; смещения в таблицах и переходах указываются относительно начала формы ; (макроопределение .FORM включает установку .BASE) ; Примечание: расположение остальных полей структуры в пределах формы ; может быть произвольным F1DE: ;таблица флагов действий .DB 20 ; В двоичном виде 20 это 00 01 01 00 - установлены флаги "выход" + "ввод" ; См. описание в документации. F1PI: ; ВВОД - перейти к форме 2 .DB 2,0 F1PO: ; ВЫХОД - перейти к форме 3 .DB 3,0 ; первый байт пары значений - номер формы, второй - элемента F1PL: ; Таблица переходов по команде "Выбор влево" (и вверх) F1PR: ; Таблица переходов по команде "Выбор вправо" (и вниз) .DB 0 ; Выбора здесь нет, но таблицы объединены и заполнены формальным значением F1RI: ; основная программа экранной формы .TYPE 0 ; шрифт 0 .TAB 48, 0 ; позиция (X=48,Y=0), координата Y - сверху-вниз .TXTP 16, F1TZ ; TXTP - вывести строку из области памяти программ ; атрибут 16 - перерисовка, расстояние между символами 1 ; F1TZ - адрес строки с наименованием формы .TAB 0, 9 ; позиция (0,9) .SQU 0, 127, 1 ; прямоугольник (127,1) - это линия .TAB 2, 20 ; позиция (2,20) .TXTP 16, F1T0 ; TXTP - вывести строку из области памяти программ ; атрибут 16 - перерисовка, расстояние между символами 1 ; F1T0 - адрес строки с описанием нулевого элемента ; аналогично для текста комментария .TAB 2, 50 .TXTP 16, F1T1 .END ; конец основной программы F1KM: ; Таблица смещений программ элементов команды .DBB F1KM0 ; Здесь только один элемент - нулевой F1KM0: .TAB 0, 20 ; установить позицию (0,20) .SQU 3, 127, 9 ; инверсия текста сообщения .END ; конец программы элемента 0 F1TZ: .TEXT "Меню 1\0" F1T0: .TEXT "Перейти к меню 2\0" F1T1: .TEXT "Выход в меню 3\0" ;===== ; Формы 2 и 3 устроены аналогично форме 1 и отличаются ; только текстовыми сообщениями и адресами форм в таблицах PI и PO ;===== Форма 2 F2: .FORM 0, F2DE, F2PI, F2PO, F2PL, F2PR, F2RI, F2KM ; таблица смещений ; максимальный номер элемента 0 (1 элемент) F2DE: .DB 20 F2PI: ; ВВОД - перейти к форме 3 .DB 3,0 F2PO: ; ВЫХОД - перейти к форме 1 .DB 1,0 F2PL: F2PR: .DB 0 F2RI: .TYPE 0 .TAB 48, 0 .TXTP 16, F2TZ .TAB 0, 9 .SQU 0, 127, 1 .TAB 2, 20 .TXTP 16, F2T0 .TAB 2, 50 .TXTP 16, F2T1 .END F2KM: .DBB F2KM0 F2KM0: .TAB 0, 20 .SQU 3, 127, 9 .END F2TZ: .TEXT "Меню 2\0" F2T0: .TEXT "Перейти к меню 3\0" F2T1: .TEXT "Выход в меню 1\0" ;===== Форма 3 F3: .FORM 0, F3DE, F3PI, F3PO, F3PL, F3PR, F3RI, F3KM ; таблица смещений ; максимальный номер элемента 0 (1 элемент) F3DE: .DB 20 F3PI: ; ВВОД - перейти к форме 1 .DB 1,0 F3PO: ; ВЫХОД - перейти к форме 2 .DB 2,0 F3PL: F3PR: .DB 0 F3RI: .TYPE 0 .TAB 48, 0 .TXTP 16, F3TZ .TAB 0, 9 .SQU 0, 127, 1 .TAB 2, 20 .TXTP 16, F3T0 .TAB 2, 50 .TXTP 16, F3T1 .END F3KM: .DBB F3KM0 F3KM0: .TAB 0, 20 .SQU 3, 127, 9 .END F3TZ: .TEXT "Меню 3\0" F3T0: .TEXT "Перейти к меню 1\0" F3T1: .TEXT "Выход в меню 2\0" .ENDP Циклическое меню с выбором вариантовСледующий пример позволяет в каждом из меню выбрать направление перехода. Структура данного меню выглядит следующим образом: Этот пример также не выполняет никаких действий и предназначен для демонстрации возможностей ГИ.
Текст программы примера приведён ниже и снабжён комментариями. Пример 2Файл программы primgui21.mkp на ЯМК - 583 байта, КС 52505/97 Текст программы primgui21.mkl для кросс-компилятора .CHARSET 1251 ; Файл primgui21 ; Пример работы с графическим интерфейсом пользователя ; Пример неиерархического (циклического) меню с выбором ; Регистры памяти не используются ; ====================================================== Начало программы .ORG 0 A0: CX ; Обнулить RX и сбросить признак ввода числа 2 PP M 9010 ; Инициализировать графический экран PP M 9200 ; ненулевое значение - разрешение графического интерфейса .NUML TFORM PP M 9201 ; главная таблица форм TFORM 1 PP M 9202 ; текущая форма при запуске - 1 0 PP M 9203 ; активный элемент - 0 A1: 64 ; Код принудительной перерисовки формы A2: PP M 9208 ; Перерисовать форму PP RM 9209 ; Считать результат выполнения операции F X!=0 A3 ; Перейти к опросу клавиатуры при равенстве нулю ; Обработка ошибки интерфейса ; Примечание. Значения 1 и 7 не являются ошибкой, ; но в этом примере ничего нет, кроме переходов между формами, ; поэтому результат всегда должен быть равен нулю .NUML STR1 PP M 9029 ; Вывести строку "Ошибка" R/S ; Останов A3: ; Опрос клавиатуры PP RM 9029 ; Считать код клавиши K NOT ; инверсия (0FFh -> 0) F X!=0 A3 ; если нет нажатия - продолжать опрос K NOT ; повторная инверсия восстанавливает значение в RX GOTO A2 ; Передать код нажатой клавиши в форму ;====================================================== Конец программы STR1: .TEXT "\nОшибка\0" ;===== Главная таблица форм TFORM: ; формы могут иметь произвольные номера от 0 до 252 ; в этой программе нумерация начинается с единицы .DB 1 ; номер формы .DA F1 ; адрес начала формы 1 ; далее аналогично .DB 2 .DA F2 .DB 3 .DA F3 .DB 4 .DA F4 .END ; конец таблицы ;===== Форма 1 F1: ; Заголовок формы .FORM 1, F1DE, F1PI, F1PO, F1PL, F1PR, F1RI, F1KM ; таблица смещений ; максимальный номер элемента 1 (2 элемента) F1DE: ;таблица флагов действий .DB 21,21 ; В двоичном виде 21 это 00 01 01 01 - установлены флаги "выход" + "ввод" + "выбор" ; См. описание в документации. F1PI: ; ВВОД - перейти к форме 2 или 4 .DB 2,0,4,0 F1PO: ; ВЫХОД - перейти к форме 3 .DB 3,0,3,0 ; первый байт пары значений - номер формы, второй - элемента F1PL: ; Таблица переходов по команде "Выбор влево" (и вверх) F1PR: ; Таблица переходов по команде "Выбор вправо" (и вниз) .DB 1,0 ; Таблицы объединены, поскольку одинаковы F1RI: ; основная программа экранной формы .TYPE 0 ; шрифт 0 .TAB 48, 0 ; позиция (X=48,Y=0), координата Y - сверху-вниз .TXTP 16, F1TZ ; TXTP - вывести строку из области памяти программ ; атрибут 16 - перерисовка, расстояние между символами 1 ; F1TZ - адрес строки с наименованием формы .TAB 0, 9 ; позиция (0,9) .SQU 0, 127, 1 ; прямоугольник (127,1) - это линия .TAB 2, 20 ; позиция (2,20) .TXTP 16, F1T0 ; TXTP - вывести строку из области памяти программ ; атрибут 16 - перерисовка, расстояние между символами 1 ; F1T0 - адрес строки с описанием элемента 0 .TAB 2, 30 .TXTP 16, F1T1 ; адрес строки с описанием элемента 1 .TAB 2, 50 .TXTP 16, F1T2 .END ; конец основной программы F1KM: ; Таблица смещений программ элементов команды .DBB F1KM0, F1KM1 F1KM0: .TAB 0, 20 ; установить позицию (0,20) .JM F1KME F1KM1: .TAB 0, 30 ; установить позицию (0,30) F1KME: .SQU 3, 127, 9 ; инверсия текста сообщения .END F1TZ: .TEXT "Меню 1\0" F1T0: .TEXT "Перейти к меню 2\0" F1T1: .TEXT "Перейти к меню 4\0" F1T2: .TEXT "Выход в меню 3\0" ;===== ; Формы 2, 3 и 4 устроены аналогично форме 1 и отличаются ; только текстовыми сообщениями и адресами форм в таблицах PI и PO ;===== Форма 2 F2: .FORM 1, F2DE, F2PI, F2PO, F2PL, F2PR, F2RI, F2KM F2DE: .DB 21,21 F2PI: ; ВВОД - перейти к форме 3 или 1 .DB 3,0,1,0 F2PO: ; ВЫХОД - перейти к форме 4 .DB 4,0,4,0 F2PL: F2PR: .DB 1,0 F2RI: .TYPE 0 .TAB 48, 0 .TXTP 16, F2TZ .TAB 0, 9 .SQU 0, 127, 1 .TAB 2, 20 .TXTP 16, F2T0 .TAB 2, 30 .TXTP 16, F2T1 .TAB 2, 50 .TXTP 16, F2T2 .END F2KM: .DBB F2KM0, F2KM1 F2KM0: .TAB 0, 20 .JM F2KME F2KM1: .TAB 0, 30 F2KME: .SQU 3, 127, 9 .END F2TZ: .TEXT "Меню 2\0" F2T0: .TEXT "Перейти к меню 3\0" F2T1: .TEXT "Перейти к меню 1\0" F2T2: .TEXT "Выход в меню 4\0" ;===== Форма 3 F3: .FORM 1, F3DE, F3PI, F3PO, F3PL, F3PR, F3RI, F3KM F3DE: .DB 21,21 F3PI: ; ВВОД - перейти к форме 4 или 2 .DB 4,0,2,0 F3PO: ; ВЫХОД - перейти к форме 1 .DB 1,0,1,0 F3PL: F3PR: .DB 1,0 F3RI: .TYPE 0 .TAB 48, 0 .TXTP 16, F3TZ .TAB 0, 9 .SQU 0, 127, 1 .TAB 2, 20 .TXTP 16, F3T0 .TAB 2, 30 .TXTP 16, F3T1 .TAB 2, 50 .TXTP 16, F3T2 .END F3KM: .DBB F3KM0, F3KM1 F3KM0: .TAB 0, 20 .JM F3KME F3KM1: .TAB 0, 30 F3KME: .SQU 3, 127, 9 .END F3TZ: .TEXT "Меню 3\0" F3T0: .TEXT "Перейти к меню 4\0" F3T1: .TEXT "Перейти к меню 2\0" F3T2: .TEXT "Выход в меню 1\0" ;===== Форма 4 F4: .FORM 1, F4DE, F4PI, F4PO, F4PL, F4PR, F4RI, F4KM F4DE: .DB 21,21 F4PI: ; ВВОД - перейти к форме 1 или 3 .DB 1,0,3,0 F4PO: ; ВЫХОД - перейти к форме 2 .DB 2,0,2,0 F4PL: F4PR: .DB 1,0 F4RI: .TYPE 0 .TAB 48, 0 .TXTP 16, F4TZ .TAB 0, 9 .SQU 0, 127, 1 .TAB 2, 20 .TXTP 16, F4T0 .TAB 2, 30 .TXTP 16, F4T1 .TAB 2, 50 .TXTP 16, F4T2 .END F4KM: .DBB F4KM0, F4KM1 F4KM0: .TAB 0, 20 .JM F4KME F4KM1: .TAB 0, 30 F4KME: .SQU 3, 127, 9 .END F4TZ: .TEXT "Меню 4\0" F4T0: .TEXT "Перейти к меню 1\0" F4T1: .TEXT "Перейти к меню 3\0" F4T2: .TEXT "Выход в меню 2\0" .ENDP Сложность топологии системы меню может быть весьма высокой. Ограничение в количестве форм преодолевается изменением адреса главной таблицы - в программе их может быть несколько. Номера форм при этом будут дублироваться, а при переходе между отдельными частями структуры потребуется изменение адреса в R9201. Не следует, однако, злоупотреблять возможностями ГИ по созданию многомерных лабиринтов из экранных форм в прикладных программах. Но возможности ГИ не исчерпываются статическими экранными формами. Отдельные элементы могут отображаться или нет в зависимости от различных условий, а выводимые тексты - изменяться. Это позволяет объединять однотипные экранные формы, делая программы более компактными. |
||||||||||||||
НПП "СЕМИКО" (383) 271-01-25 (многоканальный) |