ГИ ЭКВМ, создание циклического меню


Главная / ЭКВМ / Программы / Примеры

Ранее были рассмотрены примеры одноуровневых и иерархических меню.

Иерерхические меню имеют граф в виде дерева, в котором для каждого меню (экранной формы) определены меню как более высокого, так и более низкого уровня. В таких интерфейсах, как правило, при помощи команды ВЫХОД рано или поздно можно перейти в меню самого верхнего уровня - то есть главное.

Но в графическом интерфейсе (ГИ) ЭКВМ возможно конструирование системы меню любой топологии. Характерной особенностью представленных здесь циклических меню является нетранзитивность отношения старшинства форм, являющаяся следствием наличия циклов в графе.

Циклическое меню без выбора вариантов

Рассмотрим простейший вариант циклического меню, которое состоит из трёх экранных форм, образующих замкнутый контур. Стрелками здесь показано направление переходов по команде ВВОД.

структура циклического меню - треугольник

Пример не выполняет никаких действий и предназначен для демонстрации возможностей ГИ.

меню 1

Из меню 1 можно по команде ВВОД перейти к меню 2, по команде ВЫХОД - к меню 3.

меню 2

Команды ВЫБОР игнорируются, поскольку выбирать не из чего.

меню 3

Все три меню примера одинаковы по внешнему виду. Различия касаются текстовых строк и описания переходов в таблицах.

Текст программы примера приведён ниже и снабжён необходимыми комментариями.


Пример 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


Циклическое меню с выбором вариантов

Следующий пример позволяет в каждом из меню выбрать направление перехода. Структура данного меню выглядит следующим образом:

структура циклического меню - квадрат

Этот пример также не выполняет никаких действий и предназначен для демонстрации возможностей ГИ.

меню 1

Из меню 1 можно по команде ВВОД перейти к меню 2 или 4, по команде ВЫХОД - к меню 3.

меню 2

Команда ВЫБОР позволяет выбрать направление перехода между формами.

меню 3

Команда ВЫХОД - перейти к противоположной вершине графа.

меню 4

Все четыре меню примера одинаковы по внешнему виду. Различия касаются текстовых строк и описания переходов в таблицах.

Текст программы примера приведён ниже и снабжён комментариями.


Пример 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 (многоканальный)