§9.4. Модуль Crt
Формирование изображения на экране монитора происходит с помощью дисплейного адаптера (видеокарты). В зависимости от него дисплей может работать в разных текстовых и графических режимах.
Текстовый режим поддерживают все типы адаптеров. В этом режиме каждый символ кодируется одним байтом и занимает от 16х16 до 8х8 точек или пикселов, чем существенно экономится память. В зависимости от типа адаптера и включенного режима количество строк на экране и символов в строке может быть разным: от 40х25 до 120х50, но стандартным является размер экрана в 25 строк по 80 символов.
Черно-белый текстовый режим является частным случаем цветного. Для последнего совместно с кодом самого символа задается байт атрибута цвета. Каждый символ имеет цвет начертания, или цвет переднего плана и цвет фона. Кроме этого символ может мерцать. Эта информация кодируется в байте атрибута символа:
Биты | ||
7 | Бит мерцания | |
6 | Красный | |
Цвет фона | 5 | Зеленый |
4 | Голубой | |
3 | Яркость | |
Цвет символа | 2 | Красный |
1 | Зеленый | |
0 | Голубой |
Таким образом, цвет фона может задаваться восьмью темными тонами, а цвет символа 16-ю, и каждому из них соответствует константа со стандартным именем.
Темные цвета:
0 (Black) – черный;
1 (Blue) – синий;
2 (Green) – зеленый;
3 (Cyan) – голубой;
4 (Red) – красный;
5 (Magenta) – фиолетовый;
6 (Brown) – коричневый;
7 (LightGrau) – светло-серый.
Светлые цвета:
8 (DarkGray) – темно-серый;
9 (LightBlue) – светло-синий;
10 (LightGreen) – светло-зеленый;
11 (LightCyan) – светло-голубой;
12 (LightRed) – светло-красный;
13 (LightMagenta) – светло-фиолетовый;
14 (Yellow) – желтый;
15 (White) – белый.
Начальная координата экрана находится в левом верхнем углу, а увеличение идет по осям Х и Y аналогично записи на бумаге по позициям и строкам. То есть экран в стандартном текстовом режиме выглядит в соответствии с рис. 9.1.

Рис. 9.1. Координаты знакомест в стандартном текстовом режиме монитора
То есть увеличение Х соответствует перебору символов в одной строке слева направо, а увеличение Y – перебору строк сверху вниз.
Работа с экраном в текстовом режиме
Первоначально при запуске программы на экране остается информация от предыдущих действий, для очистки экрана используется процедура
ClrScr;
При этом курсор помещается в верхний левый угол. Операторы Write и Writeln начинают вывод информации с текущей позиции курсора. Поэтому, если управлять положением курсора, то нет необходимости несколько раз использовать оператор Writeln или заключать в апострофы строки пробелов. Для установки курсора в точку с координатами X, Y используется процедура
GoToXY (X, Y:byte);
Для того чтобы узнать, где в текущий момент находится курсор, используются функции
WhereX: byte;
WhereY: byte;
Например:
Var A, B:byte;
Begin
... ...
A:=WhereX;
B:=WhereY;
Write('Курсор находится в столбце ',А,
' и строке ',B);
... ...
Чтобы установить цвет символов и фона, соответственно используются процедуры
TextColor (Color:byte);
TextBackGround (Color:byte);
Они изменяют дальнейший выводимый цвет символов и полей знакомест.
Первоначально ОС сама устанавливает цвета, обычно черный фон и светло-серые символы, но их можно изменить этими процедурами. Если сделать фон и символы одинакового цвета, то они становятся невидимыми. Для закраски всего экрана одним цветом после установки цвета очищается экран:
TextColor (White);
TextBackGround (Blue);
ClrScr;
GoToXY (35,13);
Write ('Середина экрана');
В модуле Crt существуют и другие способы и процедуры для работы с режимами, цветами и курсором на экране.
Работа с клавиатурой
Кроме стандартных процедур 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.
§9.5. Модуль 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 – список каталогов, в которых будет производиться поиск, каталоги разделяются точкой с запятой, например:
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
Основные порталы (построено редакторами)
