Фейсы, фейсы, фейсы
Модераторы: m0p3e, edward_K, Модераторы
Фейсы, фейсы, фейсы
И снова фейсы, курил хэлп, но там примеров - кот наплакал. Задача такая - создать vipinterface Foo и глобальную переменную этого фейса varFoo, чтобы разные фейсы одного проекта могли вызывать методы Foo (в этих методах я хочу наполнять table struct-ы уровня проекта).
Так вот, что я сделал - создал 3 файла:
//Файл Foo.vip -> здесь реализация
#component "MyComp"
interface Foo;
public procedure MyProc;
{
заполнить table struct
}
...
//Файл Foo.vih -> здесь описание реализации
#component "MyComp"
vipinterface Foo;
public: procedure MyProc();
end;
//Файл Other.vip -> некоторый фейс
interface Bar;
procedure SomeFunc();
{
varFoo.MyProc();
}
//Файл Foo.var -> тут создание переменной типа Foo
var varFoo : Foo;
Затем включаю все это хоз-во в файл проекта:
// vip.prj
#make "Foo.vip"
#make "Foo.vih"
#make "Other.vip" // Какой-то фейс (interface)
#include Foo.var
естественно ничего не компилится. Как сделать по нормальному???
И объясните мне наконец зачем ввели vipinterface, если я могу создать переменную уже по interface. Какая-то лишняя сущность этот vipinterface, неужели только для наследования и описания используется и почему нельзя было то же самое возложить на interface. Какой-то архитектурный косяк, впрочем это наверное риторический вопрос.
Так вот, что я сделал - создал 3 файла:
//Файл Foo.vip -> здесь реализация
#component "MyComp"
interface Foo;
public procedure MyProc;
{
заполнить table struct
}
...
//Файл Foo.vih -> здесь описание реализации
#component "MyComp"
vipinterface Foo;
public: procedure MyProc();
end;
//Файл Other.vip -> некоторый фейс
interface Bar;
procedure SomeFunc();
{
varFoo.MyProc();
}
//Файл Foo.var -> тут создание переменной типа Foo
var varFoo : Foo;
Затем включаю все это хоз-во в файл проекта:
// vip.prj
#make "Foo.vip"
#make "Foo.vih"
#make "Other.vip" // Какой-то фейс (interface)
#include Foo.var
естественно ничего не компилится. Как сделать по нормальному???
И объясните мне наконец зачем ввели vipinterface, если я могу создать переменную уже по interface. Какая-то лишняя сущность этот vipinterface, неужели только для наследования и описания используется и почему нельзя было то же самое возложить на interface. Какой-то архитектурный косяк, впрочем это наверное риторический вопрос.
Foo.vih
Foo.vip
vip.prj
Other.vip
Код: Выделить всё
#ifndef _Foo_vih_INCLUDED_
#define _Foo_vih_INCLUDED_
#component "F_UserReport"
objinterface objFoo;
public procedure MyProc;
end;
Vipinterface iFoo implements objFoo licensed(Free);
#end
Код: Выделить всё
#include Foo.vih
interface iFoo;
...
public procedure MyProc;
{
Message('MyProc');
}
...
end. //Inteface
Код: Выделить всё
#include Foo.vih
#make "Foo.vip"
#make "Other.vip"
Код: Выделить всё
Interface Other '' EscClose;
Var varFoo:iFoo;
create view ddd as
select *
from
KatSopr
;
HandleEvent
cmInit:
{
if (not LoadVipRef(varFoo,'iFoo'))
{
Message(''#3+'Системная ошибка !!!'+
''#3+'Не загружен интерфейс <iFoo>',CancelButton);
Exit;
}
else
{
varFoo.MyProc;
}
abort;
exit;
}
cmDone:
{
FreeVipInterface(varFoo);
}
end;
end. //Interface
Вместо LoadVipRef пользуйся GetVipRef
Функция GetVipRef загружает VIP-интерфейс, имя которого задано вторым параметром (если он не загружен), либо находит уже загруженную копию, и формирует ссылку на objInterface того типа, к которому принадлежит переменная типа ссылки.
Если VIP-интерфейс, заданный вторым параметром, реализует объектный интерфейс, являющийся типом ссылки первого параметра, то в первый параметр помещается ссылка на объектный интерфейс указанного VIP-интерфейса.
Функция GetVipRef, совместно с функцией GetVipInterface, ведет список загруженных внешних VIP-интерфейсов, и счетчик ссылок на каждый загруженный интерфейс. Требуемый интерфейс (имя которого передано функции в качестве второго параметра) ищется среди загруженных интерфейсов (загрузка по GetVipInterface или GetVipRef). Если интерфейс найден, то ему передается событие cmOnVipUse, увеличивается счетчик ссылок, и возвращается ссылка на загруженную копию. Если интерфейс в списке не найден - он загружается, вставляется в список, ему передаются события cmOnVipLoad и cmOnVipUse, и возвращается ссылка на требуемый объектный интерфейс загруженной копии.
Проверяется - соответствует ли переменная типа ссылки запрошенной операции. Это означает, что для функции GetVipRef
Первым параметром обязательно должна быть переменная типа ссылки на objInterface. Если это условие нарушено, то будет возбуждено исключение ExObjIfcBadVar.
Описание
function GetVipRef (var ref : VarOfInterFaceType;
str : string
) : boolean;
Функция GetVipRef загружает VIP-интерфейс, имя которого задано вторым параметром (если он не загружен), либо находит уже загруженную копию, и формирует ссылку на objInterface того типа, к которому принадлежит переменная типа ссылки.
Если VIP-интерфейс, заданный вторым параметром, реализует объектный интерфейс, являющийся типом ссылки первого параметра, то в первый параметр помещается ссылка на объектный интерфейс указанного VIP-интерфейса.
Функция GetVipRef, совместно с функцией GetVipInterface, ведет список загруженных внешних VIP-интерфейсов, и счетчик ссылок на каждый загруженный интерфейс. Требуемый интерфейс (имя которого передано функции в качестве второго параметра) ищется среди загруженных интерфейсов (загрузка по GetVipInterface или GetVipRef). Если интерфейс найден, то ему передается событие cmOnVipUse, увеличивается счетчик ссылок, и возвращается ссылка на загруженную копию. Если интерфейс в списке не найден - он загружается, вставляется в список, ему передаются события cmOnVipLoad и cmOnVipUse, и возвращается ссылка на требуемый объектный интерфейс загруженной копии.
Проверяется - соответствует ли переменная типа ссылки запрошенной операции. Это означает, что для функции GetVipRef
Первым параметром обязательно должна быть переменная типа ссылки на objInterface. Если это условие нарушено, то будет возбуждено исключение ExObjIfcBadVar.
Описание
function GetVipRef (var ref : VarOfInterFaceType;
str : string
) : boolean;
Ged
В догонку, зачем тут objinterface, судя по хэлпу:
В догонку, зачем тут objinterface, судя по хэлпу:
VIP-интерфейс может не иметь прототипа. В этом случае те процедуры и функции, которые он предоставляет для вызова другим интерфейсам, помечаются квалификатором public
[/quote]Фактически, для VIP-интерфейса, не имеющего прототипа, неявно создается объектный интерфейс, содержащий все функции, объявленные как public.
Ged
а как вариант автоинициализацией? Т.е. чтобы переменная нужного типа создалась автоматом, нашел кучу файлов с расширением var -> судя по всему это и есть глобальная переменная
Как пример, файл GetKau.var
а как вариант автоинициализацией? Т.е. чтобы переменная нужного типа создалась автоматом, нашел кучу файлов с расширением var -> судя по всему это и есть глобальная переменная
Как пример, файл GetKau.var
Код: Выделить всё
//******************************************************************************
// (c) корпорация Галактика
// Галактика 7.12 - Финансы
// Объявление переменной типа интерфейс GetKau
//******************************************************************************
#ifdef __GetKAU_var__
#info Переменная iGetKau уже объявлена, возможно на глобальном уровне - необходимо убрать глобальное описание!
#else
#define __GetKAU_var__
#ifNdef _GetKau_vih_Included
#Warning Необходимо подключить GetKau.vih
#end
var iGetKau: GetKau;
#end
Re: Фейсы, фейсы, фейсы
не только. Именно в в VipInterface указываются параметры вызова интерфейса, и принадлежность к модулю/лям (лицензирование)..galover писал(а): И объясните мне наконец зачем ввели vipinterface, если я могу создать переменную уже по interface. Какая-то лишняя сущность этот vipinterface, неужели только для наследования и описания используется и почему нельзя было то же самое возложить на interface.
В Галактике не бывает косяков, бывает специфика работы.galover писал(а): Какой-то архитектурный косяк
(С) Шаман Галактика СПб
Unfortunally!!!
Не выходит у меня -> при попытке вызова GetVipRef или LoadVipRef выскакивает исключение
При этом строку с именем vip фейса указывал, как с компонентной принадлежностью, так и без (фейс у меня в другом компоненте, а вызывается из-под UserReport). Работают только функции, LoadVipInterface и GetVipInterface -> там где параметр один. В общем не понял я механизма загрузки vip фейсов до конца.
Далее, функция NullVipRef (кстати о ней в хэлпе неправильно написано
P.S. что-то с хэлпами беда какая-то -> описание vip-а в двух chm-ках и практически продублировано
после чего Галка отбрасывает копыта---------------------------
Предупреждение
---------------------------
Возникло необработанное исключение
ExObjIfcBadVar (ExRef)
поле не является ссылкой требуемого класса
"Да" - Продолжить, "Нет" - Отлаживать в окне отладчика
"Отмена" - Не выдавать больше это сообщение
---------------------------
Yes No Cancel
---------------------------
При этом строку с именем vip фейса указывал, как с компонентной принадлежностью, так и без (фейс у меня в другом компоненте, а вызывается из-под UserReport). Работают только функции, LoadVipInterface и GetVipInterface -> там где параметр один. В общем не понял я механизма загрузки vip фейсов до конца.
Далее, функция NullVipRef (кстати о ней в хэлпе неправильно написано
на самом деле все наоборот). Работает функция странно для переменной типа ссылки объявленной на уровне проекта указывает, что ссылка есть. Хотя переменная не инициализировалась явно! А для переменной типа ссылки объявленной в фейсе и проинициализированной явно (как с помощью new так и LoadVipInterface и GetVipInterface -> правда не получилось с LoadVipRef и GetVipRef см. выше), я так и не смог заставить функцию вернуть правильное значение, все время false -> мол нулевая ссылка, хотя методы вызываются и жалоб вроде нет. Короче неприятный осадок осталсяФункция возвращает true, если переменная типа ссылки инициализирована значением ссылки на интерфейс, иначе false.
P.S. что-то с хэлпами беда какая-то -> описание vip-а в двух chm-ках и практически продублировано
