Стартовое значение CheckEOF равно False, т.е. нажатие Ctrl+Z введет в строку символ #26 и не будет иметь управляющего воздействия. Если же поменять значение CheckEOF на True, то можно организовать ввод текстов построчно, заканчивая текст признаком конца файла так же, как это делается в среде MS-DOS по команде
COPY CON FILE.TXT,
например, как в примере на рис. 15.4.
Здесь функция EOF не имеет параметров. Это означает, что она ожидает ввод кода конца файла с текущего устройства, т.е. с
| PROGRAM CopyTextToFile; { программа ввода текста в файл }
| USES CRT;
| VAR
| f : Text; { имя логического файла }
| s : String[126]; { Максимальное число символов в }
| {строке, считываемой через процедуры Read(), ReadLn() }
| BEGIN
| ClrScr; { очистка экрана }
| Assign (f,'file.txt'); { файл на диске - file.txt }
| Rewrite ( f ); { открытие файла для записи }
| WriteLn( 'Введите текст:' );
| CheckEOF := True; { разрешение интерпретации #26 }
Рис. 15.4
- 323 -
| While not EOF do { считывать строки с клавиатуры }
| Begin { пока не нажато Ctrl+ z }
| ReadLn( s );
| WriteLn{ f, s) { запись строки в файл на диске }
| end;
| Close( f ) {закрытие файла на диске }
| END.
Рис. 15.4 (окончание)
клавиатуры через механизм CRT. Если бы не было строки CheckEOF:=True, то цикл WHILE был бы «вечным».
15.3.3. Переменная TextAttr
Переменная TextAttr имеет тип Byte и может принимать значения от 0 до 255. В ней хранятся текущие цветовые атрибуты для фона, символов и атрибут мерцания символов. Каждый из восьми битов переменной TextAttr содержит определенную информацию (табл. 15.4).
Таблица 15.4
Номер бита | 7 | 6 5 4 | 3 2 1 0 |
Что определяет | Мерцание 1 — да 0 — нет | Цвет фона (8 значений) 0*16..7*16 | Цвет символов (16 значений, от 0 до 15) |
Компонент цвета (RGB) | Крас Зел Гол | Ярк Крас Зел Гол |
Зная структуру этого байта, можно написать три функции опроса текущего цветового режима (рис. 15.5).
PROGRAM Test_Colors; { анализ текущих цветов } USES CRT; { подключен модуль CRT } {Бит номер 7(2^7 = 128) содержит 1(True) или 0 (False)?} FUNCTION IsBlinking: Boolean; { проверка мерцания } BEGIN IsBlinking := ( TextAttr and 128 ) = 128; END; |
Рис. 15.5
- 324 -
{Число в битах 4,5,6 (2^4+2^5+2^6=112), деленное на 16 } FUNCTION GetBackGround : Byte; { номер цвета фона } BEGIN GetBackGround := ( TextAttr and 112 ) div 16; END; {Число в битах 0, 1, 2 и 3 (1 + 2^1 + 2^2 + 2^3 = 15) } FUNCTION GetForeGround : Byte; { код цвета символа } BEGIN GetForeGround := TextAttr and 15; END; BEGIN { Вызовы функций } WriteLn( ' Мерцание : ', IsBlinking 5, ' Цвет фона : ', GetBackGround 2, ' символов : ', GetForeGround 2 ); ReadLn { пауза до нажатия клавиши ввода } END. |
Рис. 15.5 (окончание)
Переменную TextAttr можно использовать для управления цветовым режимом вывода символов на экран, с помощью формулы
TextAttr := ЦветСимволов(0..15)+16*ЦветФона(0..7) [+128]
Запись [+128] означает необязательный атрибут мерцания. Когда 128 добавлено, надпись будет мерцать. Если использовать такую форму установки цвета, то становятся почти «бесполезными» процедура TextColor и TextBackGround, которые, вообще говоря, всего лишь изменяют соответствующие биты системной переменной TextAttr.
При «ручном» задании цвета, как это было сделано выше, вместо цифр можно указывать цветовые константы, определяемые модулем CRT (они рассматриваются вместе с процедурами TextColor и TextBackGround), например:
TextAttr: = White + 16 * Red + Blink;
Такая формула задает мерцающий белый цвет на красном фоне.