10.5.
ПОЛЬЗОВАТЕЛЬСКИЕ ВАРИАНТЫ
Стандартный вариант может хранить
только одно из значений, указанных в табл. 10.2. В версии Delphi 6 появились
так называемые пользовательские варианты, которые фактически снимают ограничения
на характер значений варианта.
Чтобы познакомиться со свойствами
новых вариантов, воспользуемся одним из них - вариантом, способным хранить комплексные
числа, преобразовывать их в другие типы и осуществлять над ними нужные действия.
Как мы увидим дальше, создание пользовательского варианта может быть весьма
трудоемким делом - все зависит от сложности хранимых в нем данных. Мы воспользуемся
вариантом, созданным разработчиками Delphi и включенным в модуль
VarCmplx.
Создайте такой обработчик bbRunClick:
uses
VarCmplx; //
Эта ссылка обязательна!
procedure
TfmExample.bbRunClick(Sender:
TObject);
var
VI, V2: Variants-
begin
//
Создаем два случайных
комплексных числа:
VI := VarComplexCreate(Trunc(Random*1000)/100,
Trunc(Random*1000)/100)
;
V2 := VarComplexCreate(Trunc(Random*1000)/100,
Trunc(Random*1000)/100)
;
with
mmOutput.Lines
do
begin
//
Пустая строка-разделитель
Add ( ' ' ) ;
Add('1-e число: '# 9+V1)
;
Add('2-е число: '#9+V2);
Add('Сложение'#9+(V1+V2));
Add('Вычитание'#9+(V1-V2));
Add('Умножение'# 9+(VI*V2))
;
Add('Деление'#9#9+(V1/V2))
end
end;
Небольшой комментарий: сложная конструкция
Trunc (Random*1000) /100 понадобилась только для того, чтобы реальные и мнимые
части комплексных чисел содержали по три значащих цифры.
Вид экрана работающей программы показан
на рис. 10.1. Как видим, новый вариант легко справляется с поддержкой комплексных
чисел: функция VarComplexCreate создает вариант, содержащий комплексное число,
а дальнейшее поведение варианта -стандартное (он поддерживает математические
операции и преобразование к строковому типу). Однако эта легкость обманчива:
исходный текст модуля VarCmplx, который, собственно, и придал варианту дополнительные
свойства (по умолчанию располагается в файле Source\Rtl\Common\VarCmplx.pas),
содержит более 30000 байт..
На с. 229 показана структура записи
TVarData. Два первых байта в этой записи (поле VType) хранят признак значения
варианта, остальные 14 могут использоваться для размещения данных.
Рис. 10.1.
Демонстрация комплексных вариантов
Создание пользовательского варианта
проходит в три этапа.
-
Сначала в записи rvarData размещаются
новые данные или ссылка на них.
-
Объявляется класс, который является
прямым или косвеннымпотомком специального класса TCustomVariantType. В этомклассе
предусматриваются все необходимые методы для реализации свойств варианта:
присваивания ему новых значений, преобразования хранящихся значений к другим
типам, выполнения необходимых математических действий.
-
Создаются вспомогательные методы
для объявления потомков нового класса и определения их типов.
В результате перечисленных шагов
вы получаете полноценный вариант, обогащенный новыми свойствами: он может хранить
не только те значения, которые перечислены в табл. 10.2, но и любые другие,
в том числе свойства и методы! (В этом последнем случае наследником для исполняемого
класса нового варианта вместо TCustomVariantType является TInvokeableVariantType
или TPublishableVariantType.)