TURBO PASCAL

Новости

Программы   

Turbo Pascal 

Игры

Документация   

Странности

FAQ

Ссылки

Форум

Гостевая книга

Рассылка

Благодарности

Об авторе

 

 

5.3.1. Объекты модуля

TEMSArea

Этот объект является основой иерархии объектов модуля F_EMS. Методы объекта интерпретируют доступную ему EMS— память как одну очень длинную цепочку байт. Единственное, что умеет делать объект с этой памятьЮг это записывать в нее данные или читать данные из нее. Для этого в объект включены базовые методы WriteEMS (писать в EMS— память) и ReadEMS (читать из памяти). Эти методы можно рассматривать как модификацию стандартной процедуры Move на случай обмена данными с EMS— памятью: при обращении к ним нужно указать адрес источника, адрес приемника и количество пересылаемых байт. Отличие от Move состоит в том, что это количество задается параметром типа Longint, что позволяет обмениваться массивами данных произвольного размера (стандартная процедура Move обеспечивает передачу не более 65535 байт).

Для большинства практических целей более удобно пользоваться наследниками этого объекта.

Поля

Size Size: Longint; Только чтение Определяет размер (в байтах) связанной с объектом отображаемой памяти.

МахРаде MaxPage: Word; Только чтение

Определяет количество EMS— страниц по 16 Кбайт каждая, в которых размещаются Size используемых объектом байт.

Handle Handle: Word; Только чтение

Дескриптор EMM, владеющий МахРаде страницами EMS— памяти.

Методы

Init Constuctor Init (ASize: Longint);

Перекрывается: Часто

Инициирует объект: определяет количество МахРаде страниц EMS— памяти, достаточное для размещения ASize байт, создает дескриптор Handle и связывает с ним МахРаде страниц.

Done Destructor Done; Virtual;

Перекрывается: Редко

Освобождает EMS— память, связанную с дескриптором Handle. He забывайте использовать вызов этого метода, перед тем как завершить работу с объектом или перед окончанием работы программы, поскольку выделенная дескриптору память остается в его монопольном распоряжении, даже если сам дескриптор уже не существует.

EMSError Procedure EMSError (NError: Byte); Virtual;

Этот метод вызывается всеми другими методами объекта TEMSArea и его потомков в случае, если обнаружена какая-либо ошибка. Параметр NError определяет номер ошибки. Если NErrorOO, метод устанавливает глобальный признак ошибки EMSErrorFlag, который может проанализировать вызывающая программа, затем выводит на экран текстовое сообщение о характере возникшей ошибки. Сообщение выводится с помощью стандартной процедуры WriteLn. Вы должны перекрыть метод EMSError в графическом режиме работы дисплея, если не используете модуль F_GrText или не осуществляете самостоятельной интерпретации вызова процедуры WriteLn. Этот метод следует перекрывать также в потомках для вывода сообщений о нестандартных ошибках. Исходный метод выдает нужное сообщение в случае, если номер ошибки лежит в диапазоне $80..$AD. Несколько необычная левая граница диапазона связана с тем, что диапазон $80..$А4 соответствует стандартным ошибкам драйвера EMM.SYS (см. п.5.2). В табл.5.3 указаны номера ошибок и соответствующие им сообщения.

Таблица 5.3 Сообщения об ошибках, выдаваемые процедурой TEMSArea.EMSError

 

Код

Значение

$80

Внутренняя ошибка EMM

$81

Сбой EMS—платы

$82

EMM занят обработкой предыдущего запроса

$83

Неверный дескриптор окна

$84

Запрошена неопределенная в данной версии EMM функция

$85

Нет доступных дескрипторов окон

$86

Ошибка при сохранении или восстановлении окна

$87

Запрос распределения превышает общую EMS — память

$88

Запрос распределения превышает число доступных страниц

$89

Попытка создать дескриптор с нулевым количеством страниц

$8А

Дескриптор не располагает таким числом страниц

$8В

Попытка картировать больше 4 страниц

$8С

Переполнение области сохранения картирующего контекста

$8D

Попытка повторного сохранения картирующего контекста

$8E

Попытка восстановления несохраненного контекста

$8F

Не определен параметр подфункции

$90

Неизвестный тип атрибутов

$91

Нет аппаратной поддержки сохраняемых страниц


138 Глава 5

 

$92

Источник и приемник информации одновременно находятся в EMS—памяти

$93

Размер приемника информации слишком мал

$94

Стандартная память частично перекрывает отображаемую память

$95

Слишком большое смещение в перемещаемом блоке

$96

Размер перемещаемого блока больше 1 Мбайт

$97

Источник и приемник связаны с одним дескриптором и частично перекрываются

$98

Недопустимый тип памяти источника или приемника

$99

Неопознанная ошибка

$9А

Нет аппаратной поддержки альтернативной установки страниц

$9В

Исчерпаны все допустимые установки альтернативных регистров

$9С

Не поддерживается установка альтернативных регистров

$9D

Неправильная установка альтернативных регистров

$9E

Назначенные каналы прямого доступа к памяти (КПДП) не поддерживаются

$9F

Указанный КПДП не поддерживается

$AO

Дескриптор не поименован

$А1

Указанное имя дескриптора уже существует

$А2

Источник выходит за границу 1 Мбайт

$АЗ

Содержимое указанной области данных разрушено

$А4

Нет доступа к указанной функции

$А5

Нет EMS—памяти или не установлен драйвер EMM.SYS

$А6

Неверный формат файла

$А7

Ошибка при чтении объекта из файла

$А8

Ошибка при записи объекта в файл

$А9

Попытка чтения за границей доступной BMS— памяти

$АА

Попытка записи за границей доступной HMS — памяти

$АВ

Неверные границы индексов

$АС

Размер элемента вектора не соответствует длине переменной

$AD

Изменен режим работы дисплея (объект TEMSScreen)


Если при обращении к методу указана ошибка, выходящая за диапазон $80..$AD, выдается сообщение

Ошибка номер XXX

ReadEMS Procedure ReadEMS (Source: Longint; var Dest; Sz:

Longint); Virtual;

Перекрывается: Никогда

Этот метод обеспечивает низкоуровневый интерфейс с EMS— памятью для чтения данных из нее в переменную Dest. Параметр Source определяет номер байта отображаемой памяти, с которого начинается обмен данными (самый первый байт соответствует Source=0). Sz определяет общее количество передаваемых байт. Dest — переменная иди участок кучи, куда будет помещена прочитанная из EMS— памяти информация. Фактически метод осуществляет обмен данными порциями, не превышающими 16 Кбайт, однако разбивка всего массива на эти порции и картирование нужных страниц EMS— памяти делается внутри метода и вызывающая программа не должна об этом заботиться.

Load Constructor Load (var F: File) ;

С помощью этого метода программа может прочитать из файла F объект TEMSArea, ранее записанный в файл методом Store, файл F должен быть нетипизированным файлом. Перед обращением к методу его следует открыть, указав длину блока в 1 байт. Позиционирование указателя внутри файла должно осуществляться в вызывающей программе. Вначале метод читает из файла заголовок объекта — строку,

Доступ к отображаемой памяти_____ 139

соответствующую глобальной константе RegHeadTEMSArea. Затем читаются поля МахРад и Size. После этого создается дескриптор Handle и с ним связываются МахРаде страниц. Наконец из файла считываются и помещаются в EMS— память Size байт данных.

Store Procedure Store (var F: File); Virtual;

Перекрывается: Часто

Записывает в файл Р текущее состояние объекта TEMSArea. Файл F должен быть нетипизированным файлом. Перед обращением к методу программа должна открыть его, указав длину блока в 1 байт. Метод вначале записывает в файл заголовок объекта — глобальную константу RegHeadTEMSArea, затем поля МахРаде, Size и, наконец, все Size байт из EMS— памяти.

Следующий пример иллюстрирует технику использования методов 5tore и Load.

Uses F_EMS;

var

Area: TEMSArea;

F: File;

begin

Area.Init (100000); {Резервируем в EMS 100000 байт} {.......) {Наполняем EMS-память данными}

Assign(F,'Test.dat'); {Связываем файловую переменную с

именем вновь создаваемого файла} Rewrite(F,1); {Создаем файл; длина блока данных

равна 1 байту!} Store(F); {Сохраняем данные в файле};

Area.Done; {Освобождаем EMS-память} Seek(F,0); {Позиционируем указатель на начало файла} Area.Load(F); {Читаем все поля и данные

объекта TEMSArea из файла F} /....... } {Используем данные}

Area.Done {Освобождаем EMS-память} end.

WriteEMS Procedure WriteEMS (var Source; Destin, Sz:

Longint); Virtual;

Перекрывается: Никогда

Записывает Sz байт данных из переменной Source в EMS— память, пропустив Destin байт от ее начала. Вместе с методом ReadEMS обеспечивает низкоуровневый доступ к отображаемой памяти. Фактический обмен данными осуществляется порциями по 16 Кбайт. Разбивка всего массива Sz байт на порции и необходимое картирование EMS— памяти осуществляется внутри метода.

TEMSVector_______________________________________

Объект TEMSVector имитирует обычный одномерный массив Паскаля. Его элементами могут быть любые данные одинаковой длины — методы Setltem и Getltem могут соответственно записать в EMS— память или про—

читать из нее любую переменную либо область памяти подходящей длины. В этом полиморфизме методов заключается главное отличие объекта от обычных одномерных массивов Паскаля. Для удобства доступа к структурированным данным в объект включены интерфейсные методы XXXXItem, преобразующие элемент данных к одному из стандартных типов. При обращении к конструктору Init указывается длина элемента, а также минимальное и максимальное значения индексных выражений: для доступа к любому элементу данных необходимо указать его индекс. В отличие от массивов Турбо Паскаля индексные выражения и границы индексов задаются значениями типа Longint, что позволяет хранить в EMS— памяти массивы произвольной длины. Объекты метода осуществляют проверку значений индексных выражений на принадлежность заданному при обращении к Init диапазону. Такая проверка приводит к дополнительным потерям времени и уменьшает и без того невысокую скорость доступа к элементам данных. Если Вы уверены в корректности индексных выражений и хотите несколько увеличить скорость доступа, Вы должны включить в начало модуля директиву компилятора {$DEF NOTCHECK} или указать слово NOTCHECK в поле Options/ Compiler/Conditional defines диалоговой среды. Такая настройка заставит компилятор исключить из программы фрагменты, связанные с проверкой индексных выражений.

Поля

ItemS Items: Longint; Только чтение

Хранит длину элемента данных. Интерфейсные методы XXXXItem проверяют значение этого поля и блокируют доступ к элементу, если значение ItemS не соответствует длине типа данных.

Minind Minind: Longint; Только чтение

В это поле метод Init помещает левую границу индексных выражений.

Maxind Maxind: Longint; Только чтение

В это поле метод Init помещает правую границу индексных выражений.

Методы

Init Constructor Init (ASize, Min, Max: Longint);

Создает объект: вначале по границам индексных выражений Min, Мах и длине элемента ASize определяет требуемую длину EMS— памяти, затем вызывает родительский метод TEMSArea.Init и помещает значения ASize, Min, Мах в поля ItemS, Minind и Maxind.

Load Constructor Load (var F: File);

Перекрывается: Иногда

Создает объект, считывая все его поля и данные из файла F. Вначале обращается к родительскому методу TEMSArea.Load, затем читает из файла заголовок RegHeadTEMSVector (см. п.5.3.2) и поля ItemS. Minind, Maxind. Перед обращением к методу файловую переменную F необ — ходимо связать с уже существующим нетипизированным файлом, а сам файл должен быть открыт для чтения блоками длиной в 1 байт.

Доступ к отображаемой памяти 141

Store Procedure Store (var F: File); Virtual;

Перекрывается: Иногда

Сохраняет текущее состояние объекта в файле F: вначале вызывает унаследованный метод TEMSArea.Store, затем записывает в файл заголовок RegHeadTEMSVector и поля ItemS, Minind, Maxind. Перед обращением к методу файловую переменную F необходимо связать с уже существующим нетипизированным файлом, а сам файл должен быть открыт для чтения блоками длиной в 1 байт.

Getltem Procedure Getltem (var Dest; Index: Longint) ;

Перекрывается: Редко

Помещает в переменную Dest элемент с индексом Index: вначале определяет положение ItemS'(Index—Minind) элемента относительно начала EMS— памяти, затем вызывает TEMSArea.ReadEMS для чтения из памяти ItemS байт.

Setltem Procedure Setltem (var Source; Index: Longint);

Перекрывается: Редко

Читает из переменной Source ItemS байт и помещает их в элемент с индексом Index: вначале определяет положение ItemS'(Index—Minind) элемента относительно начала EMS— памяти, затем вызывает TEMSArea. WriteEMS для записи в память ItemS байт.

Byteltem Function Byteltem (Index: Longint): Byte;

Возвращает значение элемента с индексом Index в типе Byte: вначале проверяет поле ItemS, которое должно иметь значение SizeOf(Byte), затем вызывает Getltem и преобразует полученное значение элемента Index к типу Byte.

Doubleltem Function DoubleItem (Index: Longint) : Double;

Возвращает значение элемента с индексом Index в типе Double:

вначале проверяет поле ItemS, которое должно иметь значение SizeOf(Double), затем вызывает Getltem и преобразует полученное значение элемента Index к типу Double.

Extendedltem Function ExtendedItem (Index: Longint) : Extended;

Возвращает значение элемента с индексом Index в типе Extended:

вначале проверяет поле ItemS, которое должно иметь значение SizeOf(Extended), затем вызывает Getltem и преобразует полученное значение элемента Index к типу Extended.

Integerltem Function IntegerItem (Index: Longint) : Integer;

Возвращает значение элемента с индексом Index в типе Integer:

вначале проверяет поле ItemS, которое должно иметь значение SizeOf(Integer), затем вызывает Getltem и преобразует полученное значение элемента Index к типу Integer.

Longlntltem Function LongIntItem (Index: Longint): Longint;

Возвращает значение элемента с индексом Index в типе Longint:

вначале проверяет поле ItemS, которое должно иметь значение SizeOf(LongInt), затем вызывает Getltem и преобразует полученное значение элемента Index к типу Longint.

Realltem Function Realltem (Index: Longint) : Real;

Возвращает значение элемента с индексом Index в типе Real: вначале проверяет поле ItemS, которое должно иметь значение SizeOf(Real), затем вызывает Getltem и преобразует полученное значение элемента Index к типу Real.

Singleltem Function Singleltem (Index: Longint) : Single;

Возвращает значение элемента с индексом Index в типе Single: вначале проверяет поле ItemS, которое должно иметь значение SizeOf(Single), затем вызывает Getltem и преобразует полученное значение элемента Index к типу Single.

TEMSMatrix________________________________________

"Объект содержит средства для работы с двумерными массивами в EMS— памяти. Он перекрывает методы своего родителя TEMSVector для обеспечения доступа к элементам массива по двум индексам. Для этого в объект включен метод GetVedndex, с помощью которого два индекса преобразуются к одному индексу массива TEMSVector с нулевой левой границей. Пересчет осуществляется по стандартному правилу Паскаля:

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

Поля

Minlndl Minlndl: Longint Только чтение

Содержит левую границу первого измерения.

Maxindl Maxindl: Longint Только чтение

Содержит правую границу первого измерения.

Minlnd2 MinInd2: Longint Только чтение

Содержит левую границу второго измерения.

Maxlnd2 Maxlnd2 : Longint Только чтение

Содержит правую границу второго измерения.

Методы

Init Constructor Init (ASize, Mini, Maxi, Min2, Max2:

Longint);

Создает объект TEMSMatrix: по границам измерений Mini...Max2 определяет общее количество Sz элементов, вызывает родительский метод TEMSVector.Init с границами 0, Sz—1 и помещает границы Mini...Max2 в поля Minlndl...Maxlnd2.

Load Constructor Load (var F: File);

Перекрывается: Иногда

Считывает все поля и данные объекта TEMSMatrix из файла F: вначале вызывает родительский метод TEMSVector.Laad, затем читает из <^<ssxa. заголовок RegHeadTEMSMatrix (см. п.8.3.2) и поля Mi'rtJndI, MoxJndl, Minlnd2, Maxlnd2. Перед обращением к методу файловую переменную F необходимо связать с уже существующим нетипизированным файлом, а сам файл должен быть открыт для чтения блоками длиной в 1 байт.

Доступ к отображаемой памяти 143

Store Procedure Store (var F: File); Virtual;

Перекрывается: Иногда

Сохраняет текущее состояние объекта в файле F: вначале вызывает унаследованный метод TEMSVector.Sfore, затем записывает в файл заголовок RegHeadTEMSMatrix и поля Minlndl, Maxindl, Minlnd2, Maxlnd2. Перед обращением к методу файловую переменную F необходимо связать с уже существующим нетипизированным файлом, а сам файл должен быть открыт для записи блоками длиной в 1 байт.

GetVecIndex Function GetVecIndex (Indl, Ind2: Longint) :

Longint;

Осуществляет преобразование двух индексов Indl, Ind2 к единственному индексу родительского объекта TEMSVector с нулевой левой границей.

Все остальные методы объекта — Getltem, Setltem, Byteltem, Doubleltem, Extendedltem, Integerltem, Lognlntltem, Realltem и Singleltem — представляют собой двумерные варианты одноименных методов объекта TEMSVector.

TEMSAiray________________________________________

Объект TEMSArray содержит средства для создания в EMS— памяти массива произвольной размерности и работы с ним. Все индексные выражения пеоедаются методам объекта в виде списка, что не очень удобно, поэтому помимо объекта TEMSArray в модуле содержатся также объекты TEMSVector и TEMSMatrix. Многомерный массив TEMSArray порожден от TEMSVector и осуществляет соответствующий пересчет индексов в единственный индекс объекта—родителя с нулевой левой границей. Для этого служит метод GetVecIndex, использующий стандартное правило Паскаля: элементы массива располагаются в памяти так, что при переходе от одного элемента к соседнему наиболее быстро меняется самый правый индекс.

Поля

NIndex NIndex: Longint; Только чтение Содержит количество измерений массива.

Index Index: PIndex;

Указатель на размещенный в динамической памяти массив из NIndex троек чисел типа Longint. Каждая (А—я) тройка содержит левую (первое число), правую (второе число) границы индексов по данному (А—му) измерению и множитель (третье число), упрощающий пересчет многомерных индексных измерений в единственный индекс базового объекта TEMSVector. Множитель показывает на сколько нужно умножить А—ый индекс многомерного массива, чтобы получить положение элемента внутри одномерного массива с нулевой левой границей.

Методы

Init Constructor Init (ASize, NInd: LongInt; var Ind) ;

Создает объект TEMSArray. Параметры ASize и NInd задают соответственно длину элемента и количество измерений массива. Переменная Ind внутри метода считается переменной типа TIndexBond (см. п.5.3.2) и должна содержать N/nd пар чисел типа LongInt, определяющих границы индексов по каждому измерению (первое число пары — левая, второе — правая границы). Метод помещает в поле NIndex значение NInd, затем по списку Ind определяет общее количество Sz элементов массива, после чего вызывает унаследованный метод TEMSVector.Init с границами 0 и Sz-1. Если обращение к методу было успешным, в куче резервируется NInd' 12 байт и указатель на этот участок памяти помещается в поле Index (указатель на массив TIndex, см. п.5.3.2). Для всех NInd троек элементов типа LongInt массива Index' в первый элемент помещается левая граница, во второй — правая граница, а в третий — масштабный множитель, показывающий на сколько нужно умножить индекс по данному измерению, чтобы получить положение элемента в базовом объекте TEMSVector.

Load Constructor Load (var F: File);

Перекрывается: Редко

Считывает все поля и данные объекта TEMSArray из файла F: вначале вызывает родительский метод TEMSVector.Load, затем читает из файла заголовок RegHeadTEMSArray и поле NIndex. Резервирует в куче участок памяти длиной NIndex'Q байт, указатель на него помещает в поле Index и считывает в него из файла NIndex элементов массива типа TIndex. Перед обращением к методу файловую переменную F необходимо связать с уже существующим нетипизированным файлом, а сам файл должен быть открыт для чтения блоками длиной в 1 байт.

Store Procedure Store (var F: Pile); Virtual;

Перекрывается: Редко

Сохраняет в файле F текущее состояние объекта: вызывает родительский метод TEMSVectore. Store, затем записывает в файл заголовок RegHeadTEMSArray, поле NIndex и все NIndex троек массива Index'. Перед обращением к методу файловую переменную F необходимо связать с уже существующим нетипизированным файлом, а сам файл должен быть открыт для записи блоками длиной в 1 байт.

Done Destructor Done; Virtual;

Перекрывается: Редко

Уничтожает объект: освобождает участок кучи, связанный с указателем Index, затем вызывает родительский метод TEMSArea.Done для освобождения EMS— памяти.

GetVecIndex Function GetVecIndex (var Ind) : LongInt;

Перекрывается: Никогда

По массиву индексов, заданному в переменной Ind, возвращает единственный индекс одномерного базового объекта TEMSVector. Переменная Ind внутри метода считается массивом TIndexList и должна содержать NIndex' элементов типа LongInt, определяющих значения индексов (первый элемент — индекс первого измерения, второй — второго и т.д.). Этот метод можно использовать для доступа к типизированным интерфейсным функциям XXXXItem объекта—родителя TEMSVector.

Доступ к отображаемой памяти 145

Getltem Procedure Getltem (var Dest, Ind) ;

Перекрывается: Никогда

Помещает в переменную Dest значение элемента массива, заданного списком индексов Ind типа TIndexList.

Setltem Procedure S'etltem (var Source, Ind);

Перекрывается: Никогда

Помещает значение переменной Source в элемент массива, заданный списком индексов /nd типа TIndexList.

TEMSType__________________________________________

Объект TEMSType содержит средства, позволяющие зарезервировать участок EMS— памяти нужной длины и работать с этой памятью как с файлом последовательного доступа. С этой целью в объекте содержится поле Pos, в котором указывается текущее положение указателя записи/чтения (смещение указателя от начала памяти в байтах). Методы Setltem и Getltem позволяют записать в EMS— память или прочитать из нее массив байтов нужной длины. В объекте нет средств позиционирования указателя и контроля за длиной записываемых/считываемых элементов. Ответственность за правильное использование записанной в EMS— память информации возлагается на программиста.

Поля

Pos Pos: Longint Чтение/Запись

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

Методы

Init Constructor Init (ASize: Longint);

Создает объект: вызывает родительский метод TEM.SArea.lnit, чтобы зарезервировать в EMS— памяти ASize байт, затем помещает в поле Pos значение 0.

Load Constructor Load (F: File) ;

Перекрывается: Часто

Считывает объект из файла F: вызывает родительский метод TEMSArea.Load, затем читает из файла заголовок RegHeadTEMSType и поле Pos. Перед обращением к методу файловую переменную F необходимо связать с уже существующим нетипизированным файлом, а сам файл должен быть открыт для чтения блоками длиной в 1 байт.

Store Procedure Store (var F: File); Virtual;

Перекрывается: Часто

Сохраняет в файле F текущее состояние объекта: вызывает унаследованный метод TEMSArea. Store, затем записывает в файл заголовок RegHeadTEMSType и поле Роз. Перед обращением к методу файловую переменную F необходимо связать с уже существующим нетипизи— рованным файлом, а сам файл должен быть открыт для записи блоками длиной в 1 байт.

Getltem Procedure Getltem (var Dest; Sz: Longint);

Перекрывается: Часто

Читает из участка EMS— памяти со смещением Pos байт от ее начала Sz байт в переменную Dest: вызывает родительский метод TEMSArea.ReadEMS с параметрами Pos, Dest и Sz, затем увеличивает значение поля Pos на величину Sz.

Setltem Procedure Setltem (var Source; Sz: Longint);

Перекрывается: Часто

Помещает в участок EMS— памяти со смещением Pos байт от ее начала Sz байт из переменной Source: вызывает родительский метод TEMSArea.WriteEMS с параметрами Source, Pos и Sz, затем увеличивает значение поля Pos на величину Sz.

TEMSText______

Объект позволяет разместить в EMS—памяти набор текстовых строк. В какой—то степени этому объекту соответствует текстовый файл стандартного типа Text. Объект порожден от TEMSType и наследует его поле Pos, содержащее текущее положение указателя чтения/записи от начала памяти. Метод Setltem размещает в памяти очередную строку S и увеличивает значение Pos на Length(S)+l. Метод Getltem читает строку из памяти и точно также смещает указатель Pos. Строка в EMS— памяти хранится в стандартном формате Паскаля: первый байт строки содержит ее Длину, затем следует цепочка символов. Эта форма не совпадает с форматом ASCII— строк, в соответствии с которым строка содержит цепочку символов, заканчибающуюся признаком EOL (последовательностью символов #13#10). Таким образом, объект нельзя считать полным аналогом текстового файла.

Методы

Getltem Function Getltem: String;

Возвращает размещенную в EMS— памяти текстовую строку, на которую указывает Pos, и увеличивает значение Pos на длину строки плюс один байт.

Setltem Procedure Setltem (S: String);

Помещает в участок EMS— памяти, на который указывает Pos, строку 5 и увеличивает значение Pos на величину Length(S)+l.

TEMSScreen______________________________________

Объект TEMSScreen предназначен для копирования текущего состояния экрана (текстового или графического) в EMS— память и восстановления экрана по его копии. Его метод Init определяет текущий режим работы

экрана с помощью прерывания BIOS $10 и в зависимости от этого резервирует EMS— память нужной длины. Код режима помещается в поле Mode и контролируется при вызове других методов объекта. Это означает, что если Ваша программа переключает режим работы дисплея, например переходит из текстового в графический, для сохранения копий экрана Вы должны использовать разные копии объекта TEMSScreen. Напротив, в рамках одного и того же режима единственная копия TEMSScreen может сколько угодно раз использоваться для сохранения/восстановления экрана. Поскольку унаследованные методы TEMSArea.Rea.dEMS и TEMSArea. Write— Ems не перекрываются, Вы можете использовать их для того, чтобы обойти это ограничение (например, чтобы объект, рассчитанный на работу с графическим экраном EGA/VGA, использовать для сохранения/восстановления текстового экрана). В табл.5.4 указывается объем резервируемой EMS^- памяти для наиболее распространенных дисплейных адаптеров.

Таблица 5.4 Объем резервируемой EMS-памяти. для различных дисплейных адаптеров___

 

Тип адаптера

Режим

Резервируемая память в страницах по 16 Кбайт

MDA

Все режимы

1

CGA

Все режимы

1

EGA

Текстовые

i

"

Графический 640х350 16 цветов

7

VGA

Текстовые

1

"

Графический 640х480 16 цветов

10

SVGA

Графический 1024х?68 16 цветов

24

 

Графический 1024х768 256 цветов

48


Поля

Mode Mode: Byte; Только чтение

Код режима работы экрана на момент создания объекта. Все методы объекта (кроме Imt и Store) проверяют соответствие текущего режима работы режиму, указываемому этим полем.

Методы

Init Constructor Init;

Создает объект: с помощью прерывания $10 (подфункция $F) определяет текущий режим работы экрана, затем с помощью вызова родительского метода TEMSArea.Imt резервирует EMS— память нужного размера, после чего помещает в поле Mode код режима дисплея.

Load Constructor Load (P: Pile);

Считывает копию объекта из файла F: вызывает TEMSArea, затем читает из файла заголовок RegHeadTEMSScreen и поле Mode. Перед обращением к методу файловую переменную F необходимо связать с уже существующим нетипизироваиным файлом, а сам файл должен быть открыт для чтения блоками длиной в 1 байт.

Store Procedure Store (var F: File); Virtual;

Сохраняет в файле F текущее состояние объекта: вызывает унаследованный метод TEMSArea.Store, затем записывает в файл заголовок RegHeadTEMSScreen и поле Mode. Перед обращением к методу файловую переменную F необходимо связать с уже существующим не— типизированным файлом, а сам файл должен быть открыт для записи блоками длиной в 1 байт.

GetScreen Procedure GetScreen;

Перекрывается: Редко

Сохраняет в EMS— памяти текущее состояние экрана. Все текстовые режимы, а также графические режимы адаптера CGA используют менее 16 Кбайт видеопамяти, поэтому их копирование осуществляется в единственную страницу EMS— памяти и происходит очень быстро. Графические режимы EGA/VGA/SVGA требуют более одной страницы для размещения копии экрана, поэтому копирование идет по частям и осуществляется намного медленнее. Части экрана, копируемые в одну страницу EMS, представляют собой узкие горизонтальные полосы. Для EGA/VGA эти полосы содержат по 50 строк развертки, поэтому полная копия состоит из 7 (EGA) или 10 (VGA) полос. Копии полос создаются с помощью процедуры Cetlmage стандартного модуля Graph.

PutScreen Procedure PutScreen;

Перекрывается: Редко

Восстанавливает вид экрана, который был к моменту предыдущего обращения к методу GetScreen, т.е. переносит копию из EMS— памяти на экран.

 

Глава 5

Оглавление

На первую страницу

Rambler's Top100 Rambler's Top100
PROext: Top 1000

(с)Все права защищены

По всем интересующим вопросам прошу писать на электронный адрес

Hosted by uCoz