trains_hr.gif
 


В ПОМОЩЬ СТУДЕНТУ И ШКОЛЬНИКУ

 


Горбачев Л.И. Основы программирования в среде Turbo Pascal.

[НАЗАД]  [ДАЛЕЕ]

2. Работа с дисплеем в текстовом режиме. Модуль CRT.

   Практически любая программа, разработанная для ЭВМ, использует дисплей для отображения вводимой и выводимой информации. В зависимости от типа используемого в ЭВМ адаптера (устройства, осуществляющего согласованный обмен информацией между каналами различного уровня) всю выводимую на экран дисплея информацию подразделяют на текстовую и графическую. Собственно выделяют текстовый и графический режимы.

    Модуль Crt содержит константы, переменные и подпрограммы, предназначенные для работы с консолью. В отличие от стандартного ввода-вывода, когда он осуществляется через операционную систему, подпрограммы модуля Crt работают с BIOS, и даже непосредственно с видеопамятью.

    При работе с экраном через модуль Crt весь экран разбивается на отдельные строки, а каждая строка - на отдельные позиции, в каждую из которых можно поместить один символ (в том числе и пробел). Таким образом, весь экран разбивается на отдельные неделимые прямоугольные элементы. Для каждого элемента можно задать цвет фона (задний план) и цвет символа (передний план). Кроме того, в случае необходимости символ можно сделать мерцающим.

    Вся эта информация (атрибуты символа) размещается в одном байте информации так, как показано на рисунке:

Биты
7 6 5 4 3 2 1 0
М Ф Ф Ф С С С С
 

   На этой схеме буквой М обозначен бит мерцания (символ мерцает, если в этом бите установлена 1), буквами Ф - биты, в которые записывается код цвета фона (биты 4 - 6) и буквами С - биты, в которые помещается код цвета символа (биты 3-0).

    Модуль Crt позволяет работать не только со всем экраном, но и выделять в нем прямоугольные окна. Любое окно задается своим левым верхним углом и правым нижним углом. При работе в окне координаты отсчитываются от левого верхнего угла окна. При запуске программы выделенное окно совпадает по размеру со всем экраном. Если режим работы адаптера - 25 строк по 80 позиций, то координаты такого окна - (1, 1) и (80, 25).

Для задания режимов экрана используются константы:

Имя константы Значение константы Размер экрана Цвет символов Вид адаптера
Bw80
Co40
Bw80
Co80
Mono
Font8x8
0
1
2
3
7
+256
40x25
40x25
80x25
80x25
80x25
80x43(EGA)
80x50(VGA)
ч/б
цветной
ч/б
цветной
ч/б
цветной
цветной
цветной
цветной
цветной
цветной
монохромный
цветной
цветной

При задании цвета и фона выводимых на экран символов предусмотрены константы:

Наименование константы Значение константы Цвет
Black
Blue
Green
Green
Red
Magenta
Brown
LightGray
DarkGray
LightBlue
LightGreen
LightCyan
LightRed
LightMagenta
Yellow
White
Blink
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
128
черный
голубой
зеленый
бирюзовый
красный
малиновый
коричневый
светло-серый
темно-серый
светло-голубой
светло-зеленый
светло-бирюзовый
светло-красный
светло-малиновый
желтый
белый
мерцающее изображение

   Для формирования фона используются первые восемь констант. Кроме перечисленных констант в разделе интерфейса модуля Crt объявлены следующие переменные:

  • CheckBreak: boolean - использование комбинации клавиш Ctrl - Break; True - разрешено, False - не разрешено;
  • CheckEOF: boolean - использование комбинации Ctrl - Z (обозначение конца файла); True - разрешено, False - не разрешено;
  • DirectVideo: boolean - для организации прямой адресации видеопамяти;
  • CheckSnow: boolean - для регулировки "снежного" эффекта при прямом доступе к видеопамяти;
  • LastMode: word - для хранения текущего текстового режима;
  • TextAttr: byte - для хранения текущего цвета выводимых на экран дисплея символов и цвета фона;
  • WindMin: word - для хранения координат верхнего левого угла текущего окна;
  • WindMax: word - для хранения координат нижнего правого угла текущего окна;
Примеры использования констант:
TextMode(Bw80) - активизирует черно-белый текстовый режим с размером экрана в 25 строк по 80 символов в каждой строке.
TextMode(256) или TextMode(Co80+Font8x8) - активизирует цветной текстовый режим с размером экрана в 43 строки (EGA) или 50 строк по 80 символов в каждой строке.
TextAttr := $70; - цвет символов - 7, цвет фона - 0.
CheckEOF := True; - разрешено использование комбинации клавиш Ctrl- Z.

   Описанные в разделе интерфейса модуля Crt стандартные процедуры и функции позволяют управлять различными параметрами при выводе символов на экран. Для этого используются следующие процедуры:

  • LowVideo; - устанавливает режим минимальной яркости свечения выводимых на экран символов;
  • NormVideo; - устанавливает режим нормальной яркости свечения выводимых на экран символов;
  • HighVideo; - устанавливает режим наибольшей яркости свечения выводимых на экран символов;
  • TextBackGround(Color: byte); - устанавливает цвет фона, т.е. цвет области, которая окружает отображаемый на экране символ. При этом Color - выражение целого типа, принимающее значение из диапазона от 0 до 7. В качестве Color может быть задано имя константы. Значение Color для одноцветных дисплеев равно 0 или 7.
  • TextColor(Color: byte); - устанавливает цвет выводимых на экран символов. Здесь Color - выражение целого типа из диапазона от 0 до 15.
  • Window(X1, Y1, X2, Y2: byte); - определяет на экране текстовое окно. Окно - это ограниченная область экрана, выполняющая те же функции, что и полный экран. После определения окна все координаты задаются относительно этого активного окна, а не полного экрана. При определении окна координаты X1, Y1 соответствуют верхнему левому углу, а X2, Y2 - нижнему правому углу окна. Левый верхний угол текущего окна имеет относительную координату (1, 1), а минимальный размер окна может включать в себя один столбец и одну строку.
  • ClrScr; - очищает активное окно и устанавливает курсор в верхний левый угол.
  • ClrEOL; - очищает строку активного окна от текущей позиции курсора до конца строки без изменения позиции курсора.
  • GoToXY(X, Y: byte); - перемещает курсор в позицию с координатами X, Y в рамках активного окна.
  • WhereX: integer; - возвращает Х-координату текущей позиции курсора.
  • WhereY: integer; - возвращает Y-координату текущей позиции курсора.
  • DelLine; - удаляет строку, на которой находится курсор, и смещает на позицию вверх все строки, расположенные ниже. В нижнюю часть активного окна добавляется новая строка.
  • InsLine; - в рамках текущего окна вставляет пустую строку, начиная с позиции, где находится курсор.
  • AssignCrt(var F: text); - используется для задания текстового файла F, связываемого с дисплеем, для последующего его быстрого ввода-вывода.
Пример: Программа, выполняющая вывод на монитор меню следующего вида:

  Выберите режим:  
  Режим 1  
  Режим 2  
  Режим 3  


Выбор конкретного режима из этого меню осуществляется с помощью клавиш "стрелка вверх" и "стрелка вниз". При нажатии на эти клавиши генерируется звук продолжительностью 0.05 секунды. При этом строка, на которую падает выбор, выделяется цветом и фоном. Выбор фиксируется с помощью клавиши Enter. После этого выдается сообщение о выбранном режиме.
[program Menu]

   Информация о текущем цвете символов и фона хранится в глобальной переменной TxetAttr (атрибуты текста) типа byte. Если процедура устанавливает свои цвета для вывода на экран, то значение переменной можно использовать для того, чтобы восстановить цвета перед завершением работы процедуры. Например, следующая программа в начале работы сохраняет текущие цвета, а в конце восстанавливает старые значения.
uses CRT;
var oldTextAttr : byte;
Begin
{ сохраняем цвет символов и фона }
oldTextAttr := TextAttr;
{ устанавливаем свои цвета }
TextBackGround(Red); TextColor(White);
......................
{ восстанавливаем старые цвет символов и фона }
TextAttr := oldTextAttr;
End.

   Помимо использования процедурTextColor и TextBackGround для установки цвета символов и цвета фона, установить атрибуты текста можно непосредственно присвоением значений переменной TextAttr, определяемого по формуле:

НомерЦветаФона * 16 + НомерЦветаСимволов

   Например, чтобы установить белый цвет символов на красном фоне, переменной TextAttr надо присвоить значение 79 (79 = 4 * 16 + 15).

   В качестве значения, присваиваемого TextAttr, удобно использовать двузначную шестнадцатеричную константу, старший разряд которой определяет номер цвета фона, младший - номер цвета символов. Например, синий цвет обозначается десятичным числом 1, желтый цвет обозначается десятичным числом 14, которому соответствует шестнадцатеричное число E. Таким образом, желтый цвет на синем фоне кодируется шестнадцатеричным числом 1Е. Так как в изображении шестнадцатеричных чисел используются буквы латинского алфавита от A до F, то для того чтобы компилятор различал шестнадцатеричные числа и имена переменных, перед шестнадцатеричным числом ставится символ "$".

   Так, инструкция TextAttr := $1E; задает синий фон (номер цвета 1) и желтый цвет символов (номер цвета 14 в десятичной форме, и Е - шестнадцатеричной).

   Если к сообщению надо привлечь внимание, то можно установить его атрибуты так, что оно будет мигать. Чтобы это сделать, надо к константе, определяющей атрибуты, прибавить 128.

Пример: Мигающее предупреждающее сообщение.
...
TextAttr := $1E + 128;
Write('Ошибка ввода данных!');
...

   2.1. Воспроизведение звука.

   Персональный компьютер комплектуется встроенным динамиком, способным генерировать звуковые сигналы в диапазоне от 30 до 32000 Гц (воспроизводятся только чистые тона, сила звука не меняется).

   Для управления частотой звука и его продолжительностью в модуле Crt предусмотрены следующие стандартные процедуры:

  • Delay(Ms: word); - выполняет задержку в выполнении программы на Ms миллисекунд.
  • Sound(Hz: word); - включает внутренний динамик. Hz - задает частоту генерируемого динамиком сигнала в Герцах. Звуковой сигнал будет звучать до тех пор, пока не будет выключен с помощью процедуры NoSound.
  • NoSound; - отключает внутренний динамик.
Значения частот различных музыкальных звуков.

Большая октава Малая октава
До Ре Ми Фа Соль Ля Си До Ре Ми Фа Соль Ля Си
130 147 165 175 196 220 246 262 294 330 349 392 440 494

Первая октава Вторая октава
До Ре Ми Фа Соль Ля  Си До Ре Ми Фа Соль Ля Си
523 587 659 698 783 880 998 1046 1175 1319 1397 1568 1760 1976

Пример: Программа, позволяющая имитировать игру на музыкальном инструменте. [program DemoSound]

   2.2. Работа с клавиатурой.

   Стандартная клавиатура имеет три типа клавиш:

  • символьные (буквы, цифры и другие символы);
  • управляющие (функциональные, перемещения курсора, вставки, удаления и т.д.);
  • сдвига (Ctrl, Alt, Shift, NumLock, CapsLock и др.).

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

   Символьные клавиши возвращают при нажатии одно значение (1 байт), которое принято называть простым кодом.

    Управляющие клавиши при нажатии возвращают два значения (2 байта), причем первое из них равно 0 (это и есть признак управляющей клавиши), а второе - фиксированная, соответствующая нажатой клавише величина. Коды возврата специальных клавиш принято называть расширенными.

    Клавиши сдвига возвращают коды, которые не распознаются средствами Паскаля, и поэтому их применение представляет определенную сложность.

    Управление клавиатурой осуществляется посредством специализированных функций модуля CRT: ReadKey и KeyPressed:

  • KeyPressed: boolean; - возвращает значение True, если на клавиатуре была нажата какая-либо клавиша. В противном случае эта функция возвращает значение False. При этом введенные символы остаются в буфере клавиатуры и доступны для дальнейшей обработки.
  • ReadKey: boolean; - считывает символ с клавиатуры. Считываемый символ на экране не отображается. Если перед вызовом ReadKey функция KeyPressed равна True, то символы считываются немедленно. Функция ReadKey ожидает нажатия клавиши. Для считывания расширенного кода (два байта) функцию ReadKey необходимо выполнить дважды (первое ReadKey вызывает считывание кода #0 - старший байт).
Структура возвращаемых клавиатурой значений

Функции Клавиши
Символьные Управляющие Сдвига
KeyPressed True True False
ReadKey Значение #00 + Значение -

Пример: Программа, иллюстрирующая обработку кодов сканирования символьных и управляющих клавиш.
[program DemoScanCode]

   2.3. Пример использования подпрограмм модуля CRT.

   Рассмотрим программу, которая случайным образом выбирает размер и местонахождение окна на экране, закрашивает его в цвет, выбранный случайным образом, помещает в него текст и включает источник звука.
[program CrtDemo]

Пример: Программа, демонстрирующая изменение режимов экрана. Переключение режима монитора с 80 колонок на 40 и обратно.
program Video;
uses CRT;
var Mode: Integer;
begin
Mode := LastMode;
WriteLn('TextMode(CO80), нажмите ENTER'); ReadLn;
TextMode(CO40);
WriteLn('TextMode(CO40), нажмите ENTER'); ReadLn;
TextMode(Mode);
end.

[НАЗАД]  [ДАЛЕЕ]


Главная
Новости
TurboPascal
Учебное пособие
Лекции
Исходники
Математика
Книги
Лекции
Шпоры
ЦТ и ЕГЭ
Физика

Книги

Шпоры
ЦТ и ЕГЭ

Литература

Сочинения

Краткие содержания

Другое
Мой родной край
Фотогалерея
Форум
Ссылки

Гостевая






 

                                        © Copyright(c) 2004 Amro Group. All rights reserved

 

Hosted by uCoz