Операторы As и Is
Операторы As и Is предназначены для работы с переменными типа Variant и классами.
Оператор As объясняет компилятору, что переменная содержит конкретный тип данных. Оператор As не изменяет значения переменной, кроме случая описанного ниже.
Оператор Is проверяет, что переменная содержит конкретный тип данных или класс. Возвращаемое значение Boolean.
Пример:
Procedure OnCreate; Var V : Variant; I : Integer; Begin V := 1; I := V; // Переменную типа Variant нельзя записать в переменную конкретного типа. Sin(V); // Переменную типа Variant нельзя передать в функцию с аргументом отличного типа. End;
С помощью оператора As можно объяснить компилятору, что в V содержится определенный тип данных.
Procedure OnCreate; Var V : Variant; I : Integer; Begin V := 1; I := V As Integer; Sin(V As Integer); End;
Оператор As не преобразовывает типы данных, хоть следующий пример синтаксически корректен, но при его выполнении произойдет исключение.
Procedure OnCreate; Var V : Variant; I : Integer; Begin V := '1'; I := V As Integer; Sin(V As Integer); End;
Аналогично оператор As работает с классами, позволяя привести базовый класс к конкретной реализации. И пример оператора Is.
Procedure Test(V : Field); Begin If V Is IntegerField Then Begin Warning('Объект является IntegerField'); If V Is IntegerLookupField Then Warning('Объект является IntegerLookupField. Его свойство Text равно ' + (V As IntegerLookupField).Text); End; If V Is StringField Then Warning('Объект является StringField'); End;
Подобно языку запросов, работает оператор Is Null
Procedure OnCreate; Var V : Variant; Begin If V Is Null Then Warning('X Is Null'); End;
Для получения свойства объекта не обязательно приводить объект к конкретному классу, если вы используете Variant.
Пример:Procedure Test(V : Variant); Begin If V Is IntegerField Then Begin Warning('Объект является IntegerField'); If V Is IntegerLookupField Then Warning('Объект является IntegerLookupField. Его свойство Text равно ' + V.Text As String); End; If V Is StringField Then Warning('Объект является StringField'); End;
Особые случаи
При всем желании сохранить концепцию "не преобразования", ради повышения читабельности программы в платформу были добавлены некоторые преобразования:
Значения типа Integer преобразуется в значение типа Float, Currency.
Значения типа Integer, Float, Currency, Boolean, DateTime преобразуются в String.
При преобразовании в Integer, Float, Currency значение Null заменяется на 0. При преобразовании в Boolean значение Null заменяется на False. При преобразовании в String в значение Null заменяется на пустую строку.