Процедуры и функции модуля Crt

Процедура Window (X1, Y1, X2, Y2: Byte) устанавливает текущее окно на экране согласно схеме:

 

(1, 1)        
  (X1, Y1)  
  Текстовое окно  
  (X2, Y2)  
        (Xmax, Ymax)

 

Координаты диагонали окна X1, Y1, X2, Y2всегда отсчитываются от левого верхнего угла экрана в абсолютных координатах и должны удовлетворять следующим условиям:

1<=X1 <X2<=Xmax; 1<=Y1<Y2<=Ymax;

Параметр Xmax может принимать два значения – 40 и 80 (при видеоадаптере MDA/Ytrcules только 80), аYmax – два или одно в зависимости от типа видеоадаптера: 25 (все типы) и 43 или 50 (EGA или VGA соответственно).

После выполнения процедуры Window все операции с экраном относятся к той его части, которая определена координатами X1, Y1, X2, Y2. Отсчет строк и столбцов теперь будет выполняться в координатах текущего окна, и позиция (1, 1) – это верхний угол окна. Часть экрана вне окна практически изымается из обращения и становится невидимой.

При создании очередного окна его координаты всегда даются в «абсолютных» экранных координатах, а не в относительных координатах последнего текстового окна.

 

Переменные WindMax: WordиWindMin: Word – хранят информацию о размерах текущего окна на дисплее. Каждая из переменных хранит одновременно координаты Х и Y в младшем и старшем байтах соответственно. Извлечь значения Х и Y можно с помощью встроенных функций LoиHi:

X1:=Lo(WindMin)+1; X2:=Lo(WindMax)+1;

Y1:=Lo(WindMin)+1; Y2:=Lo(WindMax)+1;

где X1, Y1, X2, Y2– координаты диагонали окна.

 

Здесь ко всем значениям добавлена единица. Это сделано для совмещения с экранными координатами, у которых начало расположено в верхнем левом углу дисплея и имеет координаты (1, 1). В переменных WindMax и WindMin все значения отсчитываются от нуля (начало координат – точка (0, 0)).

Процедура ClrScr– очищает текущее текстовое окно или весь экран. При этом окно как бы закрашивается текущим цветом фона.

Пример.

TextBackGround(Blue);

ClrScr; {поле экрана будет голубым}

Кроме того, процедура ClrScr всегда устанавливает курсор в позицию с координатами (1, 1) в текущем текстовом окне.

 

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

 

Процедура TextMode (M:Word)– переключает текстовый режим вывода информации на дисплей. Для нее в Crt определено восемь констант.

 

Имя = числовое значение Разрешение экрана Цветовой режим
BW40 = 0 40 х 25 Черно-белый при цветом адаптере
CO40 = 1 или C40 = 1 40 х 25 Цветной
BW80 = 2 80 х 25 Черно-белый при цветом адаптере
CO80 = 3 или C80 = 3 80 х 25 Цветной
Mono = 7 80 х 25 Монохроматический на дисплеях MDA/Hercules
Font8х8 = 256 80/40 х 43 Цветной адаптер – EGA
80/40 х 50 Цветной адаптер – VGA
Все остальные числовые значения до 65 535, не являющиеся суммой одной из указанных констант (0, 1, 2, 3, 7), и Font8х8 включают в прцедуре TextMode режим С80.

 

Эти константы используются как параметры процедуры.

Пример.

TextMode(CO80); TextMode(3);

Процедуры одинаковы по своему действию и включают цветовой режим.

 

В качестве параметра процедуры TextMode кроме констант и просто чисел может быть использована и системная переменная LastMode.

Из перечня констант выделяется Font8x8. В переводе она означает «шрифт 8х8» и включает режим большей текстовой вместимости дисплеев с видеоадаптером EGA и VGA, в которых вместо стандартных шрифтов из матриц 8х14 и 8х16 подключаются более мелкие шрифты с матрицей 8х8, что дает увеличение числа строк до 43 (EGA) или 50 (VGA). Эта константа является дополнительной, т.е. прибавляется к выбранному коду режима.

Пример.

TextMode(CO80+Font8x8);

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

Windows (1, 1, Xmax, Ymax); {окно делается равным всему экрану}

DirectVideo ß True; {включает режим прямого вывода}

CheckSnow ß False; {отключает снятие «снега» (CGA)}

NormVideo; {устанавливает стартовый атрибут}

ClrScr; {экран очищается}

LastMode ß Параметр; {параметр в TextMode запоминается}

 

Переменные LastMode. В ней сохраняется текстовый режим работы, который устанавливает последним выполнением процедуры TextMode. Ее значение (типа Word) соответствует разрешенным значениям параметров TextMode. Самое первое значение LastMode соответствует режиму, из которого запускалась программа.

С помощью переменной LastMode можно реализовать «хороший тон» работы программы, когда после ее выполнения восстанавливается исходный текстовый режим:

Пример.

Uses Crt;

Var StartMode: Word;

Begin

StartMode: =LastMode; {сохранение стартового режима}

… {работа в разных режима}

TextMode (StartMode) {восстановление режима}

End.

 

Процедура GoToXY (X, Y: Byte) устанавливает курсор в столбец Х и строку Y текущего окна. GoToXY использует систему координат текущего текстового окна, т.е. координата (1, 1) соответствует левому верхнему углу окна.

Пример.

С помощью процедуры GoToXY вывести строку на экран вертикально:

Program Demo_GoToXY;

Uses Crt;

Procedure VertStr(X, Y:Byte; S:String);

Var Len: Byte Absolute S; {длина строки S}

I: Byte;

Begin

For I:=1 To Len Do {или можно: For I:=1 To Length(s) Do }

Begin

GoToXY(x, y+Pred(i)); {назначение позиции вывода}

Write(S[i]) {вывод очередного символа}

End;

End;

Begin

ClrScr;

VertStr(40,7,’Вертикально!’);

Readln

End.

 

Функции WhereX и WhereY нужны для определения текущего местоположения курсора в текстовом окне. Так, номер столбца можно получить функцией WhereX, а номер строки – WhereY. Эта пара функций обратная процедуре GoToXY.

 

Процедуры InsLine и DelLine работают со строками. Они позволяют «прокручивать» часть текстового окна или весь экран вверх или вниз.

Пример.

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

Program Demo_InsLine;

Uses Crt;

Var I: Byte;

Begin

ClrScr;

For I:=1 To 25 Do

Begin

GoToXY(1,1); InsLine {расчитка места}

Write('Строка N', i);

Delay(200);

End;

Readln

End.

Процедура DelLine удалаяет строку, в которой находится курсор, подтягивая на ее место все нижестоящие строки. При этом освобождается самая нижняя строка окна.

 

Процедуры TextColor (C: Byte) и TextBackGround (C: Byte) записывают в системную переменную TextAttr определенные значения (цвет символа и фона соответственно). Для этих процедур определены константы, соответствующие различным цветам.

 

Процедуры HigeVideo и LowVideo устанавливают бит яркости в значении «да» (1) или «нет» (0). Процедура LowVideo делает цвет выводимых символов темными, а процедура HigeVideo – и делает все символы яркими.

 

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

 

Процедуры HigeVideo, LowVideo, NormVideo действуют на выводимый текст до очередного объявления цвета процедурой TextColor, которая отменяет действие любой из этих процедур.

 

Обязательным системным средством ПК является генератор, к которому подключен встроенный динамик. Подобный звуковой канал способен генерировать только однотональный звук заданной частоты.

 

Процедура Sound(Hz:Word) включает звук с заданной частотой в герцах, который будет продолжатся до тех пор, пока не будет выполнена процедура NoSound. Очень часто процедуры Sound, NoSound используются вместе с процедурой задержки времени Delay(ms:Word), программирующей паузу в миллисекундах.

Пример. Издается ровный звук на частоте 300 Гц продолжительностью 1 с.

Sound(300);

Delay(1000);

NoSound;

Но при этом во время звучания программа будет «стоять».

Опрос клавиатуры

Работа клавиатуры происходит следующим образом. При нажатии любой клавиши возникает аппаратное прерывание, подключающее Dos к обработке вызываемых клавиатурой сигналов, так называемых скан-кодов. Скан-коды выдаются как при нажатии, так и при отпускании клавиш, что, в частности, позволяет обнаруживать одновременное нажатие клавиш. Dos, обработав скан-коды, помещает в специальный буфер клавиатуры результат этой обработки в виде кодов нажатия клавиш. В большинстве случаев в программах не требуется обработка скан-кодов клавиатуры и можно ограничиваться обработкой символов из буфера клавиатуры. Коды, соответствующие клавишам буквенно-численного набора, с учетом переключения регистров клавиш Shift и CapsLock соответствуют ASCII кодировке этих символов.

Буфер клавиатуры организован по принципу очереди: поступающие символы попадают в конец очереди, а выбираются символы из начала очереди. Длина ограничена 15 символами.

 

Функция KeyPressed, не имеющая аргумента, дает значение True, если нажата какая-то клавиша. Она проверяет наличие символов в буфере клавиатуры, не изменяя состояние очереди.

 

Функция ReadKey имеет тип Char и возвращает первый символ из буфера клавиатуры, уменьшая размер очереди. Если очередь пуста, происходит задержка выполнения программы до нажатия клавиши.

 

Функция KeyPressed применяется в программах для проверки факта нажатия какой-либо клавиши, например, ее можно использовать для остановки циклов Repeat или While.

МЕТОДИЧЕСКИЕ УКАЗАНИЯ

Пример 1.


Uses Crt;

Begin

Repeat

Write (‘Этому нет конца’);

Until KeyPressed

End.

Uses Crt;

Begin

While Not KeyPressed Do

Write (‘Этому нет конца’)

End.


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

Пример.

If KeyPressed Then Key:=ReadKey;

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


СОДЕРЖАНИЕ РАБОТЫ: Написать и отладить программу с использованием модулей Crt и Dos для вывода на экран флага некоторой страны (см. вариант). Под флагом написать название страны. Обеспечить возможность передвижения изображения по экрану при нажатии определенных клавиш (см. вариант)

Вар. Флаг Страна Клавиши Вар. Флаг Страна Клавиши
№1 Бельгия
A влево
D вправо
W вверх
S вниз

 

№8 Нидерланды
Z влево
C вправо
S вверх
X вниз

 

№2 Армения
S влево
F вправо
E вверх
D вниз

 

№9 Литва
X влево
V вправо
D вверх
C вниз

 

№3 Австрия
D влево
G вправо
R вверх
F вниз

 

№10 Италия
C влево
B вправо
F вверх
V вниз

 

№4 Ирландия
F влево
H вправо
T вверх
G вниз

 

№11 Россия
V влево
N вправо
G вверх
B вниз

 

№5 Венгрия
G влево
J вправо
Y вверх
H вниз

 

№12 Болгария
B влево
M вправо
H вверх
N вниз

 

№6 Германия
H влево
K вправо
U вверх
J вниз

 

№13 Румыния
N влево
, вправо
J вверх
M вниз

 

№7 Франция
J влево
L вправо
I вверх
K вниз

 

№14 Эстония
K влево
; вправо
O вверх
L вниз

 

Примечание:

Варианты №1, 6, 9, 13 - желтый цвет, №2, 4 – коричневый цвет

Варианты №1, 6, 14 – изменить цвет фона.

ВОПРОСЫ ВЫХОДНОГО КОНТРОЛЯ:

1. Опишите константы модуля Crt.

2. Перечислите переменные модуля Crt.

3. Перечислите подпрограммы модуля Crt.

4. Опишите типы, константы и переменные модуля Dos.

5. Перечислите подпрограммы модуля Dos.

ДОМАШНЕЕ ЗАДАНИЕ

Выучить константы, типы, переменные, подпрограммы модулей Crt и Dos.