Ввод с клавиатуры
|
Lazarus IDE: Основы программирования в Windows
Несмотря на то, что всё потихоньку уходит в сеть, программирование для настольных компьютеров остаётся востребованным. И будет таковым ещё долго. Ну а самая распространённая операционная система для настольных компьютеров – это по-прежнему Windows. Поэтому любой программист, даже если он собирается стать веб-разработчиком, должен знать хотя бы основы создания программ для Windows. Подробнее... |
Ввод с клавиатуры используется наиболее часто, потому что практически в любой программе нужно получать от пользователя какие-то данные.
В этой статье мы будем рассматривать только ввод с клавиатуры. Ввод данных с других устройств - это уже более сложная тема, которую начинающим можно пока и не изучать.
Чтобы получить какие-либо данные от пользователя, в частности, данные, которые пользователь вводит с клавиатуры, в любом языке программирования используются стандартные функции ввода-вывода. Одну из функций Паскаля вы уже знаете: это функция ReadLn. Точнее, в Паскале это процедура, но это в данном случае не так важно.
Процедура ReadLn читает одно или несколько значений из файла или стандартного устройства ввода данных. В нашем случае это будет клавиатура, но вообще это может быть и другое устройство, например, COM-порт компьютера.
Процедура ReadLn после прочтения данных из файла переводит указатель файла на новую строку. Если в этом нет необходимости, то можно использовать процедуру Read, которая выполняет аналогичные действия, но не переводит указатель файла на новую строку. Синтаксис процедуры Read следующий:
procedure Read(var Файл;
Параметры);
если выполняется чтение из стандартного устройства ввода (например, с клавиатуры), то файл не указывается:
procedure Read(Параметры);
Файл - это файловая переменная.
Параметры - это одна или несколько переменных, которые могут иметь тип данных Char, Integer, Real или String.
Если в качестве параметров передаются несколько переменных, то они должны быть одного типа. Каждое значение пользователь должен вводить через пробел. Это не является интуитивно понятным, поэтому использовать несколько параметров без крайней необходимости я не рекомендую.
Работу с файлами мы уже изучали, поэтому здесь описывать работу с файлами я не буду.
Есть ещё две стандартных подпрограммы, которые могут вам пригодиться при создании консольных приложений.
Первая называется KeyPressed и объявлена в модуле CRT следующим образом:
function KeyPressed : boolean;
Она ожидает нажатия любой клавиши на клавиатуре. Если клавиша нажата, то функция возвращает TRUE. Иначе FALSE. Например, следующий код
repeat
WriteLn('Press any key...');
until KeyPressed;
будет выводить строку 'Press any key...' до тех пор, пока пользователь не нажмёт какую-нибудь клавишу.
Очень часто возникает необходимость знать, какую именно клавишу нажал пользователь. Сделать это можно с помощью функции ReadKey, которая также объявлена в модуле CRT:
function ReadKey : Char;
Эта функция возвращает ASCII-код клавиши, которую нажал пользователь. Если пользователь нажал дополнительную или функциональную клавишу, то эта функция возвращает #0. Чтобы узнать код дополнительной или функциональной клавиши, нужно вызвать функцию ещё ReadKey раз.
Всё это вы поймёте из примера, который приведён ниже.
program kb;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Classes,
CRT //Подключить этот модуль!!!
{ you can add units after this };
var Q, E : Char;
begin
WriteLn('ESC - Выход. Нажмите любую клавишу...');
repeat
Q := ReadKey; //Читаем код нажатой клавиши
case Q of //Если это функциональная клавиша
#0 : begin
E := ReadKey; //то читаем расширенный код
case E of
#45 : WriteLn('ALT + X');
#59 : WriteLn('F1');
#60 : WriteLn('F2');
else WriteLn('Unknow key. Code: ', Ord(E));
end;
end;
#9 : WriteLn('TAB');
#13 : WriteLn('ENTER');
#32 : WriteLn('SPACE');
else WriteLn('Unknow key. Code: ', Ord(Q));
end;
until Q = #27;
end.
Надеюсь, что у вас уже достаточно знаний, чтобы разобраться в этом коде. Ну а если вам что-то непонятно, то это может быть только по двум причинам: 1) вы случайно попали на эту страницу, 2) вы пропустили предыдущие уроки. Если это так, то начинайте сначала здесь: ОСНОВЫ ПРОГРАММИРОВАНИЯ.
Обратите внимание на подключение модуля CRT в начале программы. Модули мы с вами пока не изучали, поэтому просто повторите этот код. Если не подключить модуль CRT, то функции ReadKey и KeyPressed не будут работать.
С помощью рассмотренных в этой статье функций можно создать уже вполне приличную и вполне удобную для пользователя программу. Так что, несмотря на то, что сегодня “рулят” оконные приложения, советую изучить вам этот материал. В жизни пригодится...