Позиционирование курсора




15.4.2.1. Процедура GotoXY(X, Y: Byte). С помощью этой процедуры можно устанавливать курсор в столбец X и строку Y текущего окна. При этом последующая операция вывода текста на дисплей разместит первый символ выводимой строки в позиции (X, Y).

GotoXY использует систему координат текущего текстового окна, т.е. координаты (1, 1) соответствуют левому верхнему углу окна. {331}

Если аргументы процедуры X и Y окажутся вне текущего окна, то ее вызов не будет иметь никакого эффекта. Нижние разрешенные значения для X и Y всегда равны 1, а верхние определяются размерами текущего окна. С помощью процедуры GotoXY можно выводить строки на экран вертикально. Пример этого приведен на рис. 15.9.

USES CRT; { подключен CRT } PROCEDURE VertStr(X,Y: Byte; S: String); VAR Len: Byte absolute S; { длина строки S } i: Byte; { параметр цикла } BEGIN for i:=1 to Len do begin GotoXY(X, Y+Pred(i)); { назначение позиции вывода } Write(S[i]) { вывод очередного символа } end {for} END; BEGIN ClrScr; { очистка экрана } VertStr(5,5, 'Вертикально!'); { вывод строки } ReadLn { пауза } END.

Рис. 15.9

При выводе символов или другой информации по мере необходимости на экране происходит прокрутка, или сдвиг, изображения. Это всегда имеет место при выводе кодов конца строки (LF, код 10) в последней строке окна операторами WriteLn и ReadLn или когда выводимая строка не умещается в той же последней строке текстового окна. А, например, вывод типа

GotoXY(5, 25); Write('строка');

не вызовет сдвига вверх, потому что оператор Write не переводит строки. Однако вывод хотя бы одного символа в правый нижний угол текстового окна вызовет прокрутку:

GotoXY(80,25); Write('*');

и символ '*' окажется уже в 24-й строке, а не в 25-й.

Эту неприятную особенность всегда приходится учитывать при построении программ, работающих со всем полем экрана. Как это делать, можно увидеть из рис. 15.10. На этом рисунке приведен еще {332} один пример, основанный на применении процедуры GotoXY. В нем вводится процедура, которая закрашивает прямоугольную область на экране любым символом в текущем цветовом атрибуте, причем заполнение области происходит по спирали.

USES CRT; { Процедура закраски квадратной области экрана } { с диагональю (X0,Y0)-(X,Y) символом Ch } { ms - период задержки при закраске } PROCEDURE Spiral(Xo,Yo,X,Y: Byte; ms: Word; Ch: Char); VAR height, width, j: Byte; с: Integer; BEGIN с:= 1; { начальное значение с } width:= X - Х0 + 1; { начальная ширина поля } height:= Y - Y0 + 1; { начальная высота поля } repeat { основной цикл } for j:=1 to width do begin { вправо/влево } GotoXY(X,Y); Write(Ch); { ставим символ } if (Y>Hi(WindMax)) and (X>Lo(WindMax)) then begin {!!! Обработка } GotoXY(1,1); InsLine { особого случая end; Delay(ms); { задержка } X:= X – с end; {for j} X:= X + с; { восстановление Х после цикла } Dec(height); { поле закраски стало ниже } for j:=1 to height do begin { вверх/вниз } Y:= Y - c; GotoXY(X,Y); Write(Ch); Delay(ms) end; {for j} Dec(width); { Поле закраски стало уже } X:= X + с; {и стартовое X сдвинулось. } с:= -1*с { смена направления } until (height<1) or (width<1); { условие окончания } GotoXY(1, 1) { курсор в начало } END; VAR i: Byte; { --ПРИМЕР ИСПОЛЬЗОВАНИЯ--} BEGIN ClrScr; Spiral(1,1,80,25, 2, #176);

Рис. 15.10 {333}

for i:=1 to 10 do begin TextAttr:= i; Spiral(2*i, i, 5*i, 2*i, 4, Chr(47+i)) end; {for} ReadLn { пауза до нажатия клавиши ввода } END.

Рис. 15.10 (окончание)

Комментарий к особому случаю. При попытке записи в правый нижний угол окна символа происходит сдвиг (прокрутка) изображения вверх. Во избежание этого закраска начинается с наибольших значений X и Y, и если они совпадают с углом окна, то сразу же проводится сдвиг изображения назад, вниз.

15.4.2.2. Функции WhereX и WhereY. Эти функции нужны для программного опроса текущего местоположения курсора в текстовом окне. Они возвращают значения координат курсора в текущем окне. Можно считать, что пара функций WhereX и WhereY обратна процедуре GotoXY.

Правила нахождения столбца (WhereX) и строки (WhereY) курсора несложны. Их всего четыре:

1) сразу после команды GotoXY (X, Y) функции возвращают значения X и Y соответственно;

2) после оператора Write курсор стоит сразу за последним символом выводимой строки (если не выводятся специальные символы типа #8, #10 или #13);

3) после операторов Read, ReadLn, WriteLn курсор стоит в первом столбце строкой ниже;

4) после команд, относящихся ко всему окну (экрану), таких как ClrScr, TextMode, Window, курсор имеет координаты (1,1).

Функции WhereX и WhereY могут эффективно использоваться в программах, работающих с пользователем в режиме полноэкранного диалога (редактора текстов, таблиц и т.п.).

Работа со строками

15.4.3.1. Процедура ClrEOL. Эта процедура может применяться как для стирания «хвостов» строк, так и для раскраски чистого экрана в полоску максимально быстрым способом. Смысл процедуры содержится в ее названии — «очистка до конца строки». Она стирает все символы в строке, начиная с текущей позиции курсора и до правого края текущего окна. Вместо стираемых символов она ставит {334} пробелы, при этом цвет строки определяется цветовым атрибутом фона. Процедура не имеет других эффектов — даже курсор при выполнении процедуры не меняет своих координат. Программа на рис. 15.11 иллюстрирует как стирание строк, так и раскраску экрана.

USES CRT; { Примеры применения процедуры ClrEOL } VAR i: Byte; {счетчик цикла } BEGIN TextAttr:= White; ClrScr; {очистка экрана } for i:=1 to 100 do Write('*ClrEOL*'); {текст на экране } Delay(1000); {пауза в 1 с } TextAttr:= 16*Green; { зеленый цвет фона } for i:=1 to 10 do begin { Стирание концов строк: } GotoXY(i * 8, i); { установка курсора, } ClrEOL { собственно очистка. } end; TextAttr:= 16*Blue; { синий цвет фона } for i:=12 to 25 do { Штриховка в полоску: } if Odd(i) { если i нечетное, то } then begin GotoXY(1, i); ClrEOL { закрасить всю строку. } end; ReadLn; { пауза до нажатия ввода } TextAttr:= White; ClrScr { восстановление цвета } END.

Рис. 15.11

15.4.3.2. Процедуры InsLine и DelLine. Эти процедуры также работают со строками. Они позволяют «прокручивать» часть текстового окна или весь экран вверх и вниз. Процедуры выполняют несложные операции: InsLine вставляет пустую строку на место той, где находится в текущий момент курсор. Все нижние строки, начиная с нее, смещаются вниз на одну строку. Самая нижняя строка, понятно, уйдет за нижнее поле окна и исчезнет. Традиционно при вводе множественной информации «с экрана» строки начинают двигаться вверх, освобождая внизу окна место для очередного запроса. Аналогично, длинные тексты пробегают по экрану снизу вверх. При помощи процедуры Insline можно организовать такую выдачу информации на экран, при которой изображение смещается сверху вниз. Для этого достаточно перед выводом очередной строки поставить в программе два оператора {335}

GotoXY(1,1); InsLine;

как это сделано в примере на рис. 15.12.

USES CRT; { Пример использования процедуры InsLine } VAR i: Byte; { счетчик цикла } BEGIN ClrScr; { очистка экрана } for i:=1 to 25 do { цикл вывода строк } begin {->} GotoXY(1, 1); InsLine; { расчистка места } WriteLn((‘Строка N ', i); { вывод строки } Delay (200) { задержка в 200 мс } end; {for} ReadLn { пауза до нажатия } END.

Рис. 15.12

В отличие от InsLine процедура DelLine удаляет строку, в которой находится курсор, подтягивая на ее место все нижестоящие строки. При этом освобождается самая нижняя строка окна. Процедура DelLine реализует «традиционную» прокрутку всего окна или его части.

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

USES CRT; { Пример применения процедур InsLine/DelLine } VAR i, n: Byte; { переменные для циклов } BEGIN ClrScr; GotoXY(1, 2*7); { начало абзаца текста } for i:=1 to 7 do { вывод семи строк в абзац } WriteLn('Ins/Del Line'); GotoXY(1,1); { вывод курсора из абзаца } Repeat { Цикл: } for i:=1 to 7 do DelLine; { поднять абзац на 7 строк } for i:=1 to 7 do InsLine { и опустить на 7 строк } until KeyPressed; { пока не нажата какая-либо клавиша } END.

Рис. 15.13 {336}

Интересных эффектов можно достичь, применяя сочетания этих команд. На рис. 15.13 приводится простейшая программа, реализующая забавный эффект «подвижного текста», который может быть использован при написании игр или заставок к программам.

Настройка цвета

15.4.4.1. Процедуры TextColor(C: Byte) и TextBackGround(C: Byte). Действие этих процедур сводится к записи в системную переменную TextAttr модуля CRT определенных значений. Процедура TextColor устанавливает цвет символов, a TextBackround — цвет фона. Специально для этих процедур определены константы, соответствующие различным цветам (табл. 15.7).

Таблица 15.7

Константа Число Цвет Процедуры
Black = 0 Черный TextColor, TextBackround
Blue = 1 Синий TextColor, TextBackround
Green = 2 Зеленый TextColor, TextBackround
Cyan = 3 Голубой TextColor, TextBackround
Red = 4 Красный TextColor, TextBackround
Magenta = 5 Фиолетовый TextColor, TextBackround
Brown = 6 Коричневый TextColor, TextBackround
LightGray = 7 Ярко-серый TextColor, TextBackround
DarkGray = 8 Темно-серый TextColor
LightBlue = 9 Ярко-синий TextColor
LightGreen = 10 Ярко-зеленый TextColor
LightCyan = 11 Ярко-голубой TextColor
LightRed = 12 Ярко-красный TextColor
LightMagenta = 13 Ярко-фиолетовый TextColor
Yellow = 14 Желтый TextColor
White = 15 Белый TextColor
Blink = 128 Мерцание TextColor (как слагаемое)

Удобство использования процедур в том, что не надо пересчитывать значения, как это делалось при непосредственном изменении TextAttr. Достаточно указать нужный цвет, подставив соответствующую константу, например:

TextColor(LightRed + Blink);

TextBackround(Green); {337}

В результате будет установлен мигающий ярко-красный цвет символов на зеленом фоне.

Заметьте, что для фона разрешенными являются только восемь значений «неярких цветов».

15.4.4.2. Процедуры установки яркости HighVideo и LowVideo. Эти процедуры не имеют параметров, но тоже занимаются установкой значения системной переменной TextAttr. Более конкретно, они устанавливают бит яркости в значения «да» (1) или «нет» (0), превращая обычные цвета (Black...LightGray) в «яркие» (DarkGray...White). Хотя можно заметить некоторые несоответствия. Так, ярко-серый (LightGray) стал ярко-белым (White), коричневый (Brown) стал желтым (Yellow).

Процедуры HighVideo и LowVideo хорошо работают при оформлении диалога и каких-либо других задач, связанных с выводом текстов на экран (рис. 15.14),

USES CRT; { Пример применения LowVideo и HighVideo} BEGIN TextColor(LightGray); { неяркий белый цвет } TextBackGround(Black); { черный цвет фона } ClrScr; Write ('Легко использовать '); HighVideo; { включение яркости } Write ('яркость '); LowVideo: { выбор низкой яркости } Write (‘для выделения слов.'); ReadLn; { пауза до нажатия ввода} ClrScr END.

Рис. 15.14

15.4.4.3. Процедура NormVideo. Эта процедура, хотя и похожа по виду на процедуры HighVideo и LowVideo, имеет с ними мало общего. После ее выполнения восстанавливаются тот цветовой атрибут (цвет фона, символов и мерцание), который был на момент начала работы программы.

Мы уже писали о «хорошем тоне» написания программ — когда рекомендовали ставить процедуру TextMode для восстановления исходного текстового режима. Советуем добавить в конец программы вызов NormVideo. Это дает гарантию, что программа «не собьет» нормальные цвета после окончания. {338}



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2022-11-01 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: