Работа с клавиатурой


Кроме стандартных процедур Read и Readln в модуле Crt есть две процедуры, расширяющие возможности работы с клавиатурой.

Функция

ReadKey:char;

считывает один символ с клавиатуры. Его чтение не сопровождается эхо-отображением на экране, что используется в программах с меню и других, требующих постоянного управления с помощью клавиатуры. Более того, с ее помощью можно читать коды управляющих клавиш, чего нельзя сделать с помощью команды Read.

Если нажата не символьная, а управляющая клавиша, то первое считанное число – 0, а код клавиши надо ввести еще раз.

Пример: программа проверки нажатия функциональных клавиш F1-F10.

Program DemoCode;

{ Демонстрационная программа проверки нажатия

функциональных клавиш }

Uses Crt;

Const Esc=27;

F1=59;

F10=68;

Var Ch:char; { символ, вводимый с клавиатуры }

Priznak:boolean;

Begin

TextColor(Yellow); { Буквы желтые }

TextBackGround(Blue); { Фон синий }

ClrScr;

Repeat

Ch:=ReadKey;

If Ord(Ch)=0 then

Begin

Ch:=ReadKey; { второй символ }

If Ord(Ch) in [F1..F10] then

Writeln(

'Нажата функциональная клавиша F',Ord(Ch)-58)

else

Writeln(

'Нажата управляющая клавиша с кодом ',Ord(Ch))

end else

Writeln(

'Нажата символьная клавиша с кодом ', Ord(Ch));

Until Ord(Ch)=Esc;

end.

При обращении к функции

KeyPressed:boolean;

ожидания нажатия клавиши нет, она просто опрашивает буфер клавиатуры и выдает логический результат: True – если в буфере есть какой-либо символ и False – в противном случае.

Работа со звуком

В ПЭВМ есть возможность генерировать звуковые сигналы частотой от 37 Гц до 20 КГц с помощью встроенного динамика. Из программы на Паскале воспроизводятся только чистые тона без искажений. Сила, или громкость звука не регулируется.

Стандартный звуковой сигнал длительностью 0,25 сек и частотой 800 Гц вызывается символом 7 кодовой таблицы, например:

Writeln (‘Ошибка данных’,Chr(7));

Для управления частотой звука и его продолжительностью в модуле Crt предусмотрены следующие процедуры. Включение звука:

Sound(Freq:word);

Целый аргумент указывает частоту звучания в герцах. Звук будет продолжаться, пока не будет выключен.

Отмена (выключение) звука:

NoSound;

Задержка по времени:

Delay (ms:word);

Целый аргумент указывает длительность в миллисекундах. Это универсальная процедура и может использоваться в самых различных целях. Но она использует встроенную схему таймера с интервалом 18,2 раз в секунду, поэтому для точного вычисления времени эту процедуру использовать нельзя.

Таким образом, стандартный звуковой сигнал – это последовательность процедур, например:

Sound (800);

Delay (250);

NoSound;

С помощью этих процедур и операторов цикла можно создавать разнообразные звуковые эффекты, например, проиграть гамму:

Program Gamma;

{ Пример проигрывания гаммы }

Uses Crt;

Const

{Частоты нот гаммы от ДО октавы 1 до ДО октавы 2}

Freq: Array[1..8] of word=(262,294,330,349,392,440,494,524);

VAR

i:integer;

Begin

Repeat

For i:=1 to 8 do Begin

Sound(Freq[i]); { Включение звука }

Delay(500);

NoSound; { Выключение звука }

end

Until KeyPressed;

end.

Модуль DOS

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

В модуле Dos введены процедуры и функции, позволяющие получить доступ к некоторым ресурсам DOS.

 

Для поиска первого и следующего файла с заданным именем используются соответственно процедуры:

FindFirst (Path:String; Attr:Word; Var S:SearchRec);

FindNext (Var S:SearchRec);

Здесь:

Path – путь и имя искомого файла. При отсутствующем пути поиск производится в текущем каталоге, возможно использование шаблонов.

Attr – задаваемые атрибуты файла. В качестве Attr можно использовать константу AnyFile, означающую любые атрибуты.

S – возвращаемая переменная со следующей структурой:

SearchRec=Record

Fill: Array [1..21] of byte;

Attr: byte;

Time: LongInt;

Size: LongInt;

Name: String [12];

end;

Здесь поле Fill содержит служебную информацию DOS.

Attr – реальные атрибуты файла.

Time – дата и время создания файла в упакованном виде.

Size – размер файла в байтах.

Name – имя найденного файла.

Искомый файл может отсутствовать, поэтому после использования этих и некоторых следующих процедур анализируют системную переменную DosError, описанную выше.

Для распаковки времени создания файла используется процедура:

UnpackTime (Time:LongInt; Var DT:DateTime);

Выходным параметром для неё является запись DT, имеющая следующую структуру:

DateTime = Record

Year, Month, Day, Hour, Min, Sec: Word

end;

Пример: вывод списка файлов из текущего каталога, содержащих тексты программ на языке Паскаль.

Program FindPas;

{ Поиск файлов с Паскаль-программами }

Uses Dos;

Var

DT:DateTime;

S:SearchRec;

Begin

Writeln;

FindFirst ('*.pas',AnyFile,S);

While DosError=0 do

Begin

UnpackTime (S.Time,DT);

WriteLn(' Файл ',S.Name,' создан ',

DT.Day,'.',DT.Month,'.',DT.Year,

' время: ',DT.Hour,':',DT.Min,':',DT.Sec,

' размер ',S.Size,' байт');

FindNext (S);

end

end.

Если необходимо искать файлы не в одном, а в нескольких каталогах, то используют функцию

FSearch (Path:PathStr; DirList:String): PathStr;

Тип PathStr является предопределенным:

PathStr=String [79];

Здесь: Path – имя искомого файла, может быть составным.

DirList – список каталогов, в которых будет производиться поиск, каталоги разделяются точкой с запятой, например:

S:= FSearch ('EDIT.EXE','C:\DOS;C:\NC;C:\NU');

В текущем каталоге поиск производится автоматически. В случае удачного поиска переменной присваивается строка, содержащая составное имя файла, в случае неудачи – пустая строка.

Список каталогов используется аналогично принятым правилам в DOS. Обычно в файле автозапуска AUTOEXEC.BAT содержится команда PATH, присваивающая этой переменной окружения имена каталогов, в которых находятся наиболее часто используемые файлы. В этом случае поиск файлов из среды DOS производится не только в текущем и корневом каталогах, но и в каталогах, указанных в этой команде.

Чтобы воспользоваться этой переменной, в модуле DOS введена функция

GetEnv (EnvVar:String):String;

где в качестве аргумента используется имя переменной окружения. Так, если в файле автозапуска указана команда

PATH C:\DOS;C:\WINDOWS;C:\NC ,

то после выполнения

S := GetEnv ('PATH');

S примет значение

C:\DOS;C:\WINDOWS;C:\NC ,

что может являться аргументом функции FSearch.

 

Из составного имени файла можно отдельно выделить полный путь, чисто имя и расширение процедурой

FSplit (Path:PathStr; Var Dir:DirStr; Var Name:NameStr; Var Ext:ExtStr);

Типы определены как

DirStr = String [67];

NameStr = String [8];

ExtStr = String [4];

Пример поиска файла.

Program PoiskFile;

{ Пример программы поиска файла }

Uses Dos;

Var

NameIn,NameFul:PathStr; { входное и составное имя файла }

Dir:DirStr;

Name:NameStr;

Ext:ExtStr;

Begin

Writeln(' Введите имя искомого файла: ');

Readln(NameIn);

NameFul:=FSearch(NameIn,GetEnv('PATH'));

If NameFul='' then

Writeln('Файл ',NameIn,' не найден')

else

Begin

FSplit(NameFul,Dir,Name,Ext);

Writeln('файл ',Name,' с расширением ',Ext,

' найден в каталоге ',Dir)

end

end.

При создании новых файлов часто необходимо знать, достаточно ли места на диске. Для этого можно воспользоваться функциями

DiskSize (Drive:Byte):LongInt;

– определение общего объема указанного логического устройства (диска) в байтах;

DiskFree (Drive:Byte):LongInt;

– определение количества свободных байт на диске.

Номер диска задается как: 0 – текущий, 1 – А, 2 – С и т.д.

 

Для работы с текущей датой и временем используются процедуры:

GetDate ( Var Year,Month,Day,Day_of_week: Word);

– определяет текущую системную дату. Здесь Day_of_week определяет порядковый день недели от 0 до 6, причем 0 означает воскресенье.

Аналогично для установки новой даты:

SetDate (Year,Mount,Day:Word);

Процедура для определения системного времени:

GetTime ( Var Hour,Minute,Second,Hund:Word);

Здесь Hund — сотые доли секунды со значением от 0 до 99. Они определяются приблизительно, так как внутренний генератор переключается 18,2 раза в секунду.

Для установки системного времени применяется процедура

SetTime (Hour,Minute,Second,Hund:Word);

Но бо́льшие возможности дает работа непосредственно с процедурами операционной системы и внешними устройствами.

 

Для работы с прерываниями в модуле DOS предусмотрены две процедуры вызова прерываний.

Intr (IntNo:Byte; Var Regs: Registers);

Здесь:

IntNo – номер прерывания;

Regs – содержимое регистров процессора следующего типа:

Registers = Record

Case integer of

0: (AX,BX,CX,DX,BP,SI,DI,DS,ES,Flags:Word);

1: (AL,AH,BL,BH,CL,CH,DL,DH:Byte);

end;

То есть поля записи соответствуют либо шестнадцатиразрядным, либо восьмиразрядным регистрам процессора. Например, установка графического режима 640х480 точек, 16 цветов:

Var R:Registers;

... ...

R.AH:=0; R.AL:=$12;

Intr ($10,R);

Так как очень часто используется вектор прерывания DOS 21H, то добавлена специальная процедура для работы только с этим прерыванием:

MSDos ( Var Regs:Registers);

полностью эквивалентная

Intr ($21,Regs);

Например, определение версии DOS:

Uses Dos;

Var R:Registers;

... ...

R.AH:=$30;

MSDos ( R );

Writeln ('MS-DOS ',R.AL,'.',R.AH);

... ...



Дата добавления: 2016-06-29; просмотров: 1554;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.025 сек.