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-)

Предыдущий раздел|Следующий раздел

- Главная страница -