Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб_раб_5.DOC
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
256.51 Кб
Скачать

7 Реализация меню

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

- установка кодов цвета фона и символов с помощью процедур TextBackGround и TextColor или с помощью присвоения кода параметру TextAttr (см. пункт 9);

- перемещение курсора в позицию экрана (X,Y) для вывода очередного пункта меню с помощью процедуры GoToXY(X,Y);

- вывод на экран текста очередного пункта меню с помощью процедуры Write (Name_P[i]) при использовании горизонтального меню или

Writeln (Name_P[i]) при использовании вертикального меню.

При использовании пятого варианта выбора пункта меню (рисунок 8) следует повторить вывод текста первого пункта меню, предварительно изменив цвет фона и символов, обеспечив реализацию выделения пункта.

Способы выбора пункта меню, показанные на рисунках 4 - 8, могут быть реализованы следующим образом.

В первом случае (см. рисунок 4) следует выполнить ввод целого числа и присвоить его значение переменной типа integer или byte.

Например:

Readln(Kod_Kl);

Во втором и третьем - нажать функциональную или символьную клавишу; код клавиши может быть определен с помощью функции ReadKey и присвоен переменной типа Char.

Например:

Kod_Kl:=ReadKey;

В четвертом случае нужно ввести группу символов (мнемонический код) и присвоить ее переменной типа String нужной длины.

Например:

Readln(Kod_Com);

Реализация пятого варианта (с помощью выделенной строки) сложнее предыдущих, но проще при использовании. Она рассмотрена в примере программы Prog_Menu_1 (см. пункт 8).

Контроль правильности ввода при выборе пункта необходим во всех случаях, где выбор выполняется вводом кода (числа, символа, команды и т.п.). Контроль целых чисел может быть выполнен с помощью проверки значения переменной на соответствие заданному диапазону; например: если Kod_Kl < 1 или > 5, то - ошибка (следует выдать сообщение об этом и перейти к повторению ввода). Контроль кода клавиши или символа может быть выполнен с помощью проверки принадлежности кода заданному множеству; например:

if Kod_Kl in ['В', 'Ы', 'O']

then ...

{ввод без ошибок; можно выполнять выбор процедуры для выполнения}

еlsе …{ошибка}

Рекомендуется оформить в виде процедуры группу операций по перемещению курсора в заданное место экрана, установка цветов и выводу текста на экран.

Например:

Procedure Proc1 (Color_Code, Back_Code: byte;

X, Y: integer; Text: string);

Begin

TextColor (Color_Code);

TextBackGround (Back_Code);

{или TextAttr:=16*Back_Code+Color_Code) вместо двух предыдущих операторов}

GoToXY (X, Y);

Write (Text)

End;

………………

В процедурах используются параметры:

Color_Code - код цвета символов,

Back_Code - код цвета фона,

X, Y - координаты начала строки Text, выводимой на экран.

Координаты позиций символов отсчитываются от левого верхнего угла экрана.

8.8 Проектирование структуры программы

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

Рисунок 8.11

Головная часть программы может быть построена по различным вариантам. Например:

а) головная часть содержит операторы, реализующие работу меню и обращение к соответствующим процедурам (см. примеры в данном разделе);

б) все основные операции, включая работу с меню, реализуются в виде процедур и функций, а в головной части организуется обращение к ним.

Ниже приведены примеры организации программ для разных вариантов меню.

{Программа с горизонтальным меню и выбором с помощью указателя (выделения пункта меню)}

Program Prog_Menu_1;

Uses crt;

Type

............

var

Coord_P : array[1..5] of byte; { 5 - количество пунктов меню }

Name_P : array[1..5] of str;

Kod_Kl: char;

............

Procedure Vvod (.....); {Процедуры}

......................

BEGIN {Начало основной части программы}

Coord_P[1]:=7; {Заполнение массивов координат пунктов меню и их

обозначений}

Name_P[1]:='Ввод данных';

.......................

N_P:=1; {Номер пункта меню}

While true do

Begin {Цикл, в котором выполнятся работа с меню:

- задать атрибуты вывода текста всех пунктов меню;

- вывод текста меню в заданные позиции;

- задать атрибуты вывода текста выделенного пункта меню;

пункт с номером N_P;

- вывод текста пункта N_P;

- задать атрибуты вывода текста подсказки;

- вывод текста подсказки в заданные позиции}

Kod_Kl:=readkey; { Чтение кода клавиши }

case Kod_Kl of { Case 1}

#13: Case N_P of {Если нажата клавиша Enter, перейти к выполнению пункта N_P }

1: {Выполнение операций и процедур для пункта 1}

2: {Выполнение операций и процедур для пункта 2}

..................

5: Exit;

end;

{Если клавиша Enter не нажата, то проверка кодов других клавиш: (Left, Right }

#0: case readkey of {case 2}

#77: begin {Если нажата клавиша Right, то:

- задать атрибуты вывода текста всех пунктов меню,

- вывод текста пункта N_P (устранение выделения),

Реализация - если N_P < 5 (число пунктов меню),

«перемещения» по то N_P:=N_P+1,

меню вправо, по кругу иначе N_P:=1;

- задать атрибуты вывода текста выделенного пункта

меню;

- вывод текста пункта N_P,

- задать атрибуты вывода текста подсказки для пункта

N_P,

- вывод текста подсказки в заданную позицию}

end;

#75: begin {Если нажата клавиша Left, то выполнить действия,

аналогичные вышеуказанным, за исключением операций

по изменению N_P:

Реализация «перемещения» - если N_P > 1, то N_P:=N_P-1, по меню

влево, иначе N_P:=5

по кругу}

еnd

end {Конец Case 2}

end {Конец Case 1}

end {Конец цикла меню}.

END. {Конец программы}

{Пример фрагмента программы с реализацией выбора функции с помощью функциональных клавиш}

................

while true do {цикл для выбора функций программы через меню}

begin

MENU; {процедура вывода текста меню}

repeat {цикл ввода кода функциональной клавиши}

Kod_kl:=readkey;

until Kod_kl=#0;

Kod_kl:=readkey;

case Kod_kl of {выбор процедуры по коду клавиши}

#59: Proc_F1; {F1}

#60: Proc_F2; {F2}

.........

#63: End_of_Work {F5}

end

end;

...............

{Пример программы с горизонтальным меню и выбором с помощью ввода номера пункта меню или иного обозначения (символа, группы символов)}

Program Prog_Menu_2;

Uses crt;

Type

............

Var

Coord_P : array[1..5] of byte; {5 - количество пунктов меню}

Name_P : array[1..5] of str;

Kod_Kl: char; (или integer)

............

Procedure Vvod(.....); {Процедуры}

......................

BEGIN {Начало основной части программы}

Coord_P[1]:=7; {Заполнение массивов координат пунктов меню и их обозначений}

Name_P[1]:='Ввод данных';

.......................

While true do

Begin {Цикл, в котором выполнятся работа с меню}

{Задать атрибуты вывода текста всех пунктов меню}

{Вывод текста меню в заданные позиции}

{Задать атрибуты вывода выделенных символов в пунктах меню (номера или буквы, или

группы символов)}

{Вывод выделенных символов в каждом пункте меню}

{Задать атрибуты вывода текста подсказки}

{Вывод текста подсказки в заданные позиции}

Kod_Kl:=readkey; { или Readln(Kod_Kl)}

{Если введенный код допустим, то

- анализ его значения и вызов соответствующей процедуры,

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

Например:

if Kod_Kl in ['1'..'5'] then

case Kod_Kl of

'1': Vvod;

'2': .........

............

'5': Exit

end

else

begin

{Вывод сообщения об ошибке}

…………

end

END. {Конец программы}