17. Системы меню
Как правило, информация о предметной области имеет иерархический характер, например, МТУСИ - факультеты - группы - студенты. Для удобного информирования пользователя необходимо обеспечивать постоянные переходы с одного уровня на другой. Вначале выдать меню факультетов. При выборе факультета - выдать меню групп. При выборе группы - выдать меню ее студентов, а при выборе студента - полную информацию о нем. Это движение к более низким уровням, т.е. вниз. Движение в другую сторону (наверх) осуществляется по клавише ESC с выделением пункта, который был ранее выбран при движении вниз. Например, если выдано меню студентов, то при нажатии ESC нужно выдать меню групп с выделением той, к которому относятся студенты.
Такая система меню может быть построена на основе примера 13.1.
Как уже говорилось, что если в T:MENU_ST(ПМ96) немного переделать продукции, то можно сделать программу T:MENU_GR(ПМ), которая выдаст меню групп и т.д. Только нужно следить, чтоб у них счетчики, анализируемые фрагменты и имена продукций были бы различными.
Пример 17.1. Выдать все группы факультета ПМ и при выборе группы - ее студентов, а при выборе студента - всю информацию о нем, обеспечивая возврат по ESC.
Для выдачи меню групп используется программа, которая отличается от программы выдачи меню студентов следующим:
1) Для запоминания выделенного пункта используется параметр PAR(60,N).
2) Для связи номер строки и группы используются метки MT_GR(...).
3) Продукцией T!:LIST_GR(X20) выдаются группы факультета X20=ПМ.
4) Вместо выдачи информации о студенте INFORM_ST(X1) выдается меню студентов группы X10 из примера 13.1 - T:MENU_ST(X10).
Программа выдачи групп и студентов будет иметь вид:
BEG(/91+)
START:IF THEN
B:PAR(60,1) {= выделяется п.1 меню =}
T:MENU_GR(ПМ)
B:HALT();
{== Формирование меню групп факультета X20=ПМ ==}
MENU_GR(X20):IF B:GETPAR(60,X7)
B:#(X7,0) {= Вызов T: до тех пор пока не станет PAR(60,0) =}
THEN
T1:PR_LINE(1,1,"Поиск групп") {= информация в верхней строке =}
T1:PR_LINE(1,25,"Выход - по ESC") {= информация в нижней строке =}
B:NEW(X8) {= место в БЗ, откуда будет стирание =}
B:DELFR(MT_GR) {= метки будут строиться заново =}
B:PAR(50,0) {= счётчик пунктов =}
B:REW(MEMORY) {= открывается в внутренняя память =}
B:A("Группы фак. ",X20,":") {= Заглавие =}
T!:LIST_GR(X20) {= Пункты меню - группы факультета X20) =}
B:REW() {= конец построения меню =}
B:MENU(3,3,X7)
T1:AN_GR() {= анализ выбранной группы с выдачей меню ее студентов =}
B:C(X8); {= стирание - удаление фрагментов БЗ от X8 =}
{== Построение пунктов меню групп и меток MT_GR ==}
LIST_GR(X20):IF ГР(X10,X20) N:MT_GR(_,X10)
B:GETPAR(50,X55) B:+(X55,1,X56) THEN B:PAR(50,X56)
MT_GR(X56,X10) {= связывает пункт X56 с группой X10 =}
B:BK() B:A(X56," ",X10); {= выдача названия группы X10 =}
{== Реакция на нажатую клавишу: нажата ESC ==}
AN_GR():IF D:@@(ESC) THEN B:PAR(60,0); {= выход из меню групп =}
AN_GR():IF D:@@(X51) MT_GR(X51,X10) {= выбран п. X51, т.е. группа X10 =}
THEN
B:PAR(60,X51) {= для возврата в меню групп с выделением п. X51 =}
B:PAR(61,1) {= выделяется п.1 меню студентов =}
T:MENU_ST(X10); {= выдача меню студентов группы X10, см. пример 13.1 =}
<...Сюда добавить продукции примера 13.1, кроме START...>
END(/92+) @BL(91-,92-)
Предыдущий раздел|Следующий раздел