Смекни!
smekni.com

екта tObject.

Анализаторы вводимой информации

В Turbo Vision 2.0 имеется возможность контроля размещаемой в

строке ввода информации.Для этого служит серия объектов, называемых

анализаторами вводимой информации, исходным является абстрактный объ-

ект tValidator, а его потомками являются стандартные анализаторы.

Анализатор множества допустимых символов (тип tFilterValidator)

проверяет, входят ли вводимые символы в множество допустимых, и если

входят, то помещаются в буфер строки ввода, а в противном случае сим-

волы игнорируются.Инициализация такого анализатора осуществляется

конструктором Init :

constructor tFilterValidator.Init(AValidChars: tCharSet);

где AValidChars - множество допустимых символов типа tCharSet.

Анализатор границ вводимого числа (тип tRangeValidator) предназ-

начен для контроля вводимых в символьной форме целых чисел (в общем

случае типа Logint).Этот анализатор, являясь потомком объекта

tFilterValidator, помимо проверки допустимых символов (только цифр и

знаков "+" и "-" в первой позиции вводимой информации) проверяет также

значение введенного числа и его нахождение в заданном диапазоне.

Анализатор инициализируется конструктором Init :

constructor tRangeValidator.Init(AMin, AMax: Longint);

где AMin, AMax - миним. и максим. допустимые границы вводимого числа.

Если введенное число не попадает в заданный диапазон, выдается

сообщение об ошибке в виде информационного окна, при выходе из которо-

го происходит возврат к строке ввода для внесения соответствующих из-

менений.Окно не закрывается.

Анализатор по списку строк (тип tStringLookupValidator) сравнива-

ет строку введенных символов со списком допустимых строк, находящимся

в коллекции строк.Реакция при неправильно введенной строке аналогичная.

Анализатор инициализируется конструктором Init :

constructor tStringLookupValidator.Init(

AStrings: pStringCollection);

где AString - коллекция строк, с которыми сравнивается вводимая инфор-

мация.

Анализатор по шаблону (тип tPXPictureValidator) позволяет создать

шаблон, по которому проверяется вводимая информация.Можно проверять

количество вводимых символов, их вид и т.д.

Анализатор инициализируется конструктором Init :

constructor tPXPictureValidator.Init(

const APic: string; AutoFill: Boolean);

где APic - шаблон, по которому проверяется вводимая информация;

AutoFill - если равен True, вводимая информация автоматически до-

полняется символами шаблона, не являющимися служебными символами.

Анализатор должен быть подключен к соответствующей строке ввода с

помощью метода SetValidator строки ввода :

procedure tInputLine.SetValidator(AValid: pValidator);

где AValid - указатель на подключаемый к строке ввода анализатор.

Объект-коллекция

Объект-коллекция (тип Collection) предназначен в первую очередь

для размещения в нем объектов (точнее, указателей на объекты).Основным

отличием коллекции от массива является то, что размеры ее при необхо-

димости могут изменяться.Кроме этого, коллекция может содержать объек-

ты разных типов и элементы, не являющиеся объектами.

Создается коллекция с помощью конструктора Init :

constructor tCollection.Init(ALimit, ADelta: Integer);

где ALimit - первоначальный размер коллекции;

ADelta - величина, на которую изменяется размер в случае необхо-

димости.

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

дается коллекция и инициализируется конструктором Init.После этого в

нее можно помещать компоненты.При этом в коллекции помещается указа-

тель на размещаемый объект.Если при размещении очередного объекта в

коллекции нет достаточного места, она автоматически увеличивается на

величину ADelta.

Компоненту в коллекцию можно поместить либо в конце списка, либо

после компоненты с указанным значением индекса.В первом случае исполь-

зуется метод Insert :

procedure tCollection.Insert(Item: Pointer); virtual;

где Item - указатель на размещаемый в коллекции объект,

во втором случае используется метод AtInsert :

procedure tCollection.AtInsert(Index:Integer;Item: Pointer);

где Index - номер компоненты, который получает размещаемый объект;

Item - указатель на размещаемый в коллекции объект.

Эти методы копии размещаемого в коллекции объекта не создают.

Следует отметить три важных метода коллекции.

Метод FirstThat :

function tCollection.FirstThat(Test: Pointer): Pointer;

где Test - указатель на функцию, проверяющую некоторое условие;

результат - указатель на первую компоненту коллекции, для которой

верно условие, проверяемое функцией, указатель на которую равен Test.

Функция с указателем Test не должна быть методом и должна компи-

лироваться с директивой far.Ее заголовок выглядит следующим образом :

function <имя функции>(Item: Pointer): Boolean; far;

В этом заголовке Item - указатель на компоненту коллекции; ре-

зультат функции равен True, если проверяемое функцией условие выполня-

ется, и False - в противном случае.

Второй метод - LastThat :

function tCollection.LastThat(Test: Pointer): Pointer;

где Test - указатель на функцию, проверяющую условие; результат - ука-

затель на последнюю компоненту коллекции, для которой верно условие,

проверяемое функцией, указатель на которую равен Test, либо nil, если

ни для одной компоненты коллекции условие не выполняется.Функция с

указателем Test аналогична такой же функции метода FirstThat.

Третий метод - ForEach :

procedure tCollection.ForEach(Action: Pointer);

где Action - указатель на процедуру, которая выполняет требуемые дейс-

твия с каждой компонентой.Процедура с указателем Action не должна быть

методом и должна компилироваться с директивой far.Ее заголовок :

procedure <имя процедуры>(Item: Pointer); far;

где Item - указатель на компоненту коллекции.

Коллекция может содержать не только объекты, но и элементы других

типов.В частности, имеется стандартная коллекция строк (тип

tStringCollection).В ней переопределен метод FreeItem, который удаляет

компоненту из коллекции и из динамической памяти.

Потоки Turbo Vision

Поток и его потомки предназначены для хранения в них объектов и

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

ществовать не только на внешних устройствах, но и в оперативной памя-

ти.Другое важное отличие - возможность хранения данных разных ти-

пов.Возможны запись и чтение.

При создании потока в нем не находится никакой информации.Записы-

ваемая в поток информация последовательно приписывается к его концу,

так что условный указатель на текущий элемент файла в этом случае ука-

зывает на его конец.После чтения очередной компоненты из потока указа-

тель автоматически настраивается на начало следующей.

Поток типа tStream является абстрактным потоком, потому что он не

привязан к конкретному носителю информации.На практике используются

потоки ДОС (тип tDosStream) и буферированный поток (тип

tBufStream).Они позволяют хранить информацию во внешних файлах, причем

у буферированного потока информация передается через промежуточный бу-

фер, что повышает быстродействие работы.

Поток ДОС инициализируется конструктором Init :

constructor tDosStream.Init( FileName: FNameStr; Mode: Word);

где FileName - имя файла, с которым связан поток (размеры по правилам

MS-DOS - до 79 символов);

Mode - категория файла.

Буферированный поток инициализируется конструктором Init :

constructor tBufStream.Init( FileName: FNameStr;

Mode, Size: Word);

где FileName - имя файла, с которым связан поток (размеры по правилам

MS-DOS - до 79 символов);

Mode - категория файла;

Size - размер буфера (обычно от 512 до 2048 байт).

Перед тем как поместить объект в поток или взять из потока, его

следует подготовить.

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

го.У стандартных отображаемых объектов в Turbo Vision такие методы уже

имеются.Первый метод - Store :

procedure <отображаемый объект>.Store (var S: tStream);

где S - поток, в который помещается объект.Метод размещает объект в

потоке.

Второй - конструктор Load :

constructor <отображаемый объект>.Load(var S: tStream);

где S - поток, из которого берется объект.Конструктор загружает объект

из потока в память.

Для того, чтобы записать в поток тот или иной параметр объекта

(группу параметров, следующих друг за другом), можно воспользоваться

методом Write :

procedure <тип потока>.Wriye (var Buf; Count: Word); virtual;

Buf - буфер с переписываемой информацией;

Count - размер переписываемой информации в байтах.

Это основной метод записи информации в поток.

Для всех методов имеются аналоги, осуществляющие чтение информа-

ции из потока.Основной - метод Read, позволяющий читать из потока зна-

чение параметра объекта (группы параметров) :

procedure <тип объекта>.Read (var Buf; Count: Word); virtual;

Buf - буфер, в который помещается информация;

Count - размер переписываемой информации в байтах.

Вторая операция, связанная с подготовкой объекта к записи в по-

ток, - его регистрация.В потоке могут быть объекты разных типов, поэ-

тому возникает проблема в определении типов этих объектов при необхо-

димости работы с ними.Для решения этой проблемы используется система

регистрации, заключающаяся в том, что каждому типу объекта, который

предполагается записать в поток, присваивается индивидуальный регист-

рационный номер.По этому номеру будут определяться размер записанной

или записываемой информации, соответствующая таблица виртуальных мето-

дов, а также адреса методов, с помощью которых данный объект загружа-

ется в поток и читается из него.

Для регистрации объекта следует создать регистрационную запись

(типа tStreamRec) :

type

tStreamRec = record

ObjType: Word;

VmtLink: Word;

Load: Pointer;

Store: Pointer;

Next: Word;

end;

где ObjType - индивидуальный регистрационный номер объекта;

VmtLink - смещение адреса таблицы виртуальных методов объекта;

Load - адрес конструктора Load объекта;

Store - адрес метода Store объекта;

Next - смещение адреса следующей регистрационной записи.

В качестве регистрационной записи, как правило, типизированная

константа, у которой заполнены первые 4 поля.Имя регистрационной запи-