Преобразование структурных типов |
Для переменных структурного типа допустима операция присвоения, эта операция применима только к структурам одного и того же типа. Автоматического преобразования типов никогда не производится.
При необходимости присвоения "похожих" структур необходимо явно указывать оператор преобразования типов (см. раздел "Преобразование типов данных. "). При этом используется следующий алгоритм преобразования:
для каждого поля исходной структуры система пытается найти одноименное поле в целевой структуре;
если поле найдено, то система пытается произвести преобразование типа для поля из структуры-источника к типу поля структуры-приемника;
если преобразование завершено успешно, то поле целевой структуры приобретает значение, иначе - поле становится невалидным (значение не определено);
все поля в целевой структуре, для которых не нашлись соответствия в исходной структуре, становятся невалидными;
если ни для одного поля исходной структуры не нашлось соответствия в целевом типе, то выдается ошибка компиляции;
если в процессе приведения структурных типов возникает необходимость в приведении типов для полей структур, то на каждое такое приведение генерируется предупреждение компилятора. Например, если поле типа Integer приводится к типу String;
если для какого-то из полей в одном из структурных типов не нашлось соответствия в другом типе, то генерируется предупреждение компилятора.
Здесь под валидностью поля понимается степень актуачельности того знания, которое хранится в поле. Если поле валидно, то значение является актуальным, иначе - значение поля соответствует значению по умолчанию для соответствующего типа. В невалидное поле можно записывать значения, при этом поле становится валидным. При чтении значения из невалидного поля считывается значение по умолчанию и генерируется исключение VIP, которое по умолчанию ничего не делает. В VIP'е можно определить обработчик для таких исключений.
Проверить валидность поля структуры можно функцией Verify.
Для "силового" приведения несовпадающих структурных типов используется оператор cast: Оператор введен начиная с Атлантис 5.1.25.
<оператор-cast> = <целевая-структура> = (<целевой-тип>, <исходная-структура>);
TPrjMaterials = record as table PrjMaterials; PMRecordType = record // содержит часть полей PrjMaterials QuantP : double; QuantF : double; SummP : double; SummF : double; end; var tblPM : TPrjMaterials; recPM : PMRecordType; ...... tblPM := PrjMaterials.buffer; // recPM := PrjMaterials.buffer; // (1) recPM := PMRecordType(PrjMaterials.buffer); // (2) recPM := cast(PMRecordType, PrjMaterials.buffer); // (3)
Если раскомментировать строку (1), то при компиляции будет выдано сообщение об ошибке "Несовместимость типов".
На строку (2) будут выданы предупреждения "Поле xxx не найдено в целевом типе", по одному на каждое ненайденное поле.
Строка (3) будет откомпилирована без выдачи предупреждений. Результат присвоения будет такой же, как и в строке (2).
Оператор cast введен начиная с Атлантис 5.1.25.