- •Разработка Pascal-программ с интерфейсом типа «Меню» с использованием процедур и функций пользователей
- •1 Цель работы
- •2 Задание на лабораторную работу
- •3 Требования к программе
- •4 Порядок выполнения работы
- •5 Структура диалога типа "меню"
- •6 Проектирование размещения информации на экране
- •7 Реализация меню
- •8.8 Проектирование структуры программы
- •8.9 Справки по процедурам, функциям и управляющим параметрам
- •8.10 Варианты заданий
- •8.11 Содержание отчета
- •8.12 Контрольные вопросы
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. {Конец программы}
