Program UsingVariant Var
V: Variant; ; : rv.
I: Integer; ::::
Begin V := 'a280' ; . "
I := V;
End.
Выполнение такой прогг нием об ошибке: "Сс:1: into type (Integer " -Integer". Эта ошибка : вать строку в числовое ъ\ лить целое число именно
Правила трансформации выражениях приведены 5
Листинг 2.10. Пример безошибочного использования вариантной переменной
Program UsingVariants2; Var
V: Variant;
Правила изменения вариантных :■■
I: Integer; Begin V:= v280';
I:= V;
End.
(Описание вариантной переменной, тип переменной не определен} (Описание переменной типа String}
{Присвоение значения вариантной переменной V, переменной назначается строковый тип данных}
{Целочисленной переменной I присваивается значение вариантной переменной V. Значение переменной I становится равным 2 80}
Но значением переменной V могла бы быть не строка '280', а, например, строка ‘a28 0' — см. листинг 2.1.1.
Листинг 2.11. Пример возникновения ошибочной ситуации
Program UsingVariants3 ; Var
V: Variant;
I: Integer; Begin V := 'a280';
I:= V;
End.
{Описание вариантной переменной, тип переменной не определен} (Описание переменной типа String}
{Присвоение значения вариантной переменной V, переменной назначается строковый тип данных}
{Ошибка времени выполнения — несоответствие типов, так как из строковой вариантной переменной невозможно выделить целочисленное значение}
Выполнение такой программы невозможно и будет прервано с сообщением об ошибке:"Could not convert variant of type (String) into type (Integer)" — "Невозможно- привести тип String к типу Integer". Эта ошибка появляется не из-за невозможности преобразовать строку в числовое значение вообще, а из-за невозможности выделить целое число именно из этой строки.
Правила трансформации вариантных значений при использовании их в выражениях приведены в табл. 2.5.
Правила изменения вариантных значений
Таблица 2.5
Тип переменной источника | Тип переменной-приемника | |||
Целочисленные | Вещественные | Строковые | Логические | |
Целочисленные | без изменения | без изменения | Перевод в строку | 0 -> False, иначе True |
Вещественные | округление | без изменения | Перевод в строку | 0 -> False, иначе True |
Строковые | выделение числа с округлением | выделение числа | без изменения | "false" -> False "true" -> True если можно выделить число: 0 -> False иначе True |
Логические | False -> 'О' True -> '-1 | False -> '0' True -> '-1 | False -> '0' True -> '-1' | без изменения |
Значение Unassigned | Пустая строка | False | ||
Значение Null | Сообщение об ошибке |
2.5.5. Вариантные массивы
Как было отмечено выше, значением вариантной переменной не может являться массив, описанный по обычным правилам. Однако Delphi предлагает специальный вариантный массив, который можно создать с помощью функции VarArrayCreate, описанной в модуле Variants:
FunctionVarArrayCreate(constBounds: VarType: TVarType): Variant;
array ofInteger;
Параметр Bounds является массивом целочисленных значений, каждая пара которых определяет пределы изменения индексов. Количество измерений массива, соответственно, определяется количеством пар значений в этом массиве. Вместо массива, заданного переменной, можно использовать конструкцию следующего вида:
<А2, В2>,
<An, Bn>j
Вторым параметром задается тип элементов массива. При этом могут использоваться любые константы, приведенные в табл. 2.4, за исключением varstring, однако для формирования массива строковых элементов допустимо использование константы varOleStr.
Рис. 2.1. Непрямоугольный однородный массив (слева) и неоднородный массив (справа)
Заметим, что вне зависимости от количества измерений массива все его элементы имеют один и тот же тип, указываемый при вызове функции VarArrayCreate, но если в качестве типа элементов задать константу varVariant, то элементом вариантного массива будет также являться вариант.
Следовательно, такому элементу можно присвоить вариантный массив, причем тип его элементов также может быть произвольным. Таким образом, в Delphi появилась возможность создания неоднородных (состоящих из элементов разного типа) массивов, или, например, однородных массивов непрямоугольной формы.
Для получения информации о размерностях и индексации вариантных массивов в модуле Variants предусмотрены следующие функции:
♦ VarArrayDimCount — возвращает размерность заданного вариантного масива.
♦ VarArrayLowBound — возвращает нижнюю границу индексов заданного вариантного массива для заданного измерения.
♦ VarArrayHighBound — возвращает верхнюю границу индексов заданного вариантного массива для заданного измерения.
Описание этих функций выглядит следующим образом:
FunctionVarArrayDimCount(constA: Variant) : Integer; FunctionVarArrayLowBound(constA: Variant; Dim: Integer):
Integer; FunctionVarArrayHighBound(constA: Variant; Dim: Integer):
Integer;
Пример использования и тех, и других приведен в листинге 2.12.
Листинг 2.12. Работа с вариантными массивами
Var
V: Variant;{Описание вариантной переменной} LI, HI, L2, Н2: Integer;
{Описание четырех целочисленных переменных}
Begin
V:= VarArrayCreate([0, 5, 3, 8], varlnteger);
{Создание двухмерного вариантного массива целочисленных элементов, аналогичного по описанию массиву Array[0..5, 3..8] Of Integer}
LI:= VarArrayLowBound(V, 1);
{Определение минимально возможного индекса элемента для первого измерения вариантного массива V и занесение его в переменную L1 (значение 0) }
HI:= VarArrayHighBound(V, 1);
{Определение максимально возможного индекса элемента для первого измерения вариантного массива V и занесение его в переменную HI (значение 5) }
L2:= VarArrayLowBound(V, 2);
{Определение минимально возможного индекса элемента для второго измерения вариантного массива V и занесение его в переменную L2 (значение 3) }
Н2 := VarArrayHighBound(V, 2);
{Определение максимально возможного индекса элемента для второго измерения вариантного массива V и занесение его в переменную Н2 (значение 8) )
2.5.6. Разрушение вариантных переменных
При описании вариантной переменной, а также при создании вариантного массива выделяется некоторое количество оперативной памяти. В случае использования локальных вариантных переменных память возвращается системе при достижении программой конца области видимости переменной.
В случае глобальных переменных разрушение структур данных происходит при присвоении новых значений вариантным переменным или при завершении программы. Это не всегда правильно, так как неиспользуемые глобальные переменные могут неоправданно занимать большой объем памяти, замедляя работу системы в целом. Для немедленного разрушения вариантной переменной предназначена процедура VarClear, по своему действию эквивалентная присвоению переменной значения Unassigned:
ProcedureVarClear(V: Variant);Например:
Var
V: Variant;
{Описание вариантной переменной)
Begin
V := VarArrayCreate ([0, 5, 3, 8], varlnteger);
{Создание двухмерного вариантного массива)
VarClear(V);
[Разрушение вариантного массива V}