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


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

Ранее были рассмотрены примеры одноуровневых меню. Но гораздо чаще в программах встречаются меню многоуровневые - иерархические.

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

Программа этого примера состоит из тринадцати связанных форм, образующих меню следующей структуры:

структура меню примера

Каждое меню, в свою очередь, включает несколько пунктов. В этой программе их количество изменяется от одного до двенадцати. Но никаких действий при их выборе программа не выполняет. Поскольку это лишь пример навигации по системе многоуровневого меню, а обработка такого количества действий затруднила бы его восприятие.

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

Далее приведены виды экранных форм программы примера.

главное меню

Это главное меню программы, в него же происходит переход при её запуске. В это меню можно попасть из любого другого если несколько раз подряд нажать кнопку ВЫХОД. Но из главного выходить уже некуда - выше него в иерерхической системе меню этого примера ничего нет.

меню 1

Меню 1 имеет второй уровень и содержит пункты, позволяющие перейти к меню 4, 5 и 6 нажатием кнопки ВВОД. Выход из него - при нажатии одноимённой кнопки - происходит в главное меню.

меню 2

Меню 2 позволяет перейти к меню 7, 8 и 9. Выход в главное меню происходит к строке с названием этого.

меню 3

Меню 3 позволяет перейти к меню 10, 11 и 12. Выход происходит аналогично предыдущим. Все три меню второго уровня (1, 2 и 3) выполнены по одному шаблону и отличаются только текстом сообщений и описанием переходов в таблицах.

меню 4

Меню 4 - первое в программе меню третьего уровня. Содержит единственный пункт, поэтому на нажатие клавиш ВЫБОР видимым образом не реагирует. Хотя форма при этом каждый раз перерисовывается - незаметно для пользователя. Выход происходит в меню 1.

меню 5

Меню 5 содержит два пункта. Выход в меню 1.

меню 6

Меню 6 содержит три пункта. Выход в меню 1.

меню 7

Меню 7 является примером указания активного пункта рамкой, а не инверсией, как сделано во всех меню выше.

Выход производится в меню 2.

меню 8

Меню 8. В этом меню активный пункт дополняется отдельным сообщением.

Выход в меню 2.

меню 9

Меню 9. Пример простейшего использования графики - активный пункт обозначается треугольником слева.

Выход в меню 2.

меню 10

Меню 10. В этом меню изменяются одновременно оба текста, как для выбранного пункта, так и для невыбранного.

Выход в меню 3.

меню 11

Меню 11. А это пример несложного графического меню. Пункты здесь представлены квадратами и расположены в произвольном порядке. Позиции квадратов записаны непосредственно в структуру формы. Активный пункт окружён рамкой, которая перемещается при нажатии клавиш ВЫБОР.

Выход в меню 3.

меню 12

Меню 12. Пример меню с изменяющимся текстом. При нажатии на ВЫБОР ВПРАВО или ВНИЗ текст сообщения в нижней части экрана меняется на следующий, ВЛЕВО или ВВЕРХ - на предыдущий.

Выход происходит в меню 3.

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

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


Пример программы

Файл программы primgui10.mkp на ЯМК - 1921 байт, КС 167357/177

Текст программы primgui10.mkl для кросс-компилятора



.CHARSET 1251
; Файл primgui10
; Пример работы с графическим интерфейсом пользователя
; Пример иерархического меню 
; Регистры памяти не используются

; ====================================================== Начало программы
.ORG 0	
A0:	
	CX		; Обнулить RX и сбросить признак ввода числа
	PP M 9202	; текущая форма - 0 
	PP M 9203	; активный элемент - 0
	2 PP M 9010	; Инициализировать графический экран
	PP M 9200	; ненулевое значение - разрешение графического интерфейса

	.NUML TFORM
	PP M 9201	; главная таблица форм TFORM

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"

;====================================================== Структуры ГИ
; Вся программа для ЭКВМ, которая работает с этими структурами,
; размещена выше и занимает 44 байта.
; 
; Хотя можно было уложиться и в 33, 
; если исключить сообщение об ошибке, 
; которое всё равно не выводится в этой программе.
; Для этого достаточно удалить выделеную выше минусами часть кода
; вместе со строкой STR1.

;===== Главная таблица форм
TFORM:
	.DB 0	; номер формы
	.DA F0	; адрес начала формы 0
		; далее аналогично
	.DB 1	
	.DA F1	
	.DB 2	
	.DA F2	
	.DB 3	
	.DA F3	
	.DB 4	
	.DA F4	
	.DB 5	
	.DA F5	
	.DB 6	
	.DA F6	
	.DB 7	
	.DA F7	
	.DB 8	
	.DA F8	
	.DB 9	
	.DA F9	
	.DB 10	
	.DA F10	
	.DB 11	
	.DA F11	
	.DB 12	
	.DA F12	

	.END	; конец таблицы

;===== Форма 0 - Главное меню
F0:	; Заголовок формы
	.FORM 2, F0DE, F0PI, F0PO, F0PL, F0PR, F0RI, F0KM ; таблица смещений
	; максимальный номер элемента 2 (хотя всего их 3, считая нулевой)
	; Примечание: расположение остальных полей структуры в пределах формы 
	; может быть произвольным

F0DE:	;таблица флагов действий
	.DB 5,5,5
	; В двоичном виде 5 это 00 00 01 01 - установлены флаги "выбор" + "ввод" 
	; См. описание в документации.
	; Выход из этой формы не требуется
				 
F0PI:	
F0PO:	; Таблицы перехода по выходу и входу здесь объединены
	; поскольку команда ВЫХОД не обрабатывается 
	.DB 1,0,2,0,3,0
	; первый байт пары значений - номер формы, второй - элемента

F0PL:	; Таблица переходов по команде "Выбор влево" (и вверх)
	.DB 2,0,1
	; это номера элементов внутри формы - куда перейти с текущего
	; например, с 0 на 2, с 1 на 0 и т.д.

F0PR:	; Таблица переходов по команде "Выбор вправо" (и вниз)
	.DB 1,2,0
	; это номера элементов внутри формы - куда перейти с текущего
	; например, с 0 на 1, с 1 на 2 и т.д.

F0RI:	; основная программа экранной формы 
	.TYPE 0		; шрифт 0
	.TAB 32, 0 		; позиция (X=32,Y=0), координата Y - сверху-вниз 
	.TXTP 16, F0TZ		; TXTP - вывести строку из области памяти программ
				; атрибут 16 - перерисовка, расстояние между символами 1
				; F0TZ - адрес строки с наименованием формы

	.TAB 0, 9		; позиция (0,9)
	.SQU 0, 127, 1	; прямоугольник (127,1) - это линия

	.TAB 2, 20 		; позиция (2,20)
	.TXTP 16, F0T0		; TXTP - вывести строку из области памяти программ
				; атрибут 16 - перерисовка, расстояние между символами 1
				; F0T0 - адрес строки с описанием первого пункта (т.е. нулевого элемента)

				; далее аналогично
	.TAB 2, 30 			
	.TXTP 16, F0T1

	.TAB 2, 40 
	.TXTP 16, F0T2

	.END			; конец основной программы

F0KM:	; Таблица смещений программ элементов команды
	; Эти программы выполняются после основной программы формы
	; и указывают на точку входа для активного элемента
	.DBB F0KM0, F0KM1, F0KM2

F0KM0:	.TAB 0, 20	; установить позицию (0,20) для элемента 0
	.JM F0KME	; перейти к F0KME - общей части программ
	
			; далее аналогично
F0KM1:	.TAB 0, 30
	.JM F0KME
F0KM2:	.TAB 0, 40
				; из последнего элемента переходить не требуется 
				; далее общая часть программ
F0KME:	.SQU 3, 127, 9	; в указанной ранее позиции нарисовать
				; прямоугольник размером 127 на 9
				; с атрибутами 3 - XOR
				; в итоге - инверсия текста сообщения
	.END			; конец программ элементов

;======= Тексты строк к структуре формы не относятся 
;        и могут располагаться в произвольном месте памяти
		
F0TZ:	.TEXT "Главное меню\0"
F0T0:	.TEXT "Выбрать меню 1\0"
F0T1:	.TEXT "Выбрать меню 2\0"
F0T2:	.TEXT "Выбрать меню 3\0"

; ==============
; Следующие три формы (F1,F2,F3) содержат меню второго уровня 
; и устроены одинаковым образом, отличаясь только 
; номерами форм и элементов в таблицах и наименованиями пунктов

;===== Форма 1 - Меню 1
F1:	; Заголовок формы
	.FORM 2, F1DE, F1PI, F1PO, F1PL, F1PR, F1RI, F1KM ; таблица смещений
				; максимальный номер элемента 2 

F1DE:	;таблица флагов действий
	.DB 21,21,21
	; В двоичном виде 21 это 00 01 01 01 - установлены флаги "выбор" + "ввод" + "выход" 
	; См. описание в документации.
				 
F1PI:	; Таблица переходов по команде ВВОД
	.DB 4,0,5,0,6,0		; переходы к F(4,0),F(5,0),F(6,0)

F1PO:	; Таблица перехода по команде ВЫХОД
	.DB 0,0,0,0,0,0		
	; для любого активного элемента 
	; указывают на форму верхнего уровня F(0,0)
	; Здесь на форму 0 с активным элементом 0

	; Примечание. В общем случае это не обязательно - 
	; выход из различных элементов может быть и в разные формы

F1PL:	; Таблица переходов по команде "Выбор влево" (и вверх)
	.DB 2,0,1
	; это номера элементов внутри формы - куда перейти с текущего
	; например, с 0 на 2, с 1 на 0 и т.д.

F1PR:	; Таблица переходов по команде "Выбор вправо" (и вниз)
	.DB 1,2,0
	; это номера элементов внутри формы - куда перейти с текущего
	; например, с 0 на 1, с 1 на 2 и т.д.

F1RI:	; основная программа экранной формы 
	.TYPE 0		; шрифт 0
	.TAB 48, 0 		; позиция (X=34,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, 30 			
	.TXTP 16, F1T1

	.TAB 2, 40 
	.TXTP 16, F1T2

	.END			; конец основной программы

F1KM:	; Таблица смещений программ элементов команды
	.DBB F1KM0, F1KM1, F1KM2

F1KM0:	.TAB 0, 20	; установить позицию (0,20) для элемента 0
	.JM F1KME	; перейти к F0KME - общей части программ

			; далее аналогично
F1KM1:	.TAB 0, 30
	.JM F1KME
F1KM2:	.TAB 0, 40
				; из последнего элемента переходить не требуется 
				; далее общая часть программ
F1KME:	.SQU 3, 127, 9		; в указанной ранее позиции нарисовать
				; прямоугольник размером 127 на 9
				; с атрибутами 3 - XOR
				; в итоге - инверсия текста сообщения
	.END			; конец программ элементов

F1TZ:	.TEXT "Меню 1\0"
F1T0:	.TEXT "Выбрать меню 4\0"
F1T1:	.TEXT "Выбрать меню 5\0"
F1T2:	.TEXT "Выбрать меню 6\0"

;===== Форма 2 - Меню 2
F2:	.FORM 2, F2DE, F2PI, F2PO, F2PL, F2PR, F2RI, F2KM

F2DE:	.DB 21,21,21	; 00 01 01 01 - установлены флаги "выбор" + "ввод" + "выход" 
				 
F2PI:	; Таблица переходов по команде ВВОД
	.DB 7,0,8,0,9,0		; переходы к F(7,0),F(8,0),F(9,0)

F2PO:	; Таблица перехода по команде ВЫХОД
	.DB 0,1,0,1,0,1		; переход к F(0,1)		
	; при возврате в F0 будет активен тот пункт, который 
	; позволяет перейти к этой форме

F2PL:	.DB 2,0,1
F2PR:	.DB 1,2,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, 40 
	.TXTP 16, F2T2

	.END	

F2KM:	.DBB F2KM0, F2KM1, F2KM2

F2KM0:	.TAB 0, 20	
	.JM F2KME
F2KM1:	.TAB 0, 30
	.JM F2KME
F2KM2:	.TAB 0, 40
F2KME:	.SQU 3, 127, 9	
	.END			
F2TZ:	.TEXT "Меню 2\0"
F2T0:	.TEXT "Выбрать меню 7\0"
F2T1:	.TEXT "Выбрать меню 8\0"
F2T2:	.TEXT "Выбрать меню 9\0"

;===== Форма 3 - Меню 3
			
F3:	.FORM 2, F3DE, F3PI, F3PO, F3PL, F3PR, F3RI, F3KM

F3DE:	.DB 21,21,21	; 00 01 01 01 - установлены флаги "выбор" + "ввод" + "выход" 
				 
F3PI:	; Таблица переходов по команде ВВОД
	.DB 10,0,11,0,12,0	; переходы к F(10,0),F(11,0),F(12,0)

F3PO:	; Таблица перехода по команде ВЫХОД
	.DB 0,2,0,2,0,2		; переход к F(0,2)		
	; при возврате в F0 будет активен тот пункт, который 
	; позволяет перейти к этой форме

F3PL:	.DB 2,0,1
F3PR:	.DB 1,2,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, 40 
	.TXTP 16, F3T2

	.END	

F3KM:	.DBB F3KM0, F3KM1, F3KM2

F3KM0:	.TAB 0, 20	
	.JM F3KME
F3KM1:	.TAB 0, 30
	.JM F3KME
F3KM2:	.TAB 0, 40
F3KME:	.SQU 3, 127, 9	
	.END			
F3TZ:	.TEXT "Меню 3\0"
F3T0:	.TEXT "Выбрать меню 10\0"
F3T1:	.TEXT "Выбрать меню 11\0"
F3T2:	.TEXT "Выбрать меню 12\0"

; ==============
; Следующие девять форм (F4...F12) содержат меню нижнего уровня 
; Они устроены одинаковым образом, отличаясь небольшими деталями
; Пункты носят декоративный характер  
; поскольку команда ВВОД для них блокирована

;===== Форма 4 - Меню 4
F4:	.FORM 0, F4DE, F4PI, F4PO, F4PL, F4PR, F4RI, F4KM
			; содержит 1 элемент

F4DE:	.DB 17	; 17 = 00 01 00 01 - установлены флаги "выбор" и "выход" 
				 
F4PI:	; Таблицы переходов по команде ВВОД нет

F4PO:	; Таблица перехода по команде ВЫХОД
	.DB 1,0		; переход к F(1,0)		

F4PL:	
F4PR:	.DB 0	; один элемент - переход только на себя

F4RI:	.TYPE 0	
	.TAB 48, 0 
	.TXTP 16, F4TZ	

	.TAB 0, 9	
	.SQU 0, 127, 1

	.TAB 2, 20
	.TXTP 16, F4T0	

	.END	

F4KM:	.DBB F4KM0

F4KM0:	.TAB 0, 20	
	.SQU 3, 127, 9	
	.END			

F4TZ:	.TEXT "Меню 4\0"
F4T0:	.TEXT "Пункт (4,0)\0"


;===== Форма 5 - Меню 5
F5:	.FORM 1, F5DE, F5PI, F5PO, F5PL, F5PR, F5RI, F5KM
			; содержит 2 элемента
F5DE:	.DB 17,17	; 00 01 00 01 - установлены флаги "выбор" и "выход" 
				 
F5PI:	; Таблицы переходов по команде ВВОД нет
F5PO:	; Таблица перехода по команде ВЫХОД
	.DB 1,1,1,1		; переход к F(1,1)		

F5PL:	
F5PR:	.DB 1,0		; два элемента - таблицы выбора влево и вправо совпадают

F5RI:	.TYPE 0	
	.TAB 48, 0 
	.TXTP 16, F5TZ	

	.TAB 0, 9	
	.SQU 0, 127, 1

	.TAB 2, 20
	.TXTP 16, F5T0	
	
	.TAB 2, 30
	.TXTP 16, F5T1

	.END	

F5KM:	.DBB F5KM0, F5KM1

F5KM0:	.TAB 0, 20	
	.JM F5KME
F5KM1:	.TAB 0, 30

F5KME:	.SQU 3, 127, 9	
	.END			
F5TZ:	.TEXT "Меню 5\0"
F5T0:	.TEXT "Пункт (5,0)\0"
F5T1:	.TEXT "Пункт (5,1)\0"

;===== Форма 6 - Меню 6
F6:	.FORM 2, F6DE, F6PI, F6PO, F6PL, F6PR, F6RI, F6KM
			; содержит 3 элемента
F6DE:	.DB 17,17,17	; 00 01 00 01 - установлены флаги "выбор" и "выход" 
				 
F6PI:	; Таблицы переходов по команде ВВОД нет
F6PO:	; Таблица перехода по команде ВЫХОД
	.DB 1,2,1,2,1,2		; переход к F(1,2)		

F6PL:	.DB 2,0,1
F6PR:	.DB 1,2,0

F6RI:	.TYPE 0	
	.TAB 48, 0 
	.TXTP 16, F6TZ	

	.TAB 0, 9	
	.SQU 0, 127, 1

	.TAB 2, 20
	.TXTP 16, F6T0	
	
	.TAB 2, 30
	.TXTP 16, F6T1

	.TAB 2, 40
	.TXTP 16, F6T2

	.END	

F6KM:	.DBB F6KM0, F6KM1, F6KM2

F6KM0:	.TAB 0, 20	
	.JM F6KME
F6KM1:	.TAB 0, 30
	.JM F6KME
F6KM2:	.TAB 0, 40
F6KME:	.SQU 3, 127, 9	
	.END			
F6TZ:	.TEXT "Меню 6\0"
F6T0:	.TEXT "Пункт (6,0)\0"
F6T1:	.TEXT "Пункт (6,1)\0"
F6T2:	.TEXT "Пункт (6,2)\0"

;===== Форма 7 - Меню 7
F7:	.FORM 1, F7DE, F7PI, F7PO, F7PL, F7PR, F7RI, F7KM
			; содержит 2 элемента
F7DE:	.DB 17,17	; 00 01 00 01 - установлены флаги "выбор" и "выход" 
				 
F7PI:	; Таблицы переходов по команде ВВОД нет
F7PO:	; Таблица перехода по команде ВЫХОД
	.DB 2,0,2,0		; переход к F(2,0)		

F7PL:	
F7PR:	.DB 1,0		; два элемента - таблицы совпадают

F7RI:	.TYPE 0	
	.TAB 48, 0 
	.TXTP 16, F7TZ	

	.TAB 0, 9	
	.SQU 0, 127, 1

	.TAB 2, 20
	.TXTP 16, F7T0	
	
	.TAB 2, 30
	.TXTP 16, F7T1

	.END	

F7KM:	.DBB F7KM0, F7KM1

F7KM0:	.TAB 0, 19	
	.JM F7KME
F7KM1:	.TAB 0, 29

F7KME:	; для указания активного пункта применён вывод рамки
	.FRAME 3, 64, 10	
	.END			
F7TZ:	.TEXT "Меню 7\0"
F7T0:	.TEXT "Пункт (7,0)\0"
F7T1:	.TEXT "Пункт (7,1)\0"

;===== Форма 8 - Меню 8
F8:	.FORM 1, F8DE, F8PI, F8PO, F8PL, F8PR, F8RI, F8KM
			; содержит 2 элемента
F8DE:	.DB 17,17	; 00 01 00 01 - установлены флаги "выбор" и "выход" 
				 
F8PI:	; Таблицы переходов по команде ВВОД нет
F8PO:	; Таблица перехода по команде ВЫХОД
	.DB 2,1,2,1		; переход к F(2,1)		

F8PL:	
F8PR:	.DB 1,0		; два элемента - таблицы совпадают

F8RI:	.TYPE 0	
	.TAB 48, 0 
	.TXTP 16, F8TZ	

	.TAB 0, 9	
	.SQU 0, 127, 1

	.TAB 2, 20
	.TXTP 16, F8T0	
	
	.TAB 2, 30
	.TXTP 16, F8T1

	.END	

F8KM:	.DBB F8KM0, F8KM1

F8KM0:	.TAB 60, 20	
	.JM F8KME
F8KM1:	.TAB 60, 30

F8KME:	; для указания активного пункта применен текст
	.TXTP 16, F8TA
	.END			
F8TZ:	.TEXT "Меню 8\0"
F8T0:	.TEXT "Пункт (8,0)\0"
F8T1:	.TEXT "Пункт (8,1)\0"
F8TA:	.TEXT "- выбран\0"


;===== Форма 9 - Меню 9
F9:	.
	.FORM 1, F9DE, F9PI, F9PO, F9PL, F9PR, F9RI, F9KM
			; содержит 2 элемента
F9DE:	.DB 17,17	; 00 01 00 01 - установлены флаги "выбор" и "выход" 
				 
F9PI:	; Таблицы переходов по команде ВВОД нет
F9PO:	; Таблица перехода по команде ВЫХОД
	.DB 2,2,2,2		; переход к F(2,2)		

F9PL:	
F9PR:	.DB 1,0		; два элемента - таблицы совпадают

F9RI:	.TYPE 0	
	.TAB 48, 0 
	.TXTP 16, F9TZ	

	.TAB 0, 9	
	.SQU 0, 127, 1

	.TAB 10, 20
	.TXTP 16, F9T0	
	
	.TAB 10, 30
	.TXTP 16, F9T1

	.END	

F9KM:	.DBB F9KM0, F9KM1

F9KM0:	.TAB 0, 21	
	.JM F9KME
F9KM1:	.TAB 0, 31

F9KME:	; для указания активного пункта применено изображение треугольника
	.DRAWP 0, UK1		
	.END			
F9TZ:	.TEXT "Меню 9\0"
F9T0:	.TEXT "Пункт (9,0)\0"
F9T1:	.TEXT "Пункт (9,1)\0"
UK1:    .DB 4h,8h 
        .DB 7Fh
        .DB 3Eh
        .DB 1Ch
        .DB 8h


;===== Форма 10 - Меню 10
F10:	.FORM 1, F10DE, F10PI, F10PO, F10PL, F10PR, F10RI, F10KM
			; содержит 2 элемента
F10DE:	.DB 17,17	; 00 01 00 01 - установлены флаги "выбор" и "выход" 
				 
F10PI:	; Таблицы переходов по команде ВВОД нет
F10PO:	; Таблица перехода по команде ВЫХОД
	.DB 3,0,3,0		; переход к F(3,0)		

F10PL:	
F10PR:	.DB 1,0		; два элемента - таблицы совпадают

F10RI:	.TYPE 0	
	.TAB 48, 0 
	.TXTP 16, F10TZ	

	.TAB 0, 9	
	.SQU 0, 127, 1

	; главная программа содержит только заголовок
	; текст пунктов зависит от состояния

	.END	

F10KM:	.DBB F10KM0, F10KM1

F10KM0:	.TAB 2, 20
	.TXTP 16, F10T0A	; текст активного пункта 0
	.TAB 2, 30
	.TXTP, 16, F10T1	; текст неактивного пункта 1
	.END

F10KM1:	.TAB 2, 20
	.TXTP 16, F10T0		; текст неактивного пункта 0
	.TAB 2, 30
	.TXTP 16, F10T1A	; текст активного пункта 1
	.END

F10TZ:	.TEXT "Меню 10\0"
F10T0:	.TEXT "Невыбран пункт (10,0)\0"
F10T1:	.TEXT "Невыбран пункт (10,1)\0"
F10T0A:	.TEXT "Выбран пункт (10,0)\0"
F10T1A:	.TEXT "Выбран пункт (10,1)\0"

;===== Форма 11 - Меню 11
F11:	.FORM 11, F11DE, F11PI, F11PO, F11PL, F11PR, F11RI, F11KM
				; содержит 12 элементов
F11DE:	.DB 17,17,17,17,17, 17,17,17,17,17, 17,17	; 00 01 00 01 - установлены флаги "выбор" и "выход" 
				 
F11PI:	; Таблицы переходов по команде ВВОД нет
F11PO:	; Таблица перехода по команде ВЫХОД
	.DB 3,1,3,1,3,1,3,1,3,1, 3,1,3,1,3,1,3,1,3,1, 3,1,3,1	; переход к F(3,1)		

F11PL:	.DB 11,0,1,2,3,4,5,6,7,8,9,10
F11PR:	.DB 1,2,3,4,5,6,7,8,9,10,11,0		

F11RI:	.TYPE 0	
	.TAB 48, 0 
	.TXTP 16, F11TZ	

	.TAB 0, 9	
	.SQU 0, 127, 1

	; нарисовать двенадцать квадратов, размещённых в произвольных местах экрана
	.TAB 39, 25	; координаты первого квадрата
	.MCALL F11RI1; подпрограмма вывода

	.TAB 47, 38
	.MCALL F11RI1

	.TAB 94, 26
	.MCALL F11RI1

	.TAB 91, 43
	.MCALL F11RI1

	.TAB 33, 48
	.MCALL F11RI1

	.TAB 2, 20
	.MCALL F11RI1

	.TAB 16, 25
	.MCALL F11RI1

	.TAB 76, 36	
	.MCALL F11RI1

	.TAB 105, 39
	.MCALL F11RI1

	.TAB 25, 37
	.MCALL F11RI1

	.TAB 106, 19
	.MCALL F11RI1

	.TAB 55, 12
	.MCALL F11RI1

	.END	
	
F11RI1:  ; подпрограмма вывода квадрата
	.SQU 0, 8, 8
	.RETUM


F11KM:	.DBB F11KM0, F11KM1, F11KM2, F11KM3, F11KM4
	.DBB F11KM5, F11KM6, F11KM7, F11KM8, F11KM9
	.DBB F11KM10, F11KM11


F11KM0:	.TAB 37, 23
	.JM F11KME

F11KM1:	.TAB 45, 36
	.JM F11KME

F11KM2:	.TAB 92, 24
	.JM F11KME

F11KM3:	.TAB 89, 41
	.JM F11KME

F11KM4:	.TAB 31, 46
	.JM F11KME

F11KM5:	.TAB 0, 18
	.JM F11KME

F11KM6:	.TAB 14, 23
	.JM F11KME

F11KM7:	.TAB 74, 34
	.JM F11KME

F11KM8:	.TAB 103, 37
	.JM F11KME

F11KM9:	.TAB 23, 35
	.JM F11KME

F11KM10: 
	.TAB 104, 17
	.JM F11KME

F11KM11:
	.TAB 53, 10

F11KME:	.FRAME 0, 12, 12	; вывод рамки
	.END

F11TZ:	.TEXT "Меню 11\0"


;===== Форма 12 - Меню 12
F12:	.FORM 4, F12DE, F12PI, F12PO, F12PL, F12PR, F12RI, F12KM
			; содержит 5 элементов
F12DE:	.DB 17,17,17,17,17	
	; 17 = 00 01 00 01 - установлены флаги "выбор" и "выход" 
				 
F12PI:	; Таблицы переходов по команде ВВОД нет
F12PO:	; Таблица перехода по команде ВЫХОД
	.DB 3,2,3,2,3,2,3,2,3,2		; переход к F(3,2)		

F12PL:	.DB 4,0,1,2,3
F12PR:	.DB 1,2,3,4,0

F12RI:	.TYPE 0	
	.TAB 48, 0 
	.TXTP 16, F12TZ		; Вывод заголовка

	.TAB 0, 9	
	.SQU 0, 127, 1

	.TAB 8, 12 
	.TXTP 16, F12TZ1	; Вывод подсказки

	.END	

F12KM:	.DBB F12KM0, F12KM1, F12KM2, F12KM3, F12KM4

F12KM0:	.TAB 0, 32
	.TXTP 16, F12T0	; текст пункта 0
	.END

F12KM1:	.TAB 0, 32
	.TXTP 16, F12T1	; текст пункта 1
	.END

F12KM2:	.TAB 0, 32
	.TXTP 16, F12T2	; текст пункта 2
	.END

F12KM3:	.TAB 0, 32
	.TXTP 16, F12T3	; текст пункта 3 - первая строка
	.TAB 0, 40
	.TXTP 16, F12T31 ; текст пункта 3 - вторая строка
	.TAB 0, 48
	.TXTP 16, F12T32 ; текст пункта 3 - третья строка
	.TAB 0, 56
	.TXTP 16, F12T33 ; текст пункта 3 - четвёртая строка
	.END

F12KM4:	.TAB 0, 32
	.TXTP 16, F12T4	; текст пункта 4 - первая строка
	.TAB 0, 40
	.TXTP 16, F12T41 ; текст пункта 4 - вторая строка
	.END


F12TZ:	.TEXT "Меню 12\0"
F12TZ1:	.TEXT "Нажимте клавишу ВЫБОР\0"
F12T0:	.TEXT "Выбран пункт (12,0)\0"
F12T1:	.TEXT "Следующий пункт (12,1)\0"
F12T2:	.TEXT "Далее (12,2)\0"
F12T3:	.TEXT "Здесь может быть\0"
F12T31:	.TEXT "Ваш текст\0"
F12T32:	.TEXT "При этом выбран\0"
F12T33:	.TEXT "пункт (12,3)\0"
F12T4:	.TEXT "Последний пункт меню\0"
F12T41:	.TEXT "(12,4)\0"

.ENDP


В примере приведены основные приёмы программирования многоуровневого меню и экранных форм с текстом и графикой. Но возможности ГИ этим далеко не исчерпываются


НПП "СЕМИКО" (383) 271-01-25 (многоканальный)