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