Ввод с клавиатуры

Lazarus IDE: Основы программирования в Windows 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 раз.

Всё это вы поймёте из примера, который приведён ниже.

Листинг 24.1. Использование функции 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 не будут работать.

С помощью рассмотренных в этой статье функций можно создать уже вполне приличную и вполне удобную для пользователя программу. Так что, несмотря на то, что сегодня “рулят” оконные приложения, советую изучить вам этот материал. В жизни пригодится...


Инфо-МАСТЕР ®
Все права защищены ©
e-mail: mail@info-master.su

Яндекс.Метрика