Наиболее примитивным способом организации меню является выбор позиции меню по ее порядковому номеру с помощью оператора Case.
Const St : array[1..4] of string[32]=
('П о з и ц и я 1','П о з и ц и я 2',
'П о з и ц и я 3','В ы х о д');
Var i,Switch : byte;
Cond : boolean;
Begin
Fori:=1 to 4 do
Writeln(i:2,' ',St[i]);
Writeln('Укажите позицию меню');
Cond:=false;
Repeat
Readln(Switch);
Case Switch of
1 : Proc1;
2 : Proc2;
3 : Proc3;
4 : Cond:=true;
end;
Until Cond;
Оператор Case формирует обращение к одной из процедур Proc1 .. Proc3 в зависимости от введенного значения переменной Switch.
Более совершенным является формирование такого меню, в котором строка-курсор указывает на выбираемую позицию путем ее цветового выделения. При этом клавиши перемещения курсора обеспечивают видимое передвижение по позициям меню, а активизация выбранной позиции производится нажатием заранее определенной управляющей клавиши (например, Enter или Tab).
Ниже приведен фрагмент программы, реализующей таким способом вертикальное меню. При этом в текст программы не включены функция GetKey и процедура SetCursor, рассмотренные в предыдущих разделах.
UsesCrt,Dos;
Const St : array[1..5] of string[32]=('П о з и ц и я 1',
'П о з и ц и я 2','П о з и ц и я 3',
'П о з и ц и я 4','В ы х о д');
BlueYellow=16*Blue+Yellow; { атрибут выделенной позиции }
LightGrayBlack = 16*LightGray+Black; { атрибут остальных }
{ позиций меню }
UpBorder=10; { верхняя граница рамки }
LeftBorder=18; { левая граница рамки }
LengthString=34; { длина строки-подсветки меню }
MenuCount=5; { кол-во позиций меню }
TypeScreenChar = record{ тип элемента видеопамяти }
Symbol : char; { символ }
Attrib : byte; { атрибут }
end;
ScreenArray = array[1..25,1..80] of ScreenChar;
{ тип видеопамяти }
Var i,
CurrRow,CurrCol, { текущие строка и столбец экрана}
Switch:=(CurrRow-UpBorder) div 2; { движением строки-}
Case Switch of{ курсора }
1 : Proc1;
2 : Proc2;
3 : Proc3;
4 : Proc4;
5 : CondExit:=true;
end;
Until CondExit;
SetCursor($0607); { включение курсора }
End.
В основной программе вначале формируется на экране рамка путем обращения к процедуре Frame. Цвет рамки и фоновый цвет ее внутренней области определяются значением формального параметра Color, которому при обращении присваивается значение константы LightGrayBlack.
После отработки процедуры Frame на экране печатаются строки массива St, определяющие содержание позиций меню. Начальная активизация одной из позиций обеспечивается заданием значений переменным CurrRow (номер текущей строки экрана) и CurrCol (номер текущего столбца экрана), после чего процедура InsertColorString подсвечивает выделенную позицию цветом BlueYellow.
Передвижение строки-курсора по позициям меню осуществляется процедурой MoveCursor, выход из которой производится при нажатии клавишей Enter или Tab. При этом текущее значение переменной CurrRow указывает положение активизированной позиции меню, после чего с помощью оператора Caseосуществляется обращение к процедуре, соответствующей этой позиции.
Аналогичным образом можно организовать формирование горизонтального меню.