20. Модуль CRT. Общие принципы организации интерфейса

CRT - еще один стандартный модуль Turbo Pascal^, в котором содержатся разнообразные средства ввода-вывода. Процедуры и функции CRT помогут вам организовать хороший интерфейс в ваших программах. Кроме процедур и функ­ций любой модуль может также содержать описание типов, константы и пере­менные, доступные в пользовательской программе (если имя модуля указано в операторе USES). В модуле CRT определена полезная переменная

VAR TextAttr : BYTE , в ней содержится текущий цвет фона и цвет символов, используемые при выводе на экран процедурами WRITE и WRITELN. Изменив эту переменную, вы задае­те новый цветовой атрибут. Цветовой атрибут строится следующим образом : в четырех младших битах хранится цвет символов (от 0 до 15), в следующих трех битах - цвет фона (от 0 до 7), и старший бит отвечает за мерцание. Пусть, напри­мер, значение переменной TextAttr равно 237, в двоичной записи - это 1110 1101 (если записывать биты от старшего к младшему). Четыре младших бита (1101) дают цвет символов 13, или LightMagenta - светло малиновый; следующие 3бита (110) дают цвет фона 6, или Brown - коричневый, старший бит - единич­ный. Таким образом, будут выводиться мерцающие светло-малиновые символы на коричневом фоне. Из сказанного ясно, что цветовые константы Black ... White определены в CRT точно так же, как и в модуле Graph. Кроме того, определена константа мерцания Blink = 128. Теперь построим нужный цветовой атрибут са­ми : мы хотим вывести желтые мерцающие символы на светло-сером фоне. Пе­ременной TextAttr необходимо присвоить значение 14 (желтые символы) +7 (се­рый фон) * 16 + 128 (мерцание), итого: 14+112+128=254. Столь сложных вычис­лений легко избежать, если пользоваться 16-ричными числами; наш атрибут в 16-ричном виде записывается как $7E+Blink.Теперь рассмотрим некоторые функции и процедуры модуля CRT :

1. FUNCTION KeyPressed : Boolean - возвращает TRUE, если буфер кла­виатуры не пуст (все нажатия клавиш во время работы программы накапливают­ся в специальном участке памяти - буфере клавиатуры, откуда затем поступают в программу). Функция не очищает буфер клавиатуры!

2. FUNCTION ReadKey : Char - считывает символ из буфера клавиатуры, если буфер пуст, то ожидает нажатия клавиши. Эту функцию удобно использо­вать для организации пауз в программе.

3. PROCEDURE Delay(MS: Word) - приостанавливает выполнение про­граммы на MS миллисекунд.

4. PROCEDURE Sound(Hz: Word) - генерирует звуковой сигнал с частотой Hz герц.

5. PROCEDURE NoSound - выключает звуковой сигнал.

6. PROCEDURE Window(X1,Y1X2,Y2:Byte) - определяет на экране тексто­вое окно, заданное координатами верхнего левого и нижнего правого углов. Тек­стовое окно - это прямоугольная область на экране, куда направляется весь вы­вод. Процедура не выполняет никаких видимых действий!

7. PROCEDURE TextBackground(Co/or: Byte) - задает цвет фона для всего последующего вывода.

8. PROCEDURE TextColor(Co/or: Byte) - задает цвет символов для всего последующего вывода. Процедуры TextBackground и TextColor вместе обеспе­чивают те же возможности, что и переменная TextAttr.

9. PROCEDURE ClrScr - очищает текущее окно, используя текущий фоно­вый цвет.

10. PROCEDURE GotoXY(X,Y:Byte) - перемещает курсор в позицию X стро­ки Y текущего окна. Координаты отсчитываются от левого верхнего угла окна.

11. FUNCTION WhereX : Byte и

12. FUNCTION WhereY : Byte - возвращают текущие относительные коор­динаты курсора (позицию и строку).

13. PROCEDURE DelLine - удаляет строку окна, в которой находится кур­сор, все нижние строки автоматически смещаются вверх.

14. PROCEDURE InsLine - вставляет пустую строку перед строкой, в кото­рой находится курсор, все нижние строки автоматически смещаются вниз, и по­следняя строка окна теряется.

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

USES Crt;

VAR X,F : Byte;  S : STRING; Code : Integer; Yes : Boolean;

BEGIN Window(1,1,80,25); TextBackground(7); ClrScr; {очистим экран} RANDOMIZE; F:=RANDOM(10); {загадаем число} Window(26,11,54,13); TextAttr:=$20; ClrScr; {распределим окно ввода}

REPEAT

GotoXY(3,2); WRITE('Введите число от 0 до 9 '); READLN(S);

VAL(S,X,Code);

IF (Code=0)AND(X=F) THEN BEGIN {правильное число}

TextBackground(4); ClrScr; TextColor(15); GotoXY(8,2); WRITE('Вы уга­дали !!!');

REPEAT UNTIL KeyPressed; HALT; END; {неправильное число} TextAttr:=$4F+Blink; ClrScr; Sound(500); Go-

toXY(11,2);

WRITE('ошибка !'); Delay(500); NoSound; { запрос на повторение} TextAttr:=$20; ClrScr; GotoXY(6,2); WRITE('Сдаетесь ? [Y/N]'); IF ReadKey IN ['Y','y'] THEN Halt; UNTIL FALSE;

END.

Вообще говоря, построение интерфейса не требует каких-либо специальных знаний. Главным образом следует руководствоваться здравым смыслом. Но не­которые простейшие правила можно привести:

- на экране не должно быть "мусора";

- пользователь в любой момент работы должен понимать, что от него требу­ется;

- неверный ввод данных не должен приводить к аварийному завершению программы;

- результаты работы должны выводиться в понятном и аккуратном виде.

Модуль CRT предоставляет некоторые средства, позволяющие строить до­вольно хороший интерфейс. Но намного более мощные и удобные средства со­держатся в модуле TpCrt из библиотеки Turbo Professional для языка Паскаль. Эта библиотека не является частью системы программирования Turbo Pascal и из-за ограниченного объема данной книги здесь не описана. Однако автор реко­мендует познакомиться хотя бы с некоторыми из ее возможностей, которые на­верняка вам понравятся.