Использование библиотеки CRT
Лабораторная работа № 8
Стандартные модули. Модуль CRT и модуль Graph.
Цель работы:ознакомиться с основными стандартными модулями, изучить использование библиотеки CRT для программирования клавиатуры, текстового вывода на экран, создание графических изображений.
Pascal имеет большое количество стандартных подпрограмм и данных, объединённых в несколько так называемых "стандартных модулей".
Модули – это отдельные файлы, содержащие дополнительные процедуры. Дело в том, что сам язык Паскаль имеет довольно ограниченное количество процедур и функций, они не позволяют производить некоторые действия. Для этого и существуют модули - они содержат в себе действия, расширяющие язык. При этом все процедуры в модулях собраны по тематическим группам. В систему Паскаль включены следующие основные модули: System, Crt, Dos, Graph, Overlay, Printer и специализированная библиотека Turbo Vision.
System – базовый модуль языка и подключается по умолчанию. Подпрограммы, содержащиеся в нем, обеспечивают работу всех остальных модулей системы. Это модуль содержит все стандартные и встроенные процедуры, функции, константы и переменные Паскаля.
Остальные модули подключаются с помощью служебного слова uses.
Crt- содержит средства управления дисплеем и клавиатурой компьютера.
Dos - включает средства, позволяющие реализовывать различные функции Dos.
Graph3 - поддерживает использование стандартных графических подпрограмм.
Overlay - содержит средства организации специальных оверлейных программ.
Printer - обеспечивает быстрый доступ к принтеру.
Graph - содержит пакет графических средств.
Turbo Vision - библиотека объектно-ориентированных программ для разработки пользовательских интерфейсов.
Модули Dos и WinDos. Модули Dos и WinDos содержат подпрограммы, реализующие возможности операционной системы MS-DOS – например, переименование, поиск и удаление файлов, получение и установку системного времени, выполнение программных прерываний и так далее. Эти подпрограммы в стандартном Паскале не определены. Для поддержки подпрограмм в модулях определены константы и типы данных. Модуль DOS использует строки Паскаля, а WinDos – строки с завершающим нулем.
Приведем пример использования стандартных процедур модуля DOS для вывода текущей даты и времени:
Program Data_time;
uses DOS; { подключение модуля DOS }
var y, m, d, d_w:word; h, min, sec, hund: word; {объявление переменных }
Begin
GetDate(y,m,d,d_w); {вызов процедуры DOS, возвращающей параметры даты }
GetTime(h,min,sec,hund); { процедура, возвращающая параметры времени }
writeln('сегодня: ' );
writeln('_':10, d, ' число');
writeln('_':10, m, ' месяц');
writeln('_':10, y, ' год' );
writeln('день недели: ', d_w ); { d_w= 0 - воскресенье, и т. д. }
writeln('Время: ' );
writeln('_':6, h, ' часов' );
writeln('_':6, min, ' минут' );
Writeln('_':6, sec, ' секунд' ); readln
end;
End.
Модуль Crt. Модуль предназначен для организации эффективной работы с экраном, клавиатурой и встроенным динамиком. При подключении модуля Crt выводимая информация посылается в базовую систему ввода-вывода (ВIОS) или непосредственно в видеопамять.
В текстовом режиме экран представляется как совокупность строк и столбцов. Каждый символ располагается на так называемом знакоместе на пересечении строки и столбца. Символы хранятся в специальной части оперативной памяти, называемой видеопамятью. Ее содержимое отображается на экране.
Под каждый символ отводится два байта: один байт занимает ASCII-код символа, другой байт хранит атрибуты символа: его цвет, цвет фона и признак мерцания (рис. 2). Можно получить восемь различных цветов фона и 16 цветов символов.
Модуль Crt позволяет:
выполнять вывод в заданное место экрана заданным цветом символа и фона;
открывать на экране окна прямоугольной формы и выполнять вывод в пределах этих окон;
очищать экран, окно, строку и ее часть;
обрабатывать ввод с клавиатуры;
управлять встроенным динамиком.
Использование библиотеки CRT
Во многих случаях стандартные для Паскаля возможности ввода/вывода данных с помощью процедур Read, ReadLn, Write, WriteLn оказываются явно недостаточными для разработки удобных в использовании диалоговых программ. Например, процедуры Read/ReadLn вводят с клавиатуры только типизированные данные. Процедуры Write/WriteLn выводят сообщения, начиная с того места на экране, где в данный момент находится курсор, причем по мере вывода курсор автоматически сдвигается на экране, а если очередной символ выводится в самом нижнем правом углу экрана, осуществляется «прокрутка» экрана: его содержимое сдвигается вверх на одну строку. Все это сильно затрудняет создание и обновление различного рода окон, меню и других атрибутов современных диалоговых программ.
Разработчики Турбо Паскаля предусмотрели несколько подпрограмм, существенно увеличивающих возможности текстового ввода/вывода. Эти подпрограммы сосредоточены в библиотеке (модуле) CRT, входящей в комплект поставки Паскаля. В модуль включены также процедуры Sound, NoSound и Delay, которые позволяют программировать звуковой генератор ПК.
Аббревиатура CRT соответствует русскоязычной аббревиатуре ЭЛТ - электронная лучевая трубка. На профессиональном жаргоне CRT означает устройство визуализации информации (дисплей) даже в том случае, когда вместо ЭЛТ используются иные физические устройства - плазменные панели, жидкокристаллические экраны и т.п.
В модуле определены следующие функции:
TextMode(Mode:integer) – установка текстового режима;
Значение Mode равно 1 (40 / 25) или 3(80 / 25).
ClrScr– полная очистка экрана;
ClrEol – стирает все символы в строке, начиная с текущей позиции до конца строки;
GotoXY(x,y) – перемещает курсор в позицию, заданную координатами x, y.
TextColor(Color:byte) - установка цвета выводимых символов;
Procedure Window(XI,Y1,X2,Y2: Byte)– определяет области экрана для вывода;
TextBackGround(Color) – цвет фона.
Чтобы добавить при выводе эффект мерцания, при установке цвета указывается Blink (16).
Процедура TextMode используется для установки различных текстовых режимов, где в качестве параметра используются следующие константы, определенные в модуле CRT:
const
BW40=0{Черно-белый режим 40x25}
Со40=1{Цветной режим 40x25}
BW80=2{Черно-белый режим 80x25}
Со80=3{Цветной режим 80x25}
Mono=7{Используется с MDA}
Font8x8=256{Используется для загружаемого шрифта в режиме 80х43
или 80х50 с адаптерами EGA илиVGA}
Код режима, установленного с помощью вызова процедуры TextMode, запоминается в глобальной переменной LastMode модуля CRT и может использоваться для восстановления начального состояния экрана.
Следующая программа иллюстрирует использование этой процедуры в различных режимах. Замечу, что при вызове TextMode сбрасываются все ранее сделанные установки цвета и окон, экран очищается и курсор переводится в его левый верхний угол.
Uses CRT;
Procedure Print(S: String);
(Выводит сообщение S и ждет инициативы пользователя}
begin
WriteLn(S); {Выводим сообщение}
WriteLn('Нажмите клавишу Enter...');
ReadLn {Ждем нажатия клавиши Enter}
end; {Print}
var
LM: Word;{Начальный режим экрана}
begin
LM := LastMode; {Запоминаем начальный режим работы дисплея}
TextMode(Сo40);
Print('Режим 40x25");
TextMode(Co80) ;
Print('Режим 80x25');
TextMode(Co40+Font8x8);
Print('Режим Co40+Font8x8') ;
TextMode(Co80+Font8x8);
Print('Режим Co80+Font8x8');
{Восстанавливаем исходный режим работы:}
TextMode(LM)
end.
Для работы с цветом выделены две процедуры: TextColor и TextBackground.
Единственным параметром обращения к этим процедурам должно быть выражение типа Byte, задающее код нужного цвета. Этот код удобно определять с помощью следующих мнемонических констант, объявленных в модуле CRT:
const
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;{Мерцание символа}
Следующая программа иллюстрирует цветовые возможности Турбо Паскаля.
Uses CRT;
Const
Col: array [1..15] of String [16] =
('темно-синий','темно-зеленый','бирюзовый','красный',
'фиолетовый','коричневый','светло-серый','темно-серый',
'синий','зеленый','светло-бирюзовый','розовый',
'малиновый','желтый','белый');
Var
k: Byte;
Begin
for k := 1 to 15 do
begin {Выводим 15 сообщений различными цветами}
TextColor(k);
WriteLn('Цвет ', k, ' - ',Col[k])
end;
TextColor(White+Blink); {Белые мигающие символы}
WriteLn('Мерцание символов');
{Восстанавливаем стандартный цвет}
TextColor(LightGray);
WriteLn
End.
Обратите внимание на последний оператор WriteLn: если его убрать, режим мерцания символов сохранится после завершения программы, несмотря на то, что перед ним стоит оператор
TextColor(LightGray)
Дело в том, что все цветовые определения предварительно заносятся в специальную переменную TextAttr модуля CRT и используются для настройки адаптера только при обращении к процедурам Write/WriteLn.
Процедура Window.
Определяет текстовое окно - область экрана, которая в дальнейшем будет рассматриваться процедурами вывода как весь экран. Сразу после вызова процедуры курсор помещается в левый верхний угол окна, а само окно очищается (заполняется цветом фона). По мере вывода курсор, как обычно, смещается вправо и при достижении правой границы окна переходит на новую строку, а если он к этому моменту находился на последней строке, содержимое окна сдвигается вверх на одну строку, т.е. осуществляется «прокрутка» окна. Заголовок процедуры:
Procedure Window(XI,Y1,X2,Y2: Byte);
ЗдесьX1...Y2 - координаты левого верхнего (XI,Y1) и правого нижнего (X2,Y2) углов окна. Они задаются в координатах экрана, причем левый верхний угол экрана имеет координаты (1,1), горизонтальная координата увеличивается слева направо, а вертикальная - сверху вниз.
В следующем примере иллюстрируется вывод достаточно длинного сообщения в двух разных окнах.
Uses CRT;
Var
k: integer;
Begin
{Создаем левое окно -желтые символы на синем фоне:}
TextBackground(Blue);
Window(5,2,35,17);
TextColor(Yellow);
for k := 1 to 100 do
Write(' Нажмите клавишу Enter...');
ReadLn; {Ждем нажатия Enter}
ClrScr; {Очищаем окно}
{Создаем правое окно - белые символы на красном фоне:}
TextBackground(Red);
TextColor(White);
Window(40,2,70,17);
for k := 1 to 100 do
Write(' Нажмите клавишу Enter...');
ReadLn;
TextMode(CO80) {Сбрасываем все установки}
End.
Обращение к процедуре Window игнорируется, если какая-либо из координат выходит за границы экрана или если нарушается одно из условий: Х2>Х1 и Y2>Y1. Каждое новое обращение к Window отменяет предыдущее определение окна. Границы текущего окна запоминаются в двух глобальных переменных модуля CRT: переменная WindMin типа Word хранит X1 и Y1 (XI - в младшем байте), а переменная того же типа WindMax - Х2 и Y2(X2 - в младшем байте). При желании Вы можете изменять их нужным образом без обращения к Window. Например, вместо оператора
Window(40,2,70,17);
можно было бы использовать два оператора
WindMin := 39+(1 shl 8);
WindMax := 69+(16 shl 8);
(в отличие от обращения к Window координаты, хранящиеся в переменных WindMin и WindMax, соответствуют началу отсчета 0,0).
Процедура GotoXY.
Переводит курсор в нужное место экрана или текущего окна. Заголовок процедуры:
Procedure GotoXY(X,Y: Byte);
Здесь X, Y - новые координаты курсора. Координаты задаются относительно границ экрана (окна), т.е оператор
GotoXY(1,1);
означает указание перевести курсор в левый верхний угол экрана (или окна, если к этому моменту на экране определено окно). Обращение к процедуре игнорируется, если новые координаты выходят за границы экрана (окна).
Функции whereX и WhereY.
С помощью этих функций типа Byte можно определить текущие координаты курсора: WhereX возвращает его горизонтальную, a WhereY - вертикальную координаты.
В следующей программе сначала в центре экрана создается окно, которое обводится рамкой, затем в окне выводится таблица из двух колонок.
Uses CRT;
const
LU =#218;{Левый верхний угол рамки}
RU =#191;{Правый верхний угол)}
LD =#192;{Левый нижний}
RD =#217;{Правый нижний}
H =#196;{Горизонтальная черта}
V =#179;{Вертикальная черта}
X1 =14;{Координаты окна}
Y1 =5;
X2 =66;
Y2 =20;
Txt = 'Нажмите клавишу Enter...';
var
k: integer;
begin
ClrScr; {Очищаем экран}
{Создаем окно в центре экрана - желтые символы на синем фоне:}
TextBackground(Blue);
TextColor(Yellow);
Window(X1,Y1,X2,У2);
ClrScr;
{Обводим окно рамкой}
Write(LU); {Левый верхний угол}
{Горизонтальная линия}
for k: = X1+1 to X2-1 do Write(H);
Write(RU);{Верхний правый угол}
for k := Y1+1 to Y2-1 do{Вертикальные линии}
begin
GotoXY(1,k-Y1+1);{Переходим к левой границе}
Write(V);{Левая черта}
GotoXY(X2-X1+1,WhereY){Правая граница}
Write(V){Правая черта}
end;
Write(LD);
{Левый нижний угол}
Window(X1,Y1,X2,Y2+1);{Расширяем вниз на одну строку координаты окна, иначе вывод в правый нижний угол вызовет прокрутку окна вверх}
GotoXY(2,Y2-Y1+1); {Возвращаем курсор из левого верхнего угла окна на нужное место}
{Горизонтальная рамка}
for k:= X1+1 to X2-1 do Write(H);
Write(RD); {Правый нижний угол}
{Определяем внутреннюю часть окна}
Window(X1+1,Y1+1,X2-1,Y2-1);
{Выводим левый столбец}
for k := Y1+1 to Y2-2 do
WriteLn('Левый столбец, строка ',k-Y1);;
{Ждем нажатия любой клавиши}
Write('Нажмите любую клавишу...');
k := ord(ReadKey); if k=0 then
k := ord(ReadKey);
DelLine; {Стираем приглашение}
{Выводим правый столбец}
for k := Y1+1 to Y2-2 do
begin
GotoXY((X2-X1) div 2,k-Y1);
Write('Правый столбец, строка ',k-Y1)
end ;
{Выводим сообщение и ждем нажатия клавиши Enter}
GotoXY((X2-X1-Length(Txt)) div 2,Y2-Y1-1);
TextColor(White);
Write(Txt);
ReadLn;
{Восстанавливаем стандартный режим}
TextMode(CO80)
end.
Три следующие процедуры без параметров могут оказаться полезными при разработке текстовых редакторов.
Процедура ClrEOL.
Стирает часть строки от текущего положения курсора до правой границы окна (экрана). Положение курсора не меняется.
Процедура DelLine.
Уничтожает всю строку с курсором в текущем окне (или на экране, если окно не создано). При этом все строки ниже удаляемой (если они есть) сдвигаются вверх на одну строку.
Процедура InsLine.
Вставляет строку: строка с курсором и все строки ниже ее сдвигаются вниз на одну строку; строка, вышедшая за нижнюю границу окна (экрана), безвозвратно теряется; текущее положение курсора не меняется.
Не нашли, что искали? Воспользуйтесь поиском по сайту:
©2015 - 2024 stydopedia.ru Все материалы защищены законодательством РФ.
|