Работа с клавиатурой Использование функции ReadKey и KeyPressed в циклах
Принцип работы с клавиатурой в TP Турбо Паскаль содержит несколько простых и ясных средств, которые позволяют организовать эффективное управление программы посредством клавиатуры. Процедуры Read и ReadLN работают со стандартным входным файлом, который отождествлен с консолью, т. е. с клавиатурой и экраном дисплея. На практике это означает, что информация, введенная с клавиатуры, помимо обработки процедурами, будет отображаться на экране.
Как работает ReadLn? Если в разделе описания переменных имеется описание вида: Var Chislo : integer; то выполнение оператора readln (Chislo) будет происходить следующим образом. Программа будет приостановлена в ожидании ввода с клавиатуры символов, изображающих целое число. После ввода этих символов они будут автоматически преобразованы в соответствующие двоичные значения и присвоены переменной Chislo. Аналогично организован прием значений действительного, символьного и строкового типа.
Использование ReadLn при организации циклов repeat X:=Random (76); Y:=Random (23); GoToXY (X, Y); TextColor (Random(15)); write(***); X:=1; Y:=24; write (Для остановки программы наберите Стоп); write (Для продолжения – любую клавишу ); readln(Stop); until (Stop=Стоп) or (Stop =стоп);
Недостатки Read и ReadLn Несмотря на простоту и удобство, стандартные процедуры read и readln не обеспечивают всеж потребностей, возникающих при работе с клавиатурой. Их важнейший недостаток в том, что вместе с приемом символов они выполняют их отображение на экран (так называемое эхо на монитор). В большинстве случаев это либо не нужно, либо недопустимо. Процедуры read и readln редко используются в серьезных программах.
Стандартная функция ReadKey Функция вызывается без параметров, возвращает значение символьного типа и работает следующим образом. Организуется задержка выполнения с ожиданием нажатия клавиши. После того, как нажатие произведено, функция завершает работу, возвращая код нажатой клавиши. Полученное значение можно использовать далее в программе.
Пример работы с функцией ReadKey Program UsereadKey; Uses Crt; Var Sym : Char; Begin ClrScr; while true do begin write (Введите букву - ); Sym := readKey; writeln (Вы ввели букву -, Sym); if Sym = q then Exit end End.
Работа с функциональными и редактирующими клавишами ReadKey позволяет отслеживать нажатие более широкого множества клавиш, опознавая функциональные и редактирующие клавиши и их сочетания с управляющими клавишами Ctrl, Alt, Shift. Всё множество клавиш и их сочетаний с управляющими клавишами разбито на два подмножества, которые обычно называют основным и расширенным наборами.
Основной набор символов В основной набор входят клавиши букв, цифр, разделителей и знаков препинания, их комбинации с клавишей Shift (или, что то же самое, при включенном переключателе CapsLock), а также клавиши Tab, BackSpace, Enter и Esc. Если нажата одна из перечисленных клавиш, то ReadKey возвратит обычный ASCII-код соответствующего символа.
Расширенный набор символов В расширенном наборе содержатся некоторые (не все) клавиши из основного набора в комбинации с клавишами Ctrl и Alt, а также функциональные и редактирующие клавиши. Если нажимается одна из клавиш расширенного набора, то функция ReadKey возвращает символ с кодом 0 (его представление в программе – chr(0) или #0). В этом случае повторное обращение к ReadKey вернет код клавиши из расширенного набора.
Пример программы Program UsereadKey2; Uses Crt; Var Sym : Char; Begin ClrScr; while true do begin write (Нажмите клавишу); Sym := readKey;
Пример программы if Sym <> #0 then begin {основной набор} case Sym of #8 : writeln (Вы нажали BackSpace); #9 : writeln (Вы нажали Tab); #13 : writeln (Вы нажали Enter); #27 : writeln (Вы нажали Esc); else writeln (Вы ввели символ,Sym); end; if Sym = #27 Then Exit end
Пример программы else begin {расширенный набор} Sym := readKey; {повт. чтение: берем расширенный код} writeln (Вы нажали клавишу с кодом, Ord (Sym))); end end End.
Стандартная функция KeyPressed В отличие от ReadKey, она предназначена не для приема кода нажатой клавиши, а для простой проверки, была ли нажата какая-либо клавиша. Эта функция вызывается без параметров и возвращает значение булевого типа: True, если было нажатие, и False в противном случае. Важно понять, что KeyPressed не производит никаких действий с кодом нажатой клавиши, но код может быть далее прочитан функцией ReadKey, например:... if KeyPressed then S := ReadKey;...
Работа с буфером памяти в MS-DOS В системной области DOS имеется небольшой буфер, в который операционная система помещает коды нажатых клавиш. Буфер организован в виде очереди, причем помещение кодов производится в ее хвост, а считывание из головы. Буфер очень невелик и рассчитан на хранение максимум 15 кодов, что соответствует 15 нажатиям. Кстати говоря, иногда встречается такая ситуация, когда та или иная программа не успевает выбирать коды клавиш из буфера (то есть нажатия производятся чаще). Ситуация переполнения буфера индицируется звуковым сигналом, после чего коды вновь нажимаемых клавиш будут пропадать.
Решение задач Составьте программу движения круга вверх, вниз, влево, вправо в зависимости от нажатия клавиш управления курсором. Составьте программу движения бегущей строки. Составьте программу случайного вывода звездочек разного цвета на экран, для вывода запрограммируйте нажатие какой-либо клавиши.