Пользовательские варианты
Стандартный вариант может хранить только одно из значений, указанных в табл. 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 число: '#09 + V1);
Add('2-е число: '#9 + V2);
Add('Сложение'#9 + (V1 + V2));
Add('Вычитание'#9 + (V1 - V2));
Add('Умножение'#09 + (VI * V2));
Add('Деление'#9#9 + (V1 / V2))
end
end;
Небольшой комментарий: сложная конструкция Trunc (Random*1000) /100 понадобилась только для того, чтобы реальные и мнимые части комплексных чисел содержали по три значащих цифры.
Как видим, новый вариант легко справляется с поддержкой комплексных чисел: функция VarComplexCreate создает вариант, содержащий комплексное число, а дальнейшее поведение варианта -стандартное (он поддерживает математические операции и преобразование к строковому типу). Однако эта легкость обманчива: исходный текст модуля VarCmplx, который, собственно, и придал варианту дополнительные свойства (по умолчанию располагается в файле Source\Rtl\Common\VarCmplx.pas), содержит более 30000 байт..
Структура записи TVarData. Два первых байта в этой записи (поле VType) хранят признак значения варианта, остальные 14 могут использоваться для размещения данных.
Создание пользовательского варианта проходит в три этапа.
- Сначала в записи rvarData размещаются новые данные или ссылка на них.
- Объявляется класс, который является прямым или косвеннымпотомком специального класса TCustomVariantType. В этомклассе предусматриваются все необходимые методы для реализации свойств варианта: присваивания ему новых значений, преобразования хранящихся значений к другим типам, выполнения необходимых математических действий.
- Создаются вспомогательные методы для объявления потомков нового класса и определения их типов.
В результате перечисленных шагов вы получаете полноценный вариант, обогащенный новыми свойствами: он может хранить не только те значения, которые перечислены в табл. 10.2, но и любые другие, в том числе свойства и методы! (В этом последнем случае наследником для исполняемого класса нового варианта вместо TCustomVariantType является TInvokeableVariantType или TPublishableVariantType.)
|