Фейсы, фейсы, фейсы

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

Ответить
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

Фейсы, фейсы, фейсы

Сообщение galover »

И снова фейсы, курил хэлп, но там примеров - кот наплакал. Задача такая - создать 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. Какой-то архитектурный косяк, впрочем это наверное риторический вопрос.
Ged
Местный житель
Сообщения: 645
Зарегистрирован: 29 мар 2005, 17:49
Контактная информация:

Сообщение Ged »

Foo.vih

Код: Выделить всё

#ifndef _Foo_vih_INCLUDED_
#define _Foo_vih_INCLUDED_
#component "F_UserReport"

objinterface objFoo;
   public procedure MyProc;
end;

Vipinterface iFoo implements objFoo licensed(Free);
#end 

Foo.vip

Код: Выделить всё

#include Foo.vih
interface iFoo;
... 
public procedure MyProc;
{
  Message('MyProc');
}
...
end. //Inteface
vip.prj

Код: Выделить всё

#include Foo.vih
#make "Foo.vip" 
#make "Other.vip"
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
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

Сообщение galover »

Ged
Респектище, ушел пробовать, только мне ведь нужно сделать varFoo глобальным, чтобы не только Other его юзал. Как объявить такую переменную, подозреваю, что инициализацию все равно придется делать в главном фейсе
Ged
Местный житель
Сообщения: 645
Зарегистрирован: 29 мар 2005, 17:49
Контактная информация:

Сообщение Ged »

Вместо 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;
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

Сообщение galover »

Ged
В догонку, зачем тут objinterface, судя по хэлпу:
VIP-интерфейс может не иметь прототипа. В этом случае те процедуры и функции, которые он предоставляет для вызова другим интерфейсам, помечаются квалификатором public
Фактически, для VIP-интерфейса, не имеющего прототипа, неявно создается объектный интерфейс, содержащий все функции, объявленные как public.
[/quote]
Ged
Местный житель
Сообщения: 645
Зарегистрирован: 29 мар 2005, 17:49
Контактная информация:

Сообщение Ged »

можно и так. но судя по исходникам мало кто это юзает.
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

Сообщение galover »

Ged
а как вариант автоинициализацией? Т.е. чтобы переменная нужного типа создалась автоматом, нашел кучу файлов с расширением 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
Ged
Местный житель
Сообщения: 645
Зарегистрирован: 29 мар 2005, 17:49
Контактная информация:

Сообщение Ged »

неа. Этот инклуд вставляется непосредственно в
Interface
<<----
end.

Хотя все можно попробовать.

для инициализации см cmOnVipLoad.
Ged
Местный житель
Сообщения: 645
Зарегистрирован: 29 мар 2005, 17:49
Контактная информация:

Re: Фейсы, фейсы, фейсы

Сообщение Ged »

galover писал(а): И объясните мне наконец зачем ввели vipinterface, если я могу создать переменную уже по interface. Какая-то лишняя сущность этот vipinterface, неужели только для наследования и описания используется и почему нельзя было то же самое возложить на interface.
не только. Именно в в VipInterface указываются параметры вызова интерфейса, и принадлежность к модулю/лям (лицензирование)..
galover писал(а): Какой-то архитектурный косяк
В Галактике не бывает косяков, бывает специфика работы.
(С) Шаман Галактика СПб
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

Сообщение galover »

Ged
жесть! Т.е. инициализация такой переменной все равно нужна?
В чем тогда преимущества таких вот var файлов - проследить, чтобы в интерфейсе была только одна переменная данного типа?
Ged
Местный житель
Сообщения: 645
Зарегистрирован: 29 мар 2005, 17:49
Контактная информация:

Сообщение Ged »

Я ж написал - надо попробовать. Передо мной просто не стояла такая задача. Вот и все.
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

Сообщение galover »

Ged
ясно, и на том спасибо! :cool:
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

Unfortunally!!!

Сообщение galover »

Не выходит у меня -> при попытке вызова GetVipRef или LoadVipRef выскакивает исключение
---------------------------
Предупреждение
---------------------------
Возникло необработанное исключение
ExObjIfcBadVar (ExRef)
поле не является ссылкой требуемого класса

"Да" - Продолжить, "Нет" - Отлаживать в окне отладчика
"Отмена" - Не выдавать больше это сообщение
---------------------------
Yes No Cancel
---------------------------
после чего Галка отбрасывает копыта

При этом строку с именем vip фейса указывал, как с компонентной принадлежностью, так и без (фейс у меня в другом компоненте, а вызывается из-под UserReport). Работают только функции, LoadVipInterface и GetVipInterface -> там где параметр один. В общем не понял я механизма загрузки vip фейсов до конца.

Далее, функция NullVipRef (кстати о ней в хэлпе неправильно написано
Функция возвращает true, если переменная типа ссылки инициализирована значением ссылки на интерфейс, иначе false.
на самом деле все наоборот). Работает функция странно для переменной типа ссылки объявленной на уровне проекта указывает, что ссылка есть. Хотя переменная не инициализировалась явно! А для переменной типа ссылки объявленной в фейсе и проинициализированной явно (как с помощью new так и LoadVipInterface и GetVipInterface -> правда не получилось с LoadVipRef и GetVipRef см. выше), я так и не смог заставить функцию вернуть правильное значение, все время false -> мол нулевая ссылка, хотя методы вызываются и жалоб вроде нет. Короче неприятный осадок остался

P.S. что-то с хэлпами беда какая-то -> описание vip-а в двух chm-ках и практически продублировано :(
Ответить