Работа с клавиатурой
Кроме стандартных процедур 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;