VarType — Функция Delphi

VarType — Функция Delphi

Здравствуйте! Мне необходимо узнать что за данные храниться в переменной
Пишу:
где a – некоторая переменная
Showmessage(VarTypeAsText(VarType(a)));
Система говорить – “Unicode String”

Изменил код на:
Showmessage(VarTypeAsText(VarType(«1234»)));
Все равно– “Unicode String”.

Какой же там String если стоит число? VarTYPE работает неверно? Или я что-то не так делаю?

> aXLES1984 (06.03.2012 16:51:00) [0]

Если апострофы, то какое же это число

Понял НАдо вот так писать: Showmessage(VarTypeAsText(VarType(1234)));

Но проблема с переменной у меня осталась: есть переменная a типа Variant, вот если я пишу явно a:=234 — то функция Vartype работает нормально, а если я заношу в a — данные, скопированные в буфер обмена, тоже 234, то возврат идет уже UnicodeString, хотя переменная а содержит тоже самое.

Не подскажите как обойти?

> aXLES1984 (06.03.2012 17:36:02) [2]

Значит а не того типа, раз позволяет вставить из буфера обмена, который
строка

В буфере обмена может находиться ТОЛЬКО текст (ну или специфические двоичные данные, дескрипторы и прочая шняга, не про это вопрос). Поэтому, когда мы переменной типа вариант присваиваем содержимое вышеозначенного буфера обмена — там будет строка, но не как не её числовое представление. Обходить это не надо, надо с этим жить. Если уж совсем припёрло, пишем а := Integer(a). НО! Если в а не будет преобразуемой в целое число строки, получим исключение.

Чтобы по строке определить тип придется помучиться, перебирая варианты преобразования (дата, буль, плавающая точка, целое, если ничего не подошло, то строка). Лучше, конечно, если заранее известно, какой результат будет, и преобразовывать в него.

Как работает VarType:

function VarType(const V: Variant): TVarType;
begin
Result := TVarData(V).VType;
end;

Т.е. какой тип был при присвоении, то он и выводит.

Delphi 11.2.3: Где находится в Delphi функция VarType()?

Я пытаюсь преобразовать код Delphi2005 в код Delphi Tokyo 10.2.3. Функция VarType больше не распознается. Мне нужна функция VarType для определения основного типа переменной. В общем, по многим сообщениям, я считаю, что он должен находиться в модуле System.variants. Однако, если я ищу, например, в:

Это не в этом устройстве. Кроме того, я не могу найти варианты единиц, только единичный вариант. Однако, используя вариант блока, я получаю ошибку времени выполнения: требуется запись, объект или тип класса. Так что это не сработает.

Во всяком случае, я не нахожу varType в System.variant. Разве варианты больше не существуют?

Может кто-нибудь мне помочь??

1 ответ

0 Решение Remy Lebeau [2020-09-05 20:24:00]

Документация, с которой вы связаны, довольно старая. Это для Delphi 2009, который предшествовал внедрению имен единиц измерения. Но даже в этой старой документации VarType() документируется как находящаяся в модуле Variants (не в модуле Variant , которого не существует).

Имена единиц измерения, такие как System , были добавлены к именам модулей RTL/VCL в XE2 (таким образом, единица Variants стала System.Variants ).

Embarcadero newer DocWiki, который заменяет старый сайт Docs, ясно показывает, что VarType() действительно находится в модуле System.Variants .

у вас есть параметр System.Variants в вашем System.Variants uses :

у вас есть System в списке проектов имен единиц измерения, а затем вы можете использовать Variants в своем предложении uses :

В любом случае, вы можете использовать VarType() как и ожидалось, без необходимости полностью его квалифицировать:

VarType — Функция Delphi

Описание
Функция возвращает код определяющий тип Variant-переменной, соответствующий значению поля VarType записи TVarData. Результирующее значение кода состоит из одной или нескольких констант, объявленных в модуле System.

Значения констант представлены в следующей таблице:

Константа Значение Описание
varEmpty $0000 Тип не определен (Unassigned).
varNull $0001 Null
varSmallint $0002 16-разрядное целочисленное значение со знаком (тип Smallint).
varInteger $0003 32-разрядное целочисленное значение со знаком (тип Integer).
varSingle $0004 Значение с плавающей запятой (тип Single).
varDouble $0005 Значение с плавающей запятой (тип Double).
varCurrency $0006 Значение с плавающей запятой (тип Currency).
varDate $0007 Значение даты и времени (тип TDateTime).
varOleStr $0008 Ссылка на динамически распределенную UNICODE-строку.
varDispatch $0009 Ссылка на Automation-объект (интерфейсный указатель IDispatch).
varError $000A Значение кода ошибки операционной системы.
varBoolean $000B 16-ти битовое значение булева типа (тип WordBool).
varVariant $000C Значение типа Variant.
varUnknown $000D Ссылка на неизвестный COM-объект (интерфейсный указатель IUnknown).
varByte $0011 8-ми битовое беззнаковое целочислен-ное значение (тип Byte).
varString $0100 Ссылка на динамически распределен-ную Pascal-строку (тип AnsiString).
varTypeMask $0FFF Маска значения типа переменной.
varArray $2000 Бит, показывающий, что переменная является Variant-массивом.
varByRef $4000 Бит, указывающий что переменная, скорее всего, содержит не само значение, а указатель.

Младшие двенадцать битов возвращаемого значения, соответствующие битовой маске varTypeMask, определяют тип Variant-переменной. Значение VarArray возвращается, когда переменная V является массивом. Значение VarByRef возвращается, если переменная V представляет собой ссылку на значение.
Изменить тип Variant-переменной можно с помощью функции VarAsType.

Пример
var
V: Variant;
T: Integer;
begin
V:= True;
T:= VarType(V); // T:= 11 ($000B)
MessageDlg( VarToStr(T), mtInformation, [mbOk], 0);
end;

Тип variant в Delphi

Тип данных variant часто используется тогда, когда тип какого то объекта ранее не известен или когда какие-то функции или процедуры требуют именно тип аргументов — variant. Однако следует знать, что затраты памяти и времени на работу с типом variant больше, чем с обычными типами.

В переменных типа данных variant могут храниться данные любых типов данных, кроме записей, множеств, статических массивов, файлов, классов или ссылок на классы и Int64 (-263/263-1). Объекты Com и Cobra также могут храниться в типе variant.

Переменные типа variant занимают 16 битов и содержат код типа и значения переменной или указатель на это значение. В момент создания эти переменные инициализируются специальным значением Unassigned. Значение переменной nil свидетельствует о неизвестном или ошибочном значении переменной. Вы можете заказать мощный и надежный сервер lenovo nextscale n1200 по оптимальной и доступной цене.

Узнать действительный тип значения переменной variant можно при помощи функции VarType, возвращающей значение поля VarType записи типа TvarData (модуль System), содержащее код типа переменной variant. Имеется также предопределенная константа varTypeMask, сложение при которой по операции and с переменной типа TVarData возвращает истинный тип переменной. Например:

VarType(V) and varTypeMask = varDouble

вернет true, если в переменной V в данный момент хранится значение типа double или массив значений double.

Некоторые значения типов, возвращаемые функцией VarType:

Функция VarType

Примечание: Мы стараемся как можно оперативнее обеспечивать вас актуальными справочными материалами на вашем языке. Эта страница переведена автоматически, поэтому ее текст может содержать неточности и грамматические ошибки. Для нас важно, чтобы эта статья была вам полезна. Просим вас уделить пару секунд и сообщить, помогла ли она вам, с помощью кнопок внизу страницы. Для удобства также приводим ссылку на оригинал (на английском языке).

Возвращает значение типа Integer, обозначающее подтип переменной.

Обязательный аргумент имя_переменнойаргумент является значением Variant, содержащим любые переменные, за исключением переменных пользовательского типа.

пусто (не инициализирована)

NULL (нет допустимых данных)

Тип Integer (целое)

Тип Long Integer (длинное целое)

Тип Single (одинарной точности с плавающей запятой)

Тип Double (двойной точности с плавающей запятой)

Тип Currency (денежный)

Тип Date (значение даты и времени)

Тип String (строка)

Тип Object (объект)

Тип Boolean (логическое значение)

Variant (используется только с массивами переменных)

Тип DataObject (объект доступа к данным)

Тип Decimal (десятичное значение)

Тип Byte (байтовое значение)

Тип Variant, содержащий определенный пользователем тип

Примечание: Приведенные здесь константы определены в Visual Basic для приложений, что позволяет заменять ими значения в любом месте программы.

Функция VarType никогда не возвращает значение vbArray само по себе. Оно всегда добавляется к другому значению, обозначающему тип массива. Константа vbVariant возвращается только в сочетании с vbArray, чтобы показать, что аргументом функции VarType был массив типа Variant. Например, значение, возвращаемое для массива целых чисел, вычисляется как vbInteger + vbArray и равно 8194. Если у объекта есть свойство по умолчанию, функция VarType ( объект ) возвращает тип этого свойства.

Пример

Примечание: В примерах ниже показано, как использовать эту функцию в модуле Visual Basic для приложений (VBA). Чтобы получить дополнительные сведения о работе с VBA, выберите Справочник разработчика в раскрывающемся списке рядом с полем Поиск и введите одно или несколько слов в поле поиска.

В этом примере функция VarType используется для определения подтипа переменной.

Delphi 2006. Справочное пособие: Язык Delphi, классы, функции Win32 и .NET. — Архангельский А.Я.

function VarAsType(const AValue: Variant,

const AVarType: Integer): Variant; function VarAsType(const AValue: Variant,

const ASystemType: Type): Variant;

Функция VarAsType преобразует тип variant объекта, указанного параметром AValue, в заданный тип, указанный кодом типа VarType (см. о коде типа в разд. 8.3.3.1ивгл.9в описании TVarType). Это может быть один из предопределенных типов, или заказной тип variant (см. разд. 8.3). Тип, в который производится преобразование, не должен иметь установленные биты var Array и varByRef. Если преобразование невозможно, генерируется исключение EVariantError. Ниже приведен пример использования функции VarAsType:

Vl := 5; // тип неизвестен

Vl := VarAsType(VI,varDouble); // тип varDouble

Создает и заполняет массив Variant Библиотеки VCL Win32, VCL .NET Модуль в VCL Win32 Variants

Пространство имен в VCL .NET Borland.Vcl.Variants

function VarArrayOf(var Values: array of Variant): Variant; в Borland.Vcl.Variants:

function VarArrayOf(const Values: array of Variant): Variant; Описание

Функция VarArrayOf возвращает одномерный массив Variant и заполняет его элементами, указанными в параметре Values. Первый индекс возвращаемого массива — 0. Максимальный индекс на 1 меньше числа элементов в параметре Values.

Ниже приведен пример создания массива из 5 элементов. Каждый элемент типа Variant может содержать различные типы данных. В приведенном примере последний элемент сам является массивом Variant.

var A: Variant; begin

A := VarArrayCreate([0, 4], varVariant);

Глара 12 > Описания функций

А[4] := VarArrayOf([1, 10, 100, 1000]); ends-

Возвращает дисперсию элементов массива Библиотеки VCL Win32, VCL .NET Модуль в VCL Win32 Math Пространство имен в .NET Borland.Vcl.Math Объявление

function Variance (const Data: array of Double): Extended; Описание

Функция Variance возвращает несмещенную оценку дисперсии элементов массива действительных чисел Data. Может работать как со статическими, так и с динамическими массивами. Если массив А содержит п элементов, то дисперсия рассчитывается по формуле

где А — среднее значение (математическое ожидание) элементов массива. Это несмещенная оценка, статистически более точная, чем сумма квадратов отклонений, деленная на п, возвращаемая функцией PopnVariance. Если массив содержит всего один элемент, функция Variance возвращает значение NAN.

Дисперсия равна квадрату среднего квадратического отклонения, вычисляемого функцией StdDev или процедурой MeanAndStdDev. Таким образом, выполняется соотношение Sqr(StdDev(A)) = Variance(A).

VarS QLTimeS tampCreate

Возвращает объект типа variant с данными, хранящимися в записи типа TSQLTimeStamp

Библиотеки VCL Win32, VCL .NET

Модуль в VCL Win32 SqlTimSt

Пространство имен в .NET Borland.VcLSqlTimSt

procedure VarSQLTimeStampCreate (var aDest: Variants-

const ASQLTimeStamp: TSQLTimeStamp) ; overloads-function VarSQLTimeStampCreate: Variant; overload; function VarSQLTimeStampCreate(

const ASQLTimeStamp: TSQLTimeStamp): Variant; overload; VarType

function VarSQLTimeStampCreate(const AValue: TDateTime):

Variant; overload; function VarSQLTimeStampCreate(const AValue: string): Variant;

Перегруженные варианты VarSQLTimeStampCreate создают объект типа variant с данными, хранящимися в записи типа TSQLTimeStamp. Это запись (см. в гл. 9), используемая драйверами dbExpress при работе с данных типа дат и времени.

Первый вариант процедуры возвращает объект типа variant с данными, полученными из записи ASQLTimeStamp. Второй вариант VarSQLTimeStampCreate возвращает значение variant с нулевыми данными NullSQLTimeStamp. Третий вариант VarSQLTimeStampCreate возвращает значение variant с данными, полученными из записи ASQLTimeStamp. Таким образом, первый и третий варианты эквивалентны по результатам.

Четвертый вариант VarSQLTimeStampCreate возвращает значение variant с данными, полученными из значения AValue типа TDateTime. Пятый вариант формирует данные variant из строки AValue. Если эта строка не соответствует формату дат и времени, результирующие данные будут нулевыми (NullSQLTimeStamp).

создают объект V, хранящий текущую дату и время в записи типа TSQLTimeStamp. Созданный объект, в частности, можно непосредственно присвоить строковой переменной, поскольку в нем предусмотрено приведение типа к строке:

Labell. Caption := V;

В результате в метке появится текст вида: «02.09.01 22:00:05».

Возвращает код типа variant Библиотеки VCL Win32, VCL .NET Модуль в VCL Win32 Variants

Пространство имен в VCL .NET BorlandVсІУariants

Тип variant в Delphi

Тип данных variant часто используется тогда, когда тип какого то объекта ранее не известен или когда какие-то функции или процедуры требуют именно тип аргументов — variant. Однако следует знать, что затраты памяти и времени на работу с типом variant больше, чем с обычными типами.

В переменных типа данных variant могут храниться данные любых типов данных, кроме записей, множеств, статических массивов, файлов, классов или ссылок на классы и Int64 (-263/263-1). Объекты Com и Cobra также могут храниться в типе variant.

Переменные типа variant занимают 16 битов и содержат код типа и значения переменной или указатель на это значение. В момент создания эти переменные инициализируются специальным значением Unassigned. Значение переменной nil свидетельствует о неизвестном или ошибочном значении переменной. Вы можете заказать мощный и надежный сервер lenovo nextscale n1200 по оптимальной и доступной цене.

Узнать действительный тип значения переменной variant можно при помощи функции VarType, возвращающей значение поля VarType записи типа TvarData (модуль System), содержащее код типа переменной variant. Имеется также предопределенная константа varTypeMask, сложение при которой по операции and с переменной типа TVarData возвращает истинный тип переменной. Например:

VarType(V) and varTypeMask = varDouble

вернет true, если в переменной V в данный момент хранится значение типа double или массив значений double.

Некоторые значения типов, возвращаемые функцией VarType:

VarType — Функция Delphi

От Delphi 4 к Delphi 5 Тип данных Variant.
В Delphi представлен качественно новый подход к обработке переменных тип Variant. Этот тип впервые был введен для поддержки OLE, но оказал большое влияние на весь язык. Тип данных Variant позволяет хранить любые типы данных и выполнять ряд специфических операций и преобразования типов.
Данный подход противоречит основному принципу языка Pascal и хорошему стилю программирования. Варианты вычисляются и проверяются на этапе выполнения. Вам не придет на помощь компилятор и не предупредит о несовместимости типов.
Но во многих случаях без типа Variant действительно не обойтись.
Рассмотрим пример использования типа данных Variant. Для этого поместите на форму три компонента Edit и кнопку Button.
Напишите следующий программный код:
procedure TForm1.Button1 Click(Sender: TObject);
var
V:Variant;
begin
V:=15;
Edit1.Text:=V;
V:=’Я и Delphi’;
Edit2.Text:=V;
V:= 78.56;
Edit3.Text:=V;
end;

end.
Результат работы программы показан на рисунке 1.
Что вы видите? Вы видите, что свойству Text элемента редактирования через переменную Variant можете присвоить не только строку, но также целое число или вещественное число.
Процесс компиляции прошел успешно.
Переменные типа Variant можно эффективно использовать для проведения вычислений.
Поместите на форму два компонента Edit и кнопку Button.
Напишите следующий программный код:
procedure TForm1.Button1 Click(Sender: TObject);
var
V:Variant;
K:Integer;
begin
V:=Edit1.Text;
K:=Integer(V)*6;
V:=K;
Edit2.Text:=V;
end;

end.
Перед запуском приложения на компиляцию введите числовые значения в свойство Text компонента Edit1. Результат работы представлен на рисунке 2.
Удобно использовать тип данных Variant, когда число вводится одного типа, а вычисления проводятся с данными другого типа, в дальнейшем преобразуя результат в значение, возможно, третьего типа.
Но во всех случаях необходимо соблюдать осторожность при работе с типом данных Variant.
Итак, мы установили, что тип данных Variant разработан для тех случаев, когда на этапе компиляции программист не может сказать, какого типа данные будут использоваться в выражении.
Язык Object Pascal является строго типизированным языком. Но тип Variant отступает от этих правил. В переменных типа Variant могут храниться данные любых типов, кроме записей, множеств, статических массивов, файлов, классов, ссылок на классы, указателей и Int64. Иначе говоря, переменные типа Variant могут хранить все, кроме структур, указателей и Int64. Они могут также хранить объекты COM и CORBA, обеспечивая доступ к их методам и свойствам, динамические массивы и специальные массивы Variant.
Variant имеет смысл использовать в тех случаях, когда тип того или иного объекта заранее не известен или когда какие-то функции и процедуры требуют именно такой тип аргументов. При этом надо иметь в виду, что затраты памяти и времени на работу с переменными типа Variant больше, чем при работе с обычными типами. К тому же недопустимые операции с переменными типа Variant приводят к ошибкам времени выполнения, тогда как недопустимые аналогичные операции с переменными других типов выявляются на этапе компиляции.
Переменные Variant занимают 16 бит и содержат код типа и значение переменной или указатель на это значение. В момент создания эти переменные инициализируются специальным значением Unassigned. Значение переменной null свидетельствует о неизвестном или ошибочном значении переменной.
В Object Pascal определены два особых значения Variant. Значение Unassigned применяется для указания, что вариантной переменной пока не присвоено значение какого бы то ни было типа. Значение Null указывает на наличие в переменной данных неизвестного типа или потерю данных. Разницу между этими двумя значениями трудно уловить. Значение Unassigned присваивается вариантным переменным автоматически при их создании, независимо от того, локальная это переменная или глобальная, и является ли она частью другой, структурной, переменной, такой как запись или массив. Unassigned означает, что к данной вариантной переменной еще не обращались. Null же означает, что к вариантной переменной обращались, но не ввели в нее никакой информации. Таким образом, Null указывает, что значение вариантной переменной недействительно или отсутствует.
Переменные типа Variant могут использоваться в выражениях как операнды любых операций, кроме ^, is и in, совместно с другими величинами типов variant, integer, real, string, boolean. Компилятор в этих случаях автоматически осуществляет приведение типов величин в выражении. Если оба операнда операции имеют тип Variant и один или оба операнда равны null, то результат операции тоже равен null. Если один или оба операнда имеют значение Unassigned, то генерируется исключение. Если в бинарной операции только один из операндов имеет тип Variant, то другой тоже преобразуется в тип Variant.
Приведение типов при вычислении выражений, содержащих операнды Variant, осуществляется обычным образом. Например, если V1 и V2 типа Variant содержат данные типов integer и real, то выражение V1 + V2 вернет значение real.
Узнать действительный тип значения переменной Variant можно с помощью функции VarType, возвращающей значение типа TVarData, содержащее код типа.
Следующий код демонстрирует использование вариантов и некоторых автоматических преобразований (конверсия), выполненных, когда варианты смешиваются с другим типом.
var
V1, V2, V3, V4, V5: Variant;
I: Integer;
D: Double;
S: String;
begin
V1 := 1; < целый тип >
V2 := 1234.5678; < действительный тип >
V3 := ‘Hello world!’; < строковый тип >
V4 := ‘1000’; < строковый тип >
V5 := V1 + V2 + V4; < действительный тип 2235.5678>
I := V1; < I = 1 (целый тип) >
D := V2; < D = 1234.5678 (действительный тип) >
S := V3; < S = ‘Hello world!’ (сроковый тип) >
I := V4; < I = 1000 (целый тип) >
S := V5; < S = ‘2235.5678’ (строковый тип) >
Правила преобразования при участии вариантов в выражениях, а также при присваивании их значений переменным других типов, размещенных в варианте данных, см в таблице 1.
Функция VarType позволяет узнать действительный тип значения переменной Variant. Функция возвращает значение типа TVarData, содержащее код типа. Запись TVarData определена в модуле System. Имеется также предопределенная константа varTypeMask, сложение которой по операции and с переменной типа TVarData возвращает истинный тип переменной. Например, выражение
VarType(V) and varTypeMask = varDouble
вернет True, если в переменной V в данный момент хранится значение типа Double или массив значений типа Double.
Возможные значения типов, возвращаемых функцией VarType, следующие:
varEmpty $0000 переменная в состоянии Unassigned;
varNull $0001 значение переменной равно null;
VarSmallint $0002 тип Smallint;
varInteger $0003 тип Integer;
varSingle $0004 тип Single;
varDouble $0005 тип Double;
varCurrency $0006 тип Currency;
varDate $0007 тип TDateTime (дата и время);
varOLEStr $0008 ссылка на динамически размещаемую строку UNICODE;
varDispatch $0009 ссылка на автоматический объект (указатель на интерфейс IDispatch);
varError $000A код ошибки операционной системы;
varBoolean $000B тип WordBool;
varUnknown $000D ссылка на неизвестный объект COM (указатель на интерфейс IUnknown);
varByte $0011 тип Byte;
varString $0100 ссылка на динамически размещаемую строку в стиле Pascal (тип AnsiString);
varTypeMask $0FFF битовая маска для извлечения кода типа;
varArray $2000 бит, устанавливаемый при ссылке на массив variant;
varByRef $4000 бит, устанавливаемый при ссылке на тип variant.
Двенадцать младших битов, определенные маской varTypeMask, соответствуют типу данных. Бит varArray установлен, если в переменной хранится массив данного типа. Бит varByRef установлен, если переменная является ссылкой на данный тип.
Необходимо обратить внимание, что использование вариантов приводит к увеличению длительности процесса вычислений и других операций.
Чтобы сравнить скорость работы программы с использованием данных типа Variant целого типа, проделайте следующие операции.
1. Запустите Delphi.
2. Поместите на форму четыре компонента Label, две кнопки Button, два компонента ProgressBar.
3. Запишите следующий программный код:
procedure TForm1.Button1 Click(Sender: TObject);
var
time1, time2: TDateTime;
n1, n2: Variant;
begin
time1 := Now;
n1 := 0;
n2 := 0;
ProgressBar1.Position := 0;
while n1 = ClientWidth then
Dir := up_left;
end;
down_right: begin
Shape1.Left := Shape1.Left + 10;
Shape1.Top := Shape1.Top + 10;
if Shape1.Top + Shape1. Height > = ClientHeight then
Dir := up_right;
if Shape1.Left + Shape1.Width > = ClientWidth then
Dir := down_left;
end;
down_left: begin
Shape1.Left := Shape1.Left – 10;
Shape1.Top := Shape1.Top + 10;
if Shape1.Top + Shape1. Height > = ClientHeight then
Dir := up_left;
if Shape1.Left = ClientHeight then…
if Shape1.Left + Shape1.Width > = ClientWidth then…
В программе имеется возможность получить значения координат квадрата на форме в любой момент времени.
Результат работы программы в виде траектории движения фигуры показан на рисунке 6.
Следующий программный код превращает компонент Shape в круг, внутренняя часть которого заполнена диагональными линиями красного цвета:
procedure TForm1.Button1 Click(Sender: TObject);
begin
Shape1.Shape:=stEllipse; <форма фигуры>
Shape1.Brush.Color:=ClRed; <цвет внутреннего заполнения фигуры>
Shape1.Brush.Style:=bsBDiagonal; <заполнение диагональными линиями>
Shape1.Pen.W > end;
end.

На рисунке 7 показаны значения комплексного свойства Brush для компонента Shape.
На рисунке 8 показаны некоторые значения комплексного свойства Pen для компонента Shape.

Литература:
1. Марко Канту. Delphi 2 для Windows 95/NT. Москва. ООО “Малип”. 1997г.
2. Джон Матчо. Дэвид Р. Фолкнер. Delphi. Москва. БИНОМ. 1995г.
3. Эндрю Возневич. Delphi. Освой самостоятельно. Москва. Восточная книжная компания. 1996г.
4. В.В.Фаронов. Delphi 5. Учебный курс. Москва. Издательство Нолидж. 2000г.
5. А. Я. Архангельский. Программирование в Delphi 5. Москва. ЗАО “Издательство Бином”. 2000г.
Владимир Скуратов

Заметки о Pascal, Delphi и Lazarus

Следует ожидать переводов разделов справочной системы Delphi, компиляций из учебников, переводы статей, «путевые заметки» и прочие интересности. Блог прежде всего ориентирован на студентов, но опытных людей я тоже буду рад видеть;-)

вторник, 10 мая 2011 г.

Вариантные типы

Обзор вариантов

Иногда бывает необходимо работать с данными, тип которых различается или не может быть определен на момент компиляции программы. В этих случаях, одним из решений может быть использование переменных и параметров типа Variant, который представляет собой значения, изменяемые при выполнении программы. Тип Variant предлагает большую гибкость, но требует больше памяти, чем обычные переменные, и операции с ним медленнее, чем со статическими типами. Более того, в отличие от обычных типов данных, при работе с которыми ошибки зачастую могут быть выявлены при компиляции, недопустимые операции над данными этого типа часто вызывают ошибки при выполнении программы (runtime errors). Вы можете создавать собственные вариантные типы.

По умолчанию переменные типа Variant могут хранить данные любого типа, кроме записей, множеств, статических массивов, файлов, классов, ссылок на классы и указателей. Другими словами, вариантный тип может хранить любые данные, за исключением структурированных типов данных и указателей. Они могут хранить интерфейсы и обеспечивать доступ к их методы и свойствам. Они могут хранить динамические массивы и особые виды статических массивов, называемых вариантными массивами. При работе с данными типа Variant (при присваивании и в выражениях) их можно смешивать с другими значениями этого типа, а также с целыми, вещественными числами, строками и булевскими значениями. При этом компилятор будет автоматически производить необходимые преобразования типов.

Переменные типа Variants, содержащие строки, не могут индексироваться. То есть если V – это значение типа variant, которое содержит строковое значение, то обращение к конструкции V[1] вызовет ошибку выполнения программы.

Вы можете определить собственные типы Variant для расширения этого типа и хранения произвольных значений. Например, вы можете определить строковый вариантный тип, который будет позволять индексирование строк или хранение каких-либо ссылок на класс, записей или статических массивов. Пользовательские вариантные типы определяются при помощи создания наследников класса TCustomVariantType.

Замечание:Эта и практически вся функциональность вариантного типа реализована в модуле Variants.

Значение типа variant занимает 16 байтов памяти и состоит из значения (либо указателя на значение) и кода типа этого значения. Значения типа variant инициализируются при создании особым значением Unassigned. Особое значение Null указывает на отсутствие или неизвестный тип данных.

Стандартная функция VarType возвращает код типа данных для значения variant. Константа varTypeMask – это битовая маска, используемая для получения кода из значения, возвращаемого VarType. Например:

Возвращает True, в том случае, если V содержит значение типа Double или массив значений типа Double. (Маска просто прячет первый бит, который указывает, содержит ли переменная типа Variant массив или нет). Запись TVarData, определенный в модуле System может использоваться для преобразования значений типа variants и получения доступа к их внутреннему представлению.

Преобразование типа Variant

Все целочисленные, строковые и булевские типы совместимы по присваиванию с типом Variant. Выражения могут быть явно преобразованы к типу varaint, а стандартные подпрограммы VarAsType и VarCast могут использоваться для изменения внутреннего представления в переменной типа variant. Следующий пример демонстрирует применение типа Varaint и некоторые автоматические преобразования, производимые в случае смешивания типа Varaint с остальными типами данных:

Компилятор производит преобразование по следующим правилам:

Целевой/Исходный: integer real string Boolean
Integer Преобразование целочисленных форматов Преобразует в вещественный тип Преобразует в строковое представление Возвращает False если 0, в остальных случаях True
real Округляет до ближайшего целого Преобразует вещественный формат Преобразует в строковое представление с использованием региональных настроек Возвращает False если 0, в остальных случаях True
string Преобразует в целое число, выполняя «обрезку» значения , если это необходимо. Если строка не является представлением числа – возникает исключительная ситуация Преобразует в вещественное число с использованием региональных настроек. Если строка не является представлением числа – возникает исключительная ситуация. Преобразует строковый/символьный форматы Возвращает False в том случае если строка ‘false’ (без учета регистра) или строка содержит число равное 0, возвращает True если строка ‘true’ или строка содержит число неравное 0; в остальных случаях возникает исключительная ситуация
character Аналогично строковому типу (в предыдущей строке) Аналогично строковому типу (в предыдущей строке) Аналогично строковому типу (в предыдущей строке) Аналогично строковому типу (в предыдущей строке)
Boolean False = 0, True: все биты установлены в 1 (-1 в случае с Integer, 255 в случае с Byte, и т.д.) False = 0, True = 1 False = ‘False’, True = ‘True’ по умолчанию. Преобразование зависит от глобальной переменной False = False, True = True
Unassigned Возвращает 0 Возвращает 0 Возвращает пустую строку Возвращает False
Null Зависит от глобальной переменной (по умолчанию вызывает исключительную ситуацию) Зависит от глобальной переменной (по умолчанию вызывает исключительную ситуацию) Зависит от глобальной переменной (по умолчанию вызывает исключительную ситуацию) Зависит от глобальной переменной (по умолчанию вызывает исключительную ситуацию)

Присваивания значений, выходящие за рамки диапазона типа часто приводят к тому, что целевая переменная получает максимальное значение из своего диапазона значений. Неверные операции, присваивание или преобразования типов значений переменных Variant вызывают исключительную ситуацию класса Variants.EVariantError (или класса-наследника EvariantError).

Специальные правила действуют для преобразования типа System.TDateTime, объявленного в модуле System. When a System.TDateTime преобразуется в любой другой тип, при этом он обрабатывается как тип Double. Когда значения типов integer, real или Boolean преобразуются в System.TDateTime, они сначала преобразуются в Double, а затем читаются как значения типа TDateTime. При преобразовании строки в System.TDateTime, она интерпретируется как System.TDateTime с использованием региональных настроек. Когда значение Unassigned преобразовывается в System.TDateTime, оно обрабатывается как вещественное или целочисленное значение равное нулю. Преобразование значения Null в System.TDateTime вызывает исключительную ситуацию.

На платформе Win32, если значение типа variant ссылается на интерфейс COM, то любая попытка его преобразования вызовет чтение основного свойства объекта (default property) и преобразование его значения к целевому типу. Если объект не имеет основного свойства, — это вызовет исключительную ситуацию.

Значения типа Variant в выражениях

Все операторы, кроме ^, is и in принимают операнды типа variant. Кроме сравнений, которые всегда возвращают значение типа Boolean, все операции над значениями типа variant возвращают значение типа variant. Если выражение комбинирует значения типа variant со значениями статических типов, последние автоматически преобразовываются к значениям типа variant.

Это утверждение не верно для ситуации со сравнениями, где любая операция со значением Null возвращает Null. Например:

Присваивает значение Null переменной V. По умолчанию сравнения обрабатывают значение Null как уникальное значение, которое меньше других значений. Например:

В этом примере секция else инструкции if никогда не будет выполнена. Такое поведение можно изменить установкой значений для глобальных переменных NullEqualityRule и NullMagnitudeRule.

Вариантные массивы

Вы не можете связать переменную типа variant с обычным статическим массивом. Вместо этого следует создавать вариантный массив, вызывая стандартные функции VarArrayCreate или VarArrayOf. Например:

Создает вариантный массив целых чисел с десятью элементами и связывает этот массив с переменной V.
Массив может индексироваться как V[0], V[1] и так далее, но передача элементов вариантного массива в подпрограммы по ссылке невозможна. Вариантные массивы всегда индексируются типом integer.

Второй параметр при вызове VarArrayCreate – это код базового типа для массива. Список кодов указан в описании функции VarType. Никогда не следует передавать код varString в VarArrayCreate. Для создания вариантного массива строк используйте varOleStr.

Переменные типа Variants могут хранить вариантные массивы различной длины, размерности и базовых типов. Элементы вариантного массива могут быть любого типа, разрешенного для типа Variant, кроме ShortString и AnsiString. Кроме того, если базовый тип массива – Variant, его элементы могут быть гетерогенными. Для изменения размеров вариантного массива пользуйтесь функцией VarArrayRedim. Прочие функции, которые работают с вариантными массивами: VarArrayDimCount, VarArrayLowBound, VarArrayHighBound, VarArrayRef, VarArrayLock и VarArrayUnlock.

Замечание: Вариантные массивы пользовательских вариантных типов не поддерживаются, поскольку экземпляры пользовательских вариантных типов могут быть добавлены в вариантный массив VarVariant.

Когда переменная типа variant, содержащая вариантный массив связывается с другим вариантным массивом или передается как параметр-значение в подпрограмму, выполняется копирование всего массива. Не следует выполнять такие операции без необходимости, поскольку они неэффективны с точки зрения расходования памяти.

OleVariant

Основная разница между типами Variant и OleVariant заключается в том, что тип Variant может содержать типы данных, о которых «знает» приложение. Тип OleVariant может содержать типы, объявленные как совместимые с OLE Automation. Это означает, что данные этих типов могут передаваться от программе к программе или по сети, при этом можно не заботиться о том, как принимающая сторона будет их обрабатывать.

При присваивании значения типа Variant, содержащего пользовательские данные (такие как строковый тип Delphi или другой пользовательский тип) переменной типа OleVariant, библиотека пытается сконвертировать это значение в один из стандартных типов OleVariant (например, строковый тип Delphi преобразуется в строку OLE BSTR). Если значение типа variant содержит AnsiString присваивается переменной типа OleVariant, значение AnsiString преобразуется в WideString. Последнее справедливо и для передачи значений типа Variant в функцию, принимающую параметры типа OleVariant.

VarType — Функция Delphi

Функция служит для определения кодового обозначения типа данных переменной или свойства объекта

Возвращает значение типа Integer , указывающее подтип переменной

Параметры VarName Обязательный параметр, являющий значением типа Variant , содержащим любую переменную Возвращаемые значения

Константа Значение Описание
vbEmpty Значение Empty (не инициализированная переменная)
vbNull 1 Значение Null (действительные данные отсутствуют)
vbInteger 2 Значение типа Integer
vbLong 3 Значение типа Long integer
vbSingle 4 С плавающей точкой обычной точности
vbDouble 5 С плавающей точкой двойной точности
vbCurrency 6 Значение типа Currency
vbDate 7 Значение типа Date
vbString 8 Значение типа String
vbObject 9 Объект
vbError 10 Значение ошибки
vbBoolean 11 Значение типа Boolean
vbVariant 12 Значение типа Variant (используется только с массивами значений типа Variant)
vbDataObject 13 Объект доступа к данным
vbDecimal 14 Значение типа Decimal
vbByte 17 Значение типа Byte
vbUserDefinedType 36 Значения типа Variant, содержащие типы, определенные пользователем
vbArray 8192 Массив

Примечания

Функция VarTypeникогда не возвращает значение vbArray само по себе. Эта константа всегда складывается с каким-либо другим значением, указывающим тип массива. Константа vbVariant возвращается только в сочетании с константой vbArray , чтобы показать, что в параметре функции VarType указан массив типа Variant . Например, значение возвращенное для массива целых чисел вычисляется как vbInteger + vbArray , или равняется 8194. Если объект имеет свойство,установленное по умолчанию, то функция VarType(Object) возвращает тип этого свойства объекта

Илон Маск рекомендует:  Число в HTML
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL