Синтаксис структурных типов данных |
Структуры могут быть описаны двумя способами: явно и путем наследования от узла логической таблицы. Первый способ совпадает с описанием записей в языке Паскаль:
<описание-структуры> = record <описание-поля> [{<описание-поля> }] end;
Ключевое слово record вводит описание структуры. Структура определяется списком описаний полей структуры.
<описание-поля> - задает имя и тип поля структуры:
<описание-поля> = <имя-поля> : <описание-типа>
<имя-поля> - идентификатор.
<описание-типа> - тип поля структуры:
<описание-типа> = <имя-ранее-определенного-типа-данных> | <имя-стандартного-типа> | <описание-массива-или-структуры>
Приведенный способ описания структурных типов данных может быть применен для определения типов данных пользователя, а также для объявления переменных (глобальных, переменных интерфейса, логической таблицы, локальных переменных методов и обработчиков событий).
Формальный параметр функции не может быть определен как неименованная структура. Если требуется передать структуру как параметр функции, необходимо предварительно описать новый тип данных, соответствующий этой структуре.
Например:
type myRecord = record Data : integer; end; function myfunction (r : myRecord) : boolean;
Структуры могут быть элементами массива, например:
type myArray = array [1..10] of record a : integer; end;
или:
type myRec = record a : integer; end; type myArray = array [1.. 10] of myRec;
Вторым способом описания структур является их наследование от структуры записи физической таблицы:
<описание-структуры> = record as table <имя-таблицы> [with x$position];
<имя-таблицы> - таблица БД, от которой наследуется структура записи.
Флажок x$position указывает на то, что компилятор создаст одноименное поле в описываемой структуре. Поле x$position будет первым полем структуры. При использовании оператора присваивания структур, это поле тоже будет копироваться.
Такое описание определяет структуру, соответствующую записи указанной таблицы БД, ее полями являются все поля физической таблицы за исключением мемо-полей и массивов (до Атлантис 5.1.23).
Начиная с Атлантис 5.1.23 внутренняя структура типа, описываемого как record as table <имя-таблицы> (или type$<имя-таблицы>, см. "Работа с таблицами. "), зависит от области видимости (см. "Типы данных пользователя. "), с которой он был определен.
Если такой тип описан с префиксом private, то он будет представлять собой структуру, воспроизведённую по указанной таблице базы данных. Естественно, это возможно только в том случае, если такая таблица определена в компилирующемся компоненте. Если тип описан с префиксом public, то он унаследует свою структуру от объекта-оболочки с соответствующим именем.
Если поле x$position описать в структуре как x$position: TPositionHandle, то копирование будет отрабатывать корректно, так как связывание полей происходит по именам. Поэтому, если поле x$position сделать не первым полем структуры, то значения полей, расположенных в структуре выше x$position будут затерты, так как при копировании позиции срабатывает ClearBuffer.
Описание пользовательских типов.
Начиная с Атлантис 5.1.23 внутренняя структура типа, описываемого как record as table <имя-таблицы> (или type$<имя-таблицы>), зависит от области видимости, с которой он был определен.