Глава 10

ВАРИАНТЫ
10.1. ОСНОВНЫЕ СВОЙСТВА ВАРИАНТА
Вариант (в Delphi 1 он отсутствует) - это тип variant, разработанный специально для тех случаев, когда на этапе компиляции программист не может сказать, какого типа данные будут использоваться в выражении или как параметры вызова подпрограмм. Переменная-вариант занимает в памяти дополнительные 2 байта, в которые помещается информация о действительном типе переменной. Эта информация позволяет компилятору создать код, который будет осуществлять необходимое преобразование типов на этапе прогона программы.
В переменную-вариант можно поместить:
Варианты могут участвовать в целочисленных, вещественных, логических и время-дата выражениях при условии корректности соответствующих преобразований. Например, если варианту v присвоена строка '1.0', то выражение 1+v будет правильным вещественным значением 2,0. Однако если v := 'текст', выражение 1+v вызовет исключение EVariantError.
В Delphi определены такие константы, указывающие тип помещенных в вариант данных:
Таблица 10.1. Типы возможных значений варианта
Имя Константа Смысл
varEmp.ty $0000 Нет данных
varNull $0001 Неизвестный тип параметра


varSmallInt $0002 Целый тип Smallint
varlnteger $0003 Целый тип Integer
varSingle $0004 Вещественный тип Single
varDouble $0005 Вещественный тип Double
varCurrency $0006 Вещественный тип Currency
varDate $0007 Тип дата-время
varOleStr $0008 OLE-строка в кодировке Unicode
varDispatch $0009 Указатель на OLE-объект
varError $000А Код ошибки
varBoolean $000В Тип WordBool
varVariant $000С Тип Variant (только для вариантных массивов)
varUnknow $0011 Неизвестный OLE-объект
varByte $0100 Целый тип Byte
varString $0100 Строковый тип
varArray $2000 Вариантный массив
varByRef $4000 Указатель на данные
Структура вариантного типа описывается следующим образом:
TVarData = packed record
VType: Word;
Reservedly Reserved2, ReservedS: Word;
case Integer of
varSmallInt: (VSmallInt: Smallint);
varlnteger: (VInteger: Integer);
varSingle: (VSingle: Single);
varDouble: (VDouble: Double);
varCurrency: (VCurrency: Currency);
varDate:(VDate: Double) ;
varOleStr: (VOleStr: PWideChar) ;
varDispatch: (VDispatch: Pointer);
varError: (VError: WordBool);
varString: (VString: Pointer);
varArray: (VArray: PVarArray) ;
varByRef: (VPointer: Pointer);
end;
Как нетрудно убедиться, любая переменная вариантного типа представляет собой 16-байтную запись, содержащую 8-байтную вариантную часть, которая хранит либо собственно данные, либо их адрес (т. е. указатель на динамически размещ
К чему приводится Тип данных в варианте
varEmpty Целые Вещественные Дата- Время
Строковые Логические
К дата- 'У: время 30.12. 1899 00:00:00
Преобразование в Double
Преобразование в Double
Без преобразования Преобразование в дату Преобразование в Double
К целым 0 Преобразование в соответствующий тип Округление до ближайшего целого
Округление до ближайшего целого Преобразование в целый тип 0 для False,
иначе-1 (255 для Byte)
.'К дата- 'У: время 30.12.1899 00:00:00 Преобразование в Double
Преобразование в Double
Без преобразования Преобразование в дату Преобразование в Double
К строковым Пустая строка Преобразование в символьный вид Преобразование в символьный вид Преобразование в символьный вид Без преобразования '0'для False,'-!' для True
К логическим False False для 0, иначе True
False для 0, иначе True
False для 0, иначе True
False для 'False' и для '0', иначе True Без преобразования
енные данные). В поле VType в момент создания варианта компилятор помещает, признак отсутствия данных varEmpty. В работающей программе значение этого поля меняется в соответствии с текущим типом данных, размещенных в вариантной части. Замечу, что программа не может получить прямого доступа к полям вариантной записи. Получить тип вариантных данных можно с помощью функции varType (см. ниже), а изменить тип - путем присваивания варианту нового значения.



Содержание
Вперед