Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Turbo Pascal / Stud_1_1 / LecRus / MainPart.doc
Скачиваний:
118
Добавлен:
03.03.2016
Размер:
5.03 Mб
Скачать

Сохранение и восстановление экрана

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

В примерах, которые будут в дальнейшем иллюстрировать работу с экраном, используются различные переменные, связанные с видеопамятью. Чтобы не повторять описание переменных, будем считать, что это описание содержится в модуле DesUnit, а в обрабатывающей программе задано предложение Uses DesUnit.

Текст модуля DesUnit:

UNIT DesUnit;

{ Модуль содержит глобальные описания типов и переменных }

Interface

Type

ScreenColRange = 1..80; { тип номера столбца экрана }

ScreenRowRange = 1..25; { тип номера строки экрана }

ScreenChar = record { элемент видеопамяти }

Symbol : char; { символ }

Attrib : byte; { атрибут }

end;

ScreenRowArray = array[ScreenColRange] of ScreenChar;

{ тип строки экрана }

ScreenArray = array[ScreenRowRange] of ScreenRowArray;

{ тип видеопамяти }

ScreenPointer = ^ScreenArray;

Var Screen : ScreenArray absolute $B800:$0000;

{ видеопамять }

RowAr : ScreenRowArray;{ строка видеопамяти }

BufAr : ScreenPointer; { указатель буферного }

{ массива для сохранения видеопамяти }

Implementation

End.

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

Procedure MoveFromScreen(Row1,Row2:byte);

Var Len : word;

Begin

New(BufAr);

Len:=(Row2-Row1+1)*80 shl 1;

Move(Screen[Row1],BufAr^,Len);

End { MoveFromScreen };

Procedure MoveToScreen(Row1,Row2:byte);

Var Len : word;

Begin

Len:=(Row2-Row1+1)*80 shl 1;

Move(BufAr^,Screen[Row1],Len);

Dispose(BufAr);

End { MoveFromScreen };

Здесь Row1, Row2 - соответственно номер первой и последней строк сохраняемой или восстанавливаемой области экрана; операция shl k (Shift Left) - сдвиг целочисленной переменной на k разрядов влево, что эквивалентно умножению ее на .

С Д В И Г Э К Р А Н А

При вертикальном сдвиге текстового экрана вверх строки 2 .. 25 переписываются в строки 1 .. 24, а в строку 25 вводятся данные из оперативной памяти. Сдвиг вниз осуществляется аналогично.

Вертикальный сдвиг экрана называют также скроллингом (scroll - рулон, свиток).

Пусть для заполнения строки экрана в программе используется переменная BufRow типа ScreenRowArray.

Вертикальный сдвиг вверх:

Procedure ScreenToUp;

Begin

Move(Screen[2],Screen[1],3840);

Screen[25]:=BufRow;

End { ScreenToUp };

Вертикальный сдвиг вниз:

Procedure ScreenToDown;

Begin

Move(Screen[1],Screen[2],3840);

Screen[1]:=BufRow;

End { ScreenToDown };

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

Пусть нам требуется сдвинуть экран на пять столбцов влево. В этом случае левые пять столбцов исчезнут, весь текст сдвинется влево, а самые правые пять столбцов будут очищены. Сдвиг вправо осуществляется аналогично.

Ниже приведена процедура для сдвига текстового экрана на один столбец влево.

Procedure ScreenToLeft;

Var i : byte;

Begin

For i:=1 to 25 do

Begin

Move(Screen[i,2],Screen[i,1],158); { 79  2 = 158 }

Screen[i,80].Symbol:=' ';

End;

End { ScreenToLeft };

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

Соседние файлы в папке LecRus