ГЛАВА 15. МОДУЛЬ CRT. Модуль Crt реализует ряд мощных программ, которые дают Вам полный контроль над возможностями Вашей машины, такими как управление режимами экрана, расширенные коды клавиатуры, цвета, окна и звук. Crt может быть использован только в программах, которые выполняются на IBM PC, AT, PS/2 и совместимых с ними. Одна из основных особенностей Crt - достижение высокой скорости и гибкости операций вывода на экран. Программы, которые не используют модуль Crt посылают выходные данные на экран через DOS, что гораздо медленнее. С использованием модуля Crt, данные посылаются прямо в BIOS, или, для более быстрых операций, прямо в видеопамять. Файлы ввода и вывода. Инициализационный код модуля Crt назначает текстовые файлы Input и Output на монитор, вместо стандартных файлов вводы и вывода DOS. Это соответствует выполнению следующих операторов в начале программы: AssignCrt(Input); Reset(Input); AssignCrt(Output); Reset(Output); Это означает, что переназначение В/В для файлов Input и Output невозможно до тех пор, пока не будет явного назначения ввода и вывода обратно перед выполнением Assign(Input,''); Reset(Input); Assign(Output,''); Reset(Output); Окна. Crt поддерживает простую, но мощную форму окон. Процедура Window позволяет Вам определить окно в любом месте экрана. Когда Вы пишете в такое окно, окно представлено, как если бы Вы использовали весь экран, оставляя часть экрана не тронутой. Другими словами, экран за пределами окна недоступен. Внутри окна строки могут быть вставлены и удалены, курсор переносится при достижении правого края и текст сдвигается вверх при достижении курсором нижней линии. Все экранные координаты, за исключением тех, которые используются для определения окна, задаются относительно текущего окна и экранные координаты (1,1) соответствуют верхнему левому углу экрана. Окном по умолчанию является весь экран. Также поддерживаются режимы для EGA (43 строки) и VGA (50 строк) (См. описание TextMode в главе 15). Специальные символы. Когда идет запись в Output или в файл, который назначен на экран, следующие управляющие символы имеют специальное значение: ─────────────────────────────────────────────────────────────────── Символ Имя Описание ─────────────────────────────────────────────────────────────────── #7 Сигнал Звуковой сигнал через внутренний громкоговоритель. #8 Символ назад Передвигает курсор на один символ назад. Если курсор уже на левой границе текущего окна, ничего не случается. #10 Новая строка Передвигает курсор на одну строку вниз. Если курсор уже внизу текущего окна, текст сдвигается на одну строку вверх. #13 Возврат Возвращает курсор на левый край каретки текущего окна. ─────────────────────────────────────────────────────────────────── Все другие символы будут появляться на экране когда они написаны. Ввод строки. Когда идет чтение из Input или из текстового файла, который назначает на экран, вводится одна строка входного текста за одну операцию. Строка запоминается во внутреннем буфере текстового файла и когда строка читается, этот буфер используется как входной источник. Когда буфер пуст, вводится новая строка. Когда вводятся строки, доступны следующие ключи редактирования: ─────────────────────────────────────────────────────────────────── Ключ редактирования Описание ─────────────────────────────────────────────────────────────────── BackSpace Удаляет последний введенный символ. ESC Удаляет всю входную строку. Enter Завершает входную строку и запоминает маркер конца строки в буфере. (carriage return / line feed) (возврат каретки / новая строка) Ctrl-S Тоже, что и BackSpace. Ctrl-A Тоже, что и ESC. Ctrl-D Выбирает один символ из последней входной строки. Ctrl-F Выбирает последнюю входную строку. Ctrl-Z Завершает входную строку и генерирует маркер конца файла. ─────────────────────────────────────────────────────────────────── Ctrl-Z будет только генерировать маркер конца файла, если переменная CheckEof установлена в True, по умолчанию она равна False. Для того, чтобы проверить состояние клавиатуры и ввести отдельные символы под управлением программы, используйте функции KeyPressed и ReadKey. Константы, типы и переменные. Каждая из констант, типов и переменных, определенных в модуле Crt, кратко обсуждена в этом разделе. Константы. Константы режима Crt. Следующие константы используются как параметры процедуры TextMode: ─────────────────────────────────────────────────────────────────── Константа Значение Описание ─────────────────────────────────────────────────────────────────── BW40 0 40*25 B/W (черно-белый) на цветном адаптере BW80 2 80*25 B/W на цветном адаптере MONO 7 80*25 B/W на нецветном адаптере CO40 1 40*25 цветной CO80 3 80*25 цветной FONT8x8 256 для EGA/VGA 43 и 50 строк C40 CO40 для совместимости с 3.0 C80 CO80 для совместимости с 3.0 ─────────────────────────────────────────────────────────────────── BW40, CO40, BW80 и CO80 представляют 4 цветных текстовых режима, поддерживаемые цветным графическим адаптером CGA. MONO представляет единственный черно-белый текстовый режим, поддерживаемый монохромным адаптером. FONT8x8 представляет 43 и 50 строковые режимы для EGA/VGA. Константы С40 и С80 используются в режиме совместимости с Turbo Pascal 3.0. LastMode возвращает в последний активный текстовый режим после использования графики. Константы цветов текста. Следующие константы используются в процедурах TextColor и TextBackground: ────────────────────────────────── Константа Значение ────────────────────────────────── Black 0 Blue 1 Green 2 Cyan 3 Red 4 Magenta 5 Brown 6 LightGray 7 DarkGray 8 LightBlue 9 LightGreen 10 LightCyan 11 LightRed 12 LightMagenta 13 Yellow 14 White 15 Blink 128 ────────────────────────────────── Цвета представлены числами с 0 до 15 , для более легкого использования цветов можно использовать эти константы вместо чисел. В цветовых текстовых режимах цвет символов выбирается из 16 цветов и фоновый цвет из 8 цветов. Цвет символов может быть также выбран блинкующий. Переменные. В Crt определены переменные: ────────────────────────────────── Переменная Тип ────────────────────────────────── CheckBreak Boolean CheckEof Boolean CheckSnow Boolean DirectVideo Boolean LastMode Word TextAttr Byte WindMin Word WindMax Word ────────────────────────────────── CheckBreak. Разрешает или запрещает проверки для Ctrl-Break. var CheckBreak : Вoolean; Когда CheckBreak в True, нажатие Ctrl-Break будет завершать программу во время ее очередного вывода на экран. Когда CheckBreak в False, нажатие Ctrl-Break не дает эффекта. По умолчанию CheakBreak в True. (Во время выполнения Crt запоминает старый вектор прерывания по ControlBreak, $1B, в глобальную переменную типа pointer-SaveInt1B). CheckEof. Разрешает или запрещает символ конца файла: var CheckEof : Вoolean; Когда CheckEof в True, символ конца файла будет генерироваться, если Вы нажмете Ctrl-Z во время чтения из файла, назначенного на экран. Когда CheckEof равна False, нажатие Ctrl-Z не дает эффекта. По умолчанию CheckEof в False. CheckSnow. Разрешает или запрещает "контроль снега" при запоминании символов прямо в видеопамяти. var CheckSnow : Вoolean; На большинстве типов CGA на экране будут появляться помехи ("снег") при запоминании символов в видеопамяти не во время обратного хода луча трубки терминала. Этого не случится на монохромных адаптерах или адаптерах типа EGA. Когда выбран цветной режим и CheckSnow в True, прямая запись в видеопамять будет производится только во время обратного хода луча. Если Вы работаете с новым исполнением CGA, Вы можете установить CheckSnow в False в начале Вашей программы и после каждого вызова TextMode. Это будет запрещать проверку на "снег", в результате чего скорость вывода значительно возрастает. CheckSnow не оказывает действие, если DirectVideo в False. DirectVideo. Разрешает и запрещает прямой доступ к памяти для Write и Writeln при выводе на экран. var DirectVideo : Boolean; Когда DirectVideo в True, Write и Writeln при выводе в файлы, назначенные на экран, будут запоминать символы в видеопамяти вместо вызова BIOS. Когда DirectVideo в False , все символы будут записываться через вызовы BIOS, что значительно медленнее. DirectVideo по умолчанию всегда в True. Если по каким-либо причинам, Вы хотите выводить символы через вызовы BIOS, установите DirectVideo в False в начале Вашей программы и после каждого вызова TextMode. LastMode. Каждый раз когда вызывается TextMode, текущий видеорежим запоминается в LastMode. Кроме того, LastMode инициализируется при запуске программы в текущий видеорежим. var LastMode : Word; TextAttr. Содержит текущие атрибуты текста. var TextAttr : Byte; Атрибуты текста обычно устанавливаются через вызовы TextColor и TextBackground. Однако, Вы можете установить их прямым запоминанием значения в TextAttr. Информация о цвете кодируется в TextAttr следующим образом: бит 7 6 5 4 3 2 1 0 ┌───┬───┬───┬───┬───┬───┬───┬───┐ │ B │ b │ b │ b │ f │ f │ f │ f │ └───┴───┴───┴───┴───┴───┴───┴───┘ где ffff - 4 битовый цвет символа, bbb - 3 битовый цвет фона, В - бит установки блинкования (мигания). Если Вы используете константы цветов для создания значений TextAttr, помните, что цвет фона может быть выбран только из первых 8 цветов и что он должен быть умножен на 16 для установки его в правильную битовую позицию. Следующий пример выбирает блинкующие желтые символы на синем фоне: TextAttr := Yellow + Blue * 16 + Blink; WindMin и WindMax. Содержат экранные координаты текущего окна. var WindMin, WindMax : Word; Эти переменные устанавливаются вызовом процедуры Window. WindMin определяет верхний левый угол и WindMax определяет нижний правый угол. Координата Х запомнена в младшем байте и координата Y запомнена в старшем байте. Например, Lo(WindMin) выдает координату Х левой границы и Hi(WindMax) выдает координату Y нижней границы окна. Верхний левый угол экрана соответствует (X,Y)=(0,0). Заметим, однако, что для координат, передаваемых в Window и GotoXY, верхний левый угол соответствует (1,1). Процедуры и фуннкции. ─────────────────────────────────────────────────────────────────── Функция Описание ─────────────────────────────────────────────────────────────────── KeyPressed Возвращает True, если на клавиатуре была нажата клавиша, и False в противном случае. ReadKey Читает символ с клавиатуры. WhereX Возвращает Х координату текущей позиции курсора относительно текущего окна. Х - горизонтальная позиция. WhereY Возвращает Y координату текущей позиции курсора относительно текущего окна. Y - вертикальная позиция. ─────────────────────────────────────────────────────────────────── ─────────────────────────────────────────────────────────────────── Процедура Описание ─────────────────────────────────────────────────────────────────── AssignCrt Назначает текстовый файл на экран. ClrEol Удаляет все символы от текущей позиции курсора до конца строки без передвижения курсора. ClrScr Очищает экран и помещает курсор в верхний левый угол. Delay Задержка на указанное число миллисекунд. DelLine Удаляет строку на которой находится курсор и перемещает все строки ниже этой строки на строку вверх. Нижняя строка очищается. GotoXY Позиционирует курсор. Х - горизонтальная позиция и Y - вертикальная позиция. HighVideo Устанавливает высокую интенсивность символов. InsLine Вставляет пустую строку в позиции курсора. LowVideo Устанавливает низкую интенсивность символов. NormVideo Устанавливает нормальную интенсивность символов. NoSound Выключает внутренний громкоговоритель. Sound Включает внутренний громкоговоритель. TextBackground Устанавливает цвет фона. TextColor Устанавливает цвет символов. TextMode Устанавливает текстовый режим. Window Определяет текстовое окно на экране. ───────────────────────────────────────────────────────────────────