Тип Variant используется для описания тех переменных, для которых во время компиляции нельзя определить тип данных, который будет храниться в этих переменных. Тип данных, хранящихся в этих переменных, может меняться во время исполнения программы. В переменную типа Variant можно присвоить любую переменную и после взять её оттуда. Также в переменной может быть сохранена ссылка на объект.
При использовании типа Variant необходимо учитывать, что переменные данного типа занимают больший объем памяти, и операции над переменными данного типа выполняются медленнее, чем над переменными определенных типов. Это связано с тем, что переменная типа Variant помимо значения переменной хранит информацию о типе хранящегося значения.
Значением переменной типа Variant по умолчанию является значение Null. Это значение означает отсутствие данных в переменной.
Примечание. Наследование от класса базового типа Variant запрещено.
При получении значения из переменной типа Variant и присвоении данного значения переменной, имеющей определенный тип, осуществляется проверка на возможность преобразования к данному типу. Если неявное преобразование возможно, то значение будет установлено, иначе генерируется исключительная ситуация.
Sub Sample;
Var
s: String;
d: DateTime;
d1: Double;
i: Integer;
v: Variant;
Begin
s := "2000.01.01 12:00:00";
v := s;
d := v;
Debug.WriteLine(d.Date.ToString + " " + d.TimeOfDay.Hour.ToString);
d1 := 3.14;
v := d1;
i := v;
Debug.WriteLine(i);
End Sub Sample;
Неявное преобразование может осуществляться не только между простыми типами значений, но и между системными типами и типами, определенными в прикладном коде. При этом, если преобразование возможно, в результирующей переменной также будет доступна ссылка на объект, которая была сохранена в переменной типа Variant.
Sub Sample1;
Var
b: IButton;
c: IControl;
v: Variant;
Begin
b := New Button.Create;
b.Text := "Кнопка";
v := b;
c := v;
Debug.WriteLine(c.Text);
End Sub Sample1;
В Fore реализовано неявное преобразование при использование переменных типа Variant в операторах If и ?:.
Sub Sample2;
Var
v: Variant;
Begin
v := True;
If v Then
Debug.WriteLine("Истина");
Else
Debug.WriteLine("Ложь");
End If;
v := Math.RandBetweenI(0, 100);
Debug.WriteLine(v > 50 ? "Больше 50" : "Меньше 50");
End Sub Sample2;
Для явного преобразования необходим оператор As. Явное преобразование используется, когда при преобразовании возможна потеря данных, или когда преобразование по каким-либо причинам может завершиться исключительной ситуацией. Для проверки возможности явного преобразование может использоваться оператор Is.
Sub ConvertFromVariant;
Var
v: Variant;
i: Integer;
d: Double;
d1: DateTime;
s: String;
b: Boolean;
Begin
v := 21.9;
b := v Is Integer; //True
b := v Is Double; //True
b := v Is DateTime; //True
b := v Is String; //True
b := v Is Boolean; //True
i := v As Integer; //22
d := v As Double; //21,9 (Примечание: разделитель целой и дробной части
зависит от настроек ОС)
d1 := v As DateTime; //20.01.1900 21:36:00
s := v As String; //"21.9"
b := v As Boolean; //True
End Sub ConvertFromVariant;
Для переменных типа Variant доступны все операции, определенные в языке Fore. Тип результирующего значения зависит от конкретных значений, хранящихся в переменных. При необходимости, перед выполнением операции будет осуществляться неявное преобразование типов. Если в результате преобразований выполнение операции невозможно, то генерируется исключительная ситуация.
См. также: