Работа с клавиатурой в Borland Pascal
Для работы с клавиатурой в паскале используется оператор readkey.
Для использования этого оператора необходимо подключить модуль CRT.
Если в тексте программы readkey встречается в одиночной форме,
то программа просто ждет нажатия любой клавиши. Это можно использовать
в своих программах при вводе пароля. Если использовать оператор readln,
то все символы видны. Но если мы хотим их скрыть или чтобы вместо текста
на экране появлялись звездочки, то можно (и нужно) использовать readkey.
Вот пример программы:
{Пароль}
uses crt;
const
n=10;
var
key:char;
pass_ar:array[1..n] of char;
pass_count:byte;
password:string;
begin
clrscr;
write('Enter pasword: ');
pass_count:=0;
repeat
inc(pass_count);
key:=readkey;
if key<>#13 then
begin
pass_ar[pass_count]:=key;
write('*');
password:=password+pass_ar[pass_count];
end;
until key=chr(13);
writeln;
writeln(password);
end.
Также с помощью readkey можно ждать нажатия не только любой
клавиши, а только нужной нам. Например следующая конструкция ждет нажатия
клавиши <ENTER>:
uses crt;
var
key:char;
begin
repeat
key:=reakey;
until chr(key)=13;
end.
А теперь можно написать программу управления каким-нибудь объектом с помощью
того же readkey. Например звездочкой (*).
{Управление звездочкой}
uses crt;
var
key:char;
x,y:byte;
begin
clrscr;
gotoxy(40,12);
x:=40;
y:=12;
writeln('*');
repeat
key:=readkey;
case key of
chr(72):begin
clrscr;
dec(y);
if y<1 then y:=25;
gotoxy(x,y);
write('*');
end;
chr(80):begin
clrscr;
inc(y);
if y>25 then y:=1;
gotoxy(x,y);
write('*');
end;
chr(75):begin
clrscr;
dec(x);
if x<1 then x:=80;
gotoxy(x,y);
write('*');
end;
chr(77):begin
clrscr;
inc(x);
if x>80 then x:=1;
gotoxy(x,y);
write('*');
end;
end;
until key=chr(27);
end.
Теперь тоже самое только в графическом режиме и управлять будем не
звездочкой, а окружностью.
{Управление кругом}
uses graph,crt;
var
gd,gm:integer;
key:char;
x,y:word;
begin
clrscr;
gd:=detect;
initgraph(gd,gm,'');
cleardevice;
x:=320;
y:=220;
circle(x,y,50);
repeat
key:=readkey;
case key of
chr(72):begin
cleardevice;
dec(y,5);
if y<50 then y:=429;
circle(x,y,50);
end;
chr(80):begin
cleardevice;
inc(y,5);
if y>429 then y:=50;
circle(x,y,50);
end;
chr(75):begin
cleardevice;
dec(x,5);
if x<50 then x:=589;
circle(x,y,50);
end;
chr(77):begin
cleardevice;
inc(x,5);
if x>589 then x:=50;
circle(x,y,50);
end;
end;
until key=chr(27);
closegraph;
end.
Не секрет, что использование в программах текстовых меню, наподобие: "Для
входа нажмите 1", "Для выхода - 5", и так далее считается дурным тоном.
Значит необходимо создать свое меню. Этим мы сейчас и займемся.
{Меню}
uses crt;
procedure frame;{процедура рисования рамки}
var
x:byte;
begin
textcolor(14);
{рисование верхней рамки меню}
gotoxy(29,7);
write(chr(201));
x:=30;
repeat
gotoxy(x,7);
write(chr(205));
inc(x);
until x=50;
write(chr(187));
{рисование левой боковой рамки меню}
x:=8;
repeat
gotoxy(29,x);
write(chr(186));
inc(x);
until x=14;
{рисование правой боковой рамки меню}
x:=8;
repeat
gotoxy(50,x);
write(chr(186));
inc(x);
until x=14;
{рисование нижней рамки меню}
gotoxy(29,14);
write(chr(200));
x:=30;
repeat
gotoxy(x,14);
write(chr(205));
inc(x);
until x=50;
gotoxy(50,14);
write(chr(188));
end;
procedure punkt;{процедура вывода пунктов меню}
begin
{вывод пунктов меню}
gotoxy(35,8); textcolor(15); write('Exit Menu:');
gotoxy(35,10); textbackground(0); textcolor(2); write('ShutDown...');
gotoxy(35,11); textbackground(0); write('Reboot... ');
gotoxy(35,12); textbackground(0); write('Cancel... ');
end;
{------------------------------ОСНОВНАЯ ПРОГРАММА---------------------------}
type
type_of_3=1..3;
var
key:char;
n:type_of_3;
begin
textbackground(0);
clrscr;
frame;
punkt;
{выделение первого пункта меню}
gotoxy(35,10); textbackground(12); write('ShutDown...');
n:=1;
{перебор пунктов меню}
repeat
key:=readkey;
case key of
chr(80): begin
if n=1 then
begin
gotoxy(35,10); textbackground(0); textcolor(2); write('ShutDown...');
gotoxy(35,11); textbackground(12); write('Reboot... ');
n:=2;
continue;
end;
if n=2 then
begin
gotoxy(35,11); textbackground(0); write('Reboot... ');
gotoxy(35,12); textbackground(12); write('Cancel... ');
n:=3;
continue;
end;
end;
chr(72): begin
if n=2 then
begin
gotoxy(35,10); textbackground(12); textcolor(2); write('ShutDown...');
gotoxy(35,11); textbackground(0); write('Reboot... ');
n:=1;
continue;
end;
if n=3 then
begin
gotoxy(35,11); textbackground(12); write('Reboot... ');
gotoxy(35,12); textbackground(0); write('Cancel... ');
n:=2;
continue;
end;
end;
else
if key=chr(13) then
case n of
1: begin
textbackground(0);
textcolor(7);
clrscr;
writeln('Вы выбрали пункт ShutDown');
end;
2: begin
textbackground(0);
textcolor(7);
clrscr;
writeln('Вы выбрали пункт Reboot');
end;
3: begin
textbackground(0);
textcolor(7);
clrscr;
writeln('Вы выбрали пункт Cancel');
end;
end;
end;
until key=chr(27);
end.
В итоге у вас должно получиться вот такое меню:
Кроме readkey, в паскале есть оператор keypressed (он
тоже находится в модуле CRT). Его также можно использовать для
ожидания нажатия любой клавиши. Например:
Repeat until keypressed;
Или его можно использовать как запасной выход из цикла (например бесконечного),
чтобы программа не подвисала:
If keypressed then break;
Тоже самое только для выхода из программы: if keypressed then halt;
|
|