11.2. Текстовый вывод на экран
Библиотека Turbo Vision способна удовлетворить самым высоким требованиям, и мы настоятельно рекомендуем обращаться к ней при программировании сложных текстовых изображений (меню, окон и т.п.). Тем не менее, вполне возможно, что некоторые из читателей захотят использовать значительно более простые, но достаточно эффективные средства модуля CRT, описываемые в этом разделе.
Процедура TextMode используется для задания одного из возможных текстовых режимов работы адаптера монитора. Заголовок процедуры:
Procedure TextMode (mode: word);
Здесь mode – код текстового режима. в качестве значения этого выражения могут использоваться следующие константы, определенные в модуле CRT:
const
bw40=0; {черно-белый режим 40*25}
co40=l; {цветной режим 40*25}
bw80=2, {черно-белый режим 80*25}
co80=3; {цветной режим 80*25}
mono=7; {используется с mda}
Font8*8=256; {используется для загружаемого шрифта в режиме 80*43 или 80*50 с адаптерами EGA или VGA}
Код режима, установленного с помощью вызова процедуры TextMode, запоминается в глобальной переменной LastMode модуля CRT и может использоваться для восстановления начального состояния экрана.
следующая программа иллюстрирует использование этой процедуры в различных режимах. заметим, что при вызове TextMode сбрасываются все ранее сделанные установки цвета и окон, экран очищается и курсор переводится в его левый верхний угол.
user CRT;
procedure print (s: string), {вывести сообщение s и ждать инициативы пользователя}
Begin
writeln (s), {вывести сообщение}
writeln ('нажать клавишу enter...');
readln {ждем нажатия клавиши enter}
end; {print}
Var
lm: word, {начальный режим экрана}
Begin
lm:=LastMode; {запомнить начальный режим работы дисплея}
TextMode (со40);
print ('режим 40*25');
TextMode (co8o);
print ('режим 80*25');
TextMode (co40+font8*8);
print ('режим co40+font8*8');
TextMode (co80+font8*8);
print ('режим co80+font8*8'), {восстановить исходный режим работы:}
TextMode (lm)
end.
Процедура TextColor определяет цвет выводимых символов. заголовок процедуры:
Procedure TextColor (color: byte);
Процедура TextBackGround определяет цвет фона. заголовок процедуры:
Procedure TextBackGround (color: byte);
Единственным параметром обращения к этим процедурам должно быть выражение типа byte, задающее код нужного цвета. Этот код удобно определять с помощью следующих мнемонических констант, объявленных в модуле CRT:
const
black=0; {черный}
blue=l; {темно-синий}
green=2; {темно-зеленый}
суаn=3; { бирюзовый}
red=4; {красный}
magenta=8; {фиолетовый}
brown=6; {коричневый}
lightgray=7; {светло-серый}
darkgray=8; {темно-серый}
light blue=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:=l 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.
Процедура ClrScr очищает экран или окно (см. ниже процедуру window). после обращения к ней экран (окно) заполняется цветом фона и курсор устанавливается в его левый верхний угол. например:
uses CRT;
Var
с: char
Begin
textbackground (red);
clrscr; {заполняем экран красным цветом}
writeln ("нажмите любую клавишу...");
с:= ReadKey, {ждем нажатия любой клавиши}
textbackground (black);
clrscr {восстанавливаем черный фон экрана}
end.
Процедура Window определяет текстовое окно – область экрана, которая в дальнейшем будет рассматриваться процедурами вывода, как весь экран. Сразу после вызова процедуры курсор помещается в левый верхний угол окна, а само окно очищается (заполняется цветом фона). По мере вывода курсор, как обычно, смещается вправо и при достижении правой границы окна переходит на новую строку, а если он к этому моменту находился на последней строке, содержимое окна сдвигается вверх на одну строку, т.е. осуществляется «прокрутка» окна. Заголовок процедуры:
Procedure Window (xi, yi, х2, y2: byte);
Здесь x1...y2 – координаты левого верхнего (х1, y1) и правого нижнего (х2, y2) углов окна. Они задаются в координатах экрана, причем левый верхний угол экрана имеет координаты (1,1), горизонтальная координата увеличивается слева направо, а вертикальная – сверху вниз.
В следующем примере иллюстрируется вывод достаточно длинного сообщения в двух разных окнах:
uses CRT;
Var
k: integer;
Begin {создать левое окно – желтые символы на синем фоне:}
textbackground (blue);
window (5, 2, 35, 17);
textcolor (yellow);
for k:= i to 100 do
write ("нажать клавишу enter... ");
readln, {ждем нажатия enter}
clrscr; {очищаем окно}
{создать правое окно – белые символы на красном фоне:}
textbackground (red);
textcolor (white);
window (40, 2, 70, 17);
for k:= i to 100 do
write ("нажать клавишу enter... ");
readln;
TextMode (Co8o) {сбросить все установки}
end.
Обращение к процедуре Window игнорируется, если какая-либо из координат выходит за границы экрана или если нарушается одно из условий: Х2>Х1 или Y2>Y1. Каждое новое обращение к Window отменяет предыдущее определение окна. Границы текущего окна запоминаются в двух глобальных переменных модулях CRT: переменная WindMin типа Word хранит X1 и Y1 (Х1 – в младшем байте), а переменная того же типа WindMax – Х2 и Y2 (Х2 – в младшем байте). При желании вы можете изменять их нужным образом без обращения к Window. например, вместо оператора
Window (40, 2, 70,17);
можно было бы использовать два оператора:
WindMin:=39+(lshl8); WindMax:= 69+(16 shl 8);
(в отличие от обращения к Window, координаты, хранящиеся в переменных WindMin и WindMax, соответствуют началу отсчета 0, 0).
Процедура GotoXY переводит курсор в нужное место экрана или текущего окна. Заголовок процедуры:
Procedure GotoXY (Х, Y: Byte);
Здесь X, Y - новые координаты курсора. Координаты задаются относительно границ экрана (окна), т.е. оператор
GotoXY (1,1);
Оператор указывает, перевести курсор в левый верхний угол экрана (или окна, если к этому моменту на экране определено окно). Обращение к процедуре игнорируется, если новые координаты выходят за границы экрана (окна).
Функции WhereX и WhereY. С помощью этих функций типа Byte можно определить текущие координаты курсора: WhereX возвращает его горизонтальную, а WhereY – вертикальную координаты.
В следующей программе в центре экрана создается окно светло-бирюзового цвета, которое обводится рамкой.
Program Prim52;
Uses CRT; {подключить библиотеку (модуль) CRT}
Const { константы, определяющие графические символы }
{ необходимые для вычерчивания рамки окна }
lu=#218; { левый верхний угол рамки }
ru=#191; { правый верхний угол рамки }
ld=#192; { левый нижний угол рамки }
rd=#217; { правый нижний угол рамки }
h=#196; { горизонтальная черта }
v=#179; { вертикальная черта }
{ координаты окна: }
x1=14; y1=5; { верхний левый угол }
x2=66; y2=20; { нижний правый угол }
Var k:integer;
Begin ClrScr; { очиститъ экран}
textmode(co80); { сброситъ все установки }
textbackground(lightcyan); { фон окна светло-бирюзовый }
textcolor(yellow); { цвет текстов в окне желтый }
window(x1,y1,x2,y2); { открытъ окно с координатами }
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); { kypcop в нижний левый угол+1}
{ нового окна, без учета рамки }
for k:=x1+1 to x2-1 do write(h);{ нижнюю горизонтальную черту}
write(rd); { нижний правый угол}
TextBackground(LightCyan);
GotoXY(2,2); { курсор в левый верхний угол}
{нового окна без учета рамки}
readln;
end.
Три следующие процедуры без параметров могут оказаться полезными при разработке текстовых редакторов.
Процедура ClrEOL стирает часть строки от текущего положения курсора до правой границы окна (экрана). Положение курсора не меняется.
Процедура DelLine уничтожает всю строку с курсором в текущем окне (или на экране, если окно не создано). При этом все строки ниже удаляемой (если она есть) сдвигаются вверх на одну строку.
Процедура InsLine вставляет строку: строка с курсором и все строки ниже ее сдвигаются вниз на одну строку; строка, вышедшая за нижнюю границу окна (экрана), безвозвратно теряется; текущее положение курсора не меняется.
Процедуры LowVideo, NormVideo и HighVideo. С помощью этих процедур без параметров можно устанавливать соответственно пониженную, нормальную и повышенную яркости символов. Например:
Uses CRT;
begin
LowVideo;
Writeln ('пониженная яркость');
NormVideo;
Writeln ('нормальная яркость');
HighVideo;
Writeln ('повышенная яркость')
end.
На практике нет разницы между пониженной и нормальной яркостью изображения.
Процедура Assign CRT связывает текстовую файловую переменную F с экраном с помощью непосредственного обращения к видеопамяти (т.е. к памяти, используемой адаптером для создания изображения на экране). В результате вывод в такой текстовый файл осуществляется значительно быстрее (в 3...5 раз), чем если бы этот файл был связан с экраном стандартной процедурой Assign. Заголовок процедуры: Procedure Assign CRT (F: Text);
В следующей программе измеряется скорость вывода на экран с помощью стандартной файловой процедуры и непосредственного обращения к видеопамяти. Вначале файловая переменная F связывается «медленной» процедурой Assign со стандартным устройством CON (т.е. с экраном) и подсчитывается количество N циклов вывода некоторого текста за 5*55=275 миллисекунд системных часов. Затем файловая переменная связывается с экраном с помощью процедуры быстрого доступа Assign CRT и точно так же подсчитывается количество N2 циклов вывода. В конце программы счетчики NI и N2 выводятся на экран.
Показания системных часов хранятся в оперативной памяти компьютера в виде четырехбайтного слова по адресу [$0040:$006С] и наращиваются на единицу каждые 55 миллисекунд.
Uses CRT;
var
F: Text;
t: Longint; {начало отсчета времени}
N1, N2: Word; {счетчик вывода}
const
txt= 'Text';
begin
{-----стандартный вывод в файл------}
Assign (F, “CON”);
Rewrite (F);
N1:=0; {готовим счетчик вывода}
ClrScr; {очищаем экран}
{запоминаем начальный момент:}
t:= Meml [$0040:$006C];
{ждем начало нового 55-миллисекундного интервала, чтобы исключить погрешность в определении времени:}
while Meml [$0040:$006C]=t do;
{цикл вывода за 5 интервалов}
while Meml [$0040:$006C]<t+6 do
begin
inc (N1);
Write (F, txt)
end;
Close (F);
{вывод с помощью быстрой процедуры прямого доступа к экрану}
AssignCRT (F);
Rewrite (F);
N2:=0;
ClrScr;
t:= Meml [$0040:$006C];
while Meml [$0040:$006]=t do;
while Meml [$0040:$006]<t+6 do
begin
inc (N2);
Write (F, txt)
end;
Close (F);
{печатаем результат}
ClrScr;
Writeln (N1, N2:10)
end.
Следует учесть, что вывод на экран обычным образом, без использования файловой переменной (например, оператором Write (txt)), также осуществляется с помощью непосредственного доступа к видеопамяти, поэтому ценность процедуры AssignCRT весьма сомнительна. Прямой доступ к видеопамяти регулируется глобальной логической переменной DirectVideo модуля CRT: если эта переменная имеет значение True, доступ разрешен, если False — доступ к экрану осуществляется с помощью относительно медленных средств операционной системы MS—DOS. По умолчанию переменная DirectVideo имеет значение True.
... ячейка, а имя переменной превращается в адрес ячейки. Появление этого адреса происходит в результате работы специального оператора языка (NEW), однако его значение в большинстве случаев не используется при программировании на алгоритмических языках типа Паскаль. Условимся считать, что адрес ячейки, которая будет хранить переменную А, есть А. Или, другими словами, А - это общее имя переменной и ...
... на условном языке, каждое, из слов которого заменяет десятки, а то и сотни команд процессора. Таким образом, программа становится еще нагляднее и короче. Существует множество условных языков высокого уровня, для каждого из них написано немало вариантов программы, переводящей условный код в последовательность машинных команд. Один из таких языков – Паскаль, который из наиболее известных языков ...
... , тем не менее, использование программ с перекрытиями снимает это ограничение. Два библиотечных модуля TURBO3 и GRAPH3 введены для совместимости с ранней версией 3.0 системы Турбо Паскаль. 2 Объекты Базовым в объектно-ориентированном программировании является понятие объекта. Объект имеет определённые свойства. ...
... выбрать режим Quit <Alt>-<X>, после чего нажать либо <Enter>, либо комбинацию <Alt>-<X>. ФУНКЦИОНАЛЬНЫЕ КЛАВИШИ Функциональные клавиши используются для управления средой Турбо Паскаля. Они обозначаются F1, F2,..., F12 и располагаются в самом верхнем ряду клавиатуры. С каждой из этих клавиш связывается некоторая команда меню. Действие почти всех функциональных ...
0 комментариев