Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | ||
|
В модуле CRT дополнительные возможности управления клавиатурой реализуются двумя функциями: KeyPressed и ReadKey.
ФункцияKeyPressed возвращает значение типа Boolean, указывающее состояние буфера клавиатуры (False означает, что буфер пуст, а True — что в буфере есть хотя бы один символ, еще не прочитанный программой).
В MS—DOS реализуется так называемый асинхронный буферизованный ввод с клавиатуры. По мере нажатия клавиши, соответствующие коды ASC II помещаются в особый буфер, откуда они могут быть прочитаны программой. Стандартная длина буфера рассчитана на хранение до 16 кодов символов. Если программа достаточно долго не обращается к клавиатуре, а пользователь нажимает клавиши, буфер может оказаться переполненным. В этот момент раздается звуковой сигнал и «лишние» коды теряются. Чтение из буфера обеспечивается процедурами Read/ReadLn и функцией ReadKey. Отметим, что обращение к функции KeyPressed не задерживает исполнения программы: функция немедленно анализирует буфер и возвращает то или иное значение, не дожидаясь нажатия клавиши.
Функция ReadKey. Возвращает значение типа Char. При обращении к этой функции анализируется буфер клавиатуры: если в нем есть хотя бы один не прочитанный символ, код этого символа берется из буфера и возвращается в качестве значения функции, в противном случае функция будет ожидать нажатия на любую клавишу. Ввод символа с помощью этой функции не сопровождается эхоповтором и содержимое экрана не меняется.
Пусть, например, в каком-то месте программы необходимо игнорировать все ранее нажатые клавиши, коды которых еще не прочитаны из буфера, т.е. необходимо очистить буфер. Этого можно достичь следующим способом:
Uses CRT;
var
С: Char;
begin
while KeyPressed do
С:= ReadKey;
………
end.
При использовании процедуры ReadKey необходимо учитывать, что в буфер клавиатуры поступают так называемые коды нажатых клавиш. Если нажимается любая алфавитно-цифровая клавиша, расширенный код совпадает с ASC II - кодом соответствующего символа. Например, если нажимается клавиша с латинской буквой «а» (в нижнем регистре), функция ReadKey возвращает значение chr{97), а если «А» (в верхнем регистре) – значение chr(65). При нажатии функциональных клавиш F1...F10, клавиш управления курсором, клавиш Ins, Home, Del, End, PgUp, PgDn в буфер помещается двубайтная последовательность: сначала символ #0, а затем расширенный код клавиши. Значение #0, возвращаемое функцией ReadKey, используется исключительно для того, чтобы указать программе на генерацию расширенного кода. Получив это значение, программа еще раз обращается к функции, чтобы прочитать расширенный код клавиши.
Следующая простая программа позволит Вам определить расширенный код любой клавиши. Для завершения работы программы необходимо нажать клавишу Esc.
Program DemoOrd;
Uses CRT;
Var
ch:Char;
Begin
repeat
ch:=Readkey;
Writeln(Ord(ch));
until ch=#27
End.
Поработав с этой программой, обнаруживаем, что нажатие некоторых клавиш игнорируется функцией ReadKey. Это, прежде всего, так называемые сдвиговые клавиши – Shift, Ctrl, Alt. Сдвиговые клавиши в MS—DOS обычно используются для переключения регистров клавиатуры и нажимаются в сочетании с другими клавишами. Таким способом, например, различается ввод прописных и строчных букв. Функция также игнорирует переключающие клавиши Caps Lock, NumLock, Scrol Lock.
В таблице 1 привены расширенные коды клавиш, возвращаемые функцией ord(ReadKey). Для режима ввода кириллицы приводятся коды, соответствующие альтернативному варианту кодировки.
Код | Клавиша или комбинация клавищ | Код | Клавиша или комбинация клавищ | ||
Первый байт | Второй байт | Первый байт | Второй байт | ||
Алфавитно-цифровые клавиши | |||||
– | Backspace (Забой) | – | Tab (Табуляция) | ||
– | Enter | – | Пробел | ||
– | ! | – | “ | ||
– | # | – | $ | ||
– | % | – | & | ||
– | ‘ | – | ( | ||
– | ) | – | * | ||
– | + | – | , | ||
– | – | – | . | ||
– | / | 48..57 | – | 0..9 | |
– | : | – | ; | ||
– | < | – | = | ||
– | > | – | ? | ||
– | @ | 65..90 | – | A..Z | |
– | [ | – | \ | ||
– | ] | – | ^ | ||
– | _ | – | ` | ||
97..122 | – | a..z | – | { | |
– | | | – | } | ||
– | 128..159 | – | А..Я | ||
160..175 | – | а...п | 224..239 | – | р..я |
Управляющие клавиши и их сочетание со сдвиговыми | |||||
Ctrl-2 | Shift-Tab | ||||
16..25 | Alt-Q…Alt-P (верхний ряд букв) | 30..38 | Alt-A…Alt-L (средний ряд букв) | ||
44..50 | Alt-Z…Alt-M (нижний ряд букв) | 59..68 | F1…F10 | ||
Home | Курсор вверх | ||||
PgUp | Курсор влево | ||||
Курсор вправо | End | ||||
Курсор вниз | PgDn | ||||
Ins | Del | ||||
84..93 | Shift-F1…Shift-F10 | 94..103 | Ctrl-F1…Ctrl-f10 | ||
104..113 | Alt-F1…Alt-F10 | Ctrl-PrtScr | |||
Ctrl – Курсор влево | Ctrl – Курсор вправо | ||||
Ctrl-End | Ctrl-PgUr | ||||
Ctrl-Home | 120..131 | Alt-1…Alt-= (верхний ряд клавиш) | |||
Ctrl-PgUp |
Для обработки клавиатуры удобно использовать операторы Case.. of в конструкциях вида:
repeat
ch:=readKey;
case ch of
#77: x:=x+1;
#75: x:=x-1;
#72: y:=y-1;
#80: y:=y+1;
end;
…………..
until ch=#27;
………….
Пример программы, которая создает на экране окно синего цвета и кубик белого цвета, затем перемещает его при нажатии клавиш управления указателя.
Program DemoDvigenie;
Uses CRT;
Var
x,y: integer;
ch: char;
Begin
x:=15;
y:=1;
TextBackGround(Blue); {Предварительное создание картинки}
Window(15,1,55,24); {синее окно и белый кубик}
ClrScr;
TextBackGround(White);
Window(x,y,x+1,y);
ClrScr;
repeat
ch:=readKey; {Обработка клавиатуры}
case ch of
#77: x:=x+1;
#75: x:=x-1;
#72: y:=y-1;
#80: y:=y+1;
end;
If x<15 then x:=54; {Если координаты кубика выходят за }
If x>54 then x:=15; { границы окна, то он появляется }
If y<1 then y:=24; {с противоположной стороны окна.}
If y>24 then y:=1;
TextBackGround(Blue); {Перерисовываются окно и кубик,}
Window(15,1,55,24); {а старая картинка закрашивается.}
ClrScr;
TextBackGround(White);
Window(x,y,x+1,y);
ClrScr;
until ch=#27;
End.
Дата публикования: 2015-06-12; Прочитано: 242 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!