Работа с клавиатурой в 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;
на предыдущую на главную
 
Используются технологии uCoz