екта 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 поля.Имя регистрационной запи-