Variant

Тип 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(0100);
    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. Тип результирующего значения зависит от конкретных значений, хранящихся в переменных. При необходимости, перед выполнением операции будет осуществляться неявное преобразование типов. Если в результате преобразований выполнение операции невозможно, то генерируется исключительная ситуация.

См. также:

Типы данных | Класс Variant