Общие положения
Top  Previous  Next


Vip-интерфейс может предоставлять свои процедуры и функции для вызова из других интерфейсов. Такая возможность реализуется одним из двух способов - либо с помощью объектных интерфейсов, либо с помощью квалификатора Public. Объектный интерфейс - это поименованная совокупность заголовков процедур и функций.  
Если Vip-интерфейс реализует один или несколько объектных интерфейсов, то говорят, что такой Vip-интерфейс имеет прототип. Как правило, прототип Vip-интерфейса (описание объектных интерфейсов и/или описание того, какие объектные интерфейсы реализуются данным Vip-интерфейсом) представляет собой отдельный исходный файл, подключаемый с помощью директивы #Include. Для того чтобы использовать такой Vip-интерфейс, необходимо подключить файл прототипа, либо, как минимум, файл (файлы) с описанием используемых объектных интерфейсов.  
Vip-интерфейс может не иметь прототипа. В этом случае те процедуры и функции, которые он предоставляет для вызова другим интерфейсам, помечаются квалификатором Public. Для использования такого интерфейса необходимо, чтобы он был заранее скомпилирован и помещен в один из файлов ресурсов, используемых при дальнейшей компиляции. Фактически, для Vip-интерфейса, не имеющего прототипа, неявно создается объектный интерфейс, содержащий все функции, объявленные как Public.  
В интерфейсе, вызывающем методы внешнего интерфейса, необходимо описать переменную, являющуюся ссылкой на вызываемый интерфейс - объектный, либо Vip-интерфейс.  
µ Переменная типа ссылки на VIP-интерфейс не может быть описана как глобальная (в файле проекта или вне тела VIP-интерфейса), а также в секциях .VAR и .FIELDS в шаблонах форм.  
Синтаксис объявления переменной-ссылки (далее просто ссылки) следующий:  
<ссылка> ::= <имя ссылки> : <тип>  
<тип> ::= {<имя VIP-интерфейса>|<имя объектного интерфейса>}  
<имя ссылки> ::= <идентификатор>  
<имя VIP-интерфейса> ::= <идентификатор>  
<имя объектного интерфейса> ::= <идентификатор>  
Пример  
В примере объявлена переменная А, являющаяся ссылкой на интерфейс ISelectPodr.  
var  
A : ISelectPodr  
........  
µ Если объявлена ссылка на Vip-интерфейс с прототипом, то с ее помощью можно использовать функции только первого объектного интерфейса, реализуемого данным VIP-интерфейса.  
Для вызова методов внешнего интерфейса используется следующая конструкция:  
<оператор вызова метода внешнего интерфейса>::=  
   <имя ссылки> . <оператор вызова метода>  
<имя ссылки> ::= <идентификатор>  
Имя ссылки задается при объявлении ссылки (см. выше).  
<оператор вызова метода>::= <имя метода>  
   [(<список фактических параметров>)]  
Загрузка внешнего интерфейса и инициализация ссылки осуществляется функциями LoadVipInterface, GetVipInterface, GetVipRef, LoadVipRef. Выгрузка копии интерфейса и освобождение ссылки (деинициализация) выполняются функцией FreeVipInterface. С помощью функции NullVipRef можно проверить - инициализирована ли переменная типа ссылки.  
Для переменных типа ссылки на Vip-интерфейс поддерживается автоматическая инициализация - если к моменту первого вызова метода переменная не проинициализирована - будет автоматически вызвана функция GetVipInterface. Для всех переменных типа ссылки поддерживается автоматическое освобождение ссылки при выходе из области существования переменной. Автоматическое освобождение равносильно вызову функции FreeVipInterface.  
Определены дополнительные события для VIP-интерфейса, возбуждаемые в моменты его загрузки, затребования новой ссылки, освобождения ссылки и выгрузки интерфейса.  
При загрузке Vip-интерфейсов и вызове их методов могут возбуждаться следующие исключения:  
· ExObjIfcNoInit - при попытке вызова метода с использованием переменной типа ссылки на объектный интерфейс, которая не была проинициализирована (а такая переменная не может быть проинициализирована автоматически); 
· ExObjIfcNoLoad - при попытке автоматической инициализации переменной типа ссылки на Vip-интерфейс, если этот Vip-интерфейс не может быть найден ни в списке загруженных, ни в одном из подключенных ресурсов;  
· ExObjIfcNoImpl - при вызове функций LoadVipRef и GetVipRef, если указанный Vip-интерфейс не реализует запрошенный объектный интерфейс;  
· ExObjIfcBadVar - при попытке использования переменной типа ссылки на Vip-интерфейс с функциями LoadVipRef или GetVipRef, и при попытке использования переменной типа ссылки на объектный интерфейс с функциями LoadVipInterface или GetVipInterface.  
Ограничения для переменной типа ссылки:  
переменная типа ссылки на VIP-интерфейс может быть присвоена другой переменной типа ссылки на интерфейс. При этом обе ссылки должны быть на один и тот же интерфейс;  
ссылка может участвовать в операции сравнения с другой ссылкой (сравнения на равенство и неравенство, остальные варианты сравнения не имеют смысла). Ссылки считаются равными в том, и только в том случае, если они ссылаются на одну и ту же загруженную копию интерфейса;  
ссылка не может быть явно или неявно приведена ни к какому числовому или строковому типу. Как следствие - такая переменная не может участвовать в арифметических и строковых выражениях.