Связь и интернет Архив Программирование
   
Сделать стартовойСделать закладку            
   ПОИСК  
   
Главная / Pascal и Delphi / Иллюстрированный самоучитель по Delphi 6 / Часть II . Язык Object Pascal /
8  Perl
8  PHP
8  JavaScript
8  HTML
8  DHTML
8  XML
8  CSS
8  C / C++
8  Pascal и Delphi
8  Турбо Ассемблер
8  MySQL
8  CASE-технологии
8  Алгоритмы
8  Python
8  Обратная связь
8  Гостевая книга
Новости о мире


Варианты - Программирование от RIN.RU
Варианты




Основные свойства варианта


Вариант (в Delphi 1 он отсутствует) - это тип variant, разработанный специально для тех случаев, когда на этапе компиляции программист не может сказать, какого типа данные будут использоваться в выражении или как параметры вызова подпрограмм. Переменная-вариант занимает в памяти дополнительные 2 байта, в которые помещается информация о действительном типе переменной. Эта информация позволяет компилятору создать код, который будет осуществлять необходимое преобразование типов на этапе прогона программы.


В переменную-вариант можно поместить:

  • целое или вещественное число;

  • логическое значение;

  • строку;

  • время и/или дату;

  • OLE-объект;

  • массив произвольной размерности и длины, содержащий элементы одного из перечисленных выше типов.


    Варианты могут участвовать в целочисленных, вещественных, логических и время-дата выражениях при условии корректности соответствующих преобразований. Например, если варианту 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-байтную вариантную часть, которая хранит либо собственно данные, либо их адрес (т. е. указатель на динамически размещенные данные). В поле VType в момент создания варианта компилятор помещает, признак отсутствия данных varEmpty. В работающей программе значение этого поля меняется в соответствии с текущим типом данных, размещенных в вариантной части. Замечу, что программа не может получить прямого доступа к полям вариантной записи. Получить тип вариантных данных можно с помощью функции varType (см. ниже), а изменить тип - путем присваивания варианту нового значения.




    К чему приводится Тип данных в варианте
    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Без преобразования



    Вперед  >>>
     1  2  3 


     8  Комментарии к статье  8 8  Обсудить в чате
  •  
      
      
        Copyright ©  RIN 2003 - 2004      * Обратная связь