Программирование на Атлантисе (VIP, FCOM, ARD), FastReport
Модераторы: m0p3e , edward_K , Модераторы
Max_Fin
На пенсии
Сообщения: 797 Зарегистрирован: 29 мар 2005, 17:49
Откуда: г. Тюмень
Контактная информация:
Сообщение
Max_Fin » 27 апр 2010, 20:49
В патчах F_OFP версии 240 у ОИ появилось "private", например в aDocReq.vih
Код: Выделить всё
#ifdef ComponentVersion
#component "F_OFP"
#end
Private ObjInterface objDocReq;
[--cut--]
End;
VipInterface iDocReq implements objDocReq
;
При компиляции интерфейсов с другими компонентными принадлежностями (не F_OFP) в которых используется реализация ОИ
конечно же появляется ошибка,
что не видит реализацию методов. Менять свою компонентную принадлежность на F_OFP не хочется.
Может кто уже на такие грабли наступал и нашел красивое решение?
Жду выхода Вселенная 2.12!
galover
Местный житель
Сообщения: 794 Зарегистрирован: 16 ноя 2007, 13:52
Сообщение
galover » 27 апр 2010, 22:06
в лоб, просто обернуть нужные функции в свой фейс
Код: Выделить всё
// Wrapper.vih
#ifndef __wrapper__
#define __wrapper__
#component "F_OFP"
public objinterface objDocReqWrapper;
public:
procedure DocReq_Fill(var bufDocReq: TDocReq; _DocType: word);
end;
public vipinterface iDocReqWrapper implements objDocReqWrapper;
#end
// Wrapper.vip
#component "F_OFP"
interface iDocReqWrapper;
var _docReq : iDocReq new;
public procedure objDocReqWrapper.DocReq_Fill(var bufDocReq: TDocReq; _DocType: word);
{
// Просто перенаправляем вызов
_docReq.DocReq_Fill(bufDocReq, _DocType);
}
end;
// В своем коде
#include Wrapper.vih
#component "MyComponent"
var piDocReq: F_OFP::iDocReqWrapper new;
piDocReq.DocReq_Fill(bufDocReq, 801);
Max_Fin
На пенсии
Сообщения: 797 Зарегистрирован: 29 мар 2005, 17:49
Откуда: г. Тюмень
Контактная информация:
Сообщение
Max_Fin » 27 апр 2010, 22:25
Так я и сделал, только вот экстенсивно это получается.
Хочется без объявления реализации iDocReqWrapper обойтись.
Пробывал через
Код: Выделить всё
#ifdef ComponentVersion
#component "F_OFP"
#end
ObjInterface MF_objDocReq(objDocReq);
End;
но вот как использовать реализацию ОИ MF_objDocReq через iDocReq
Жду выхода Вселенная 2.12!
galover
Местный житель
Сообщения: 794 Зарегистрирован: 16 ноя 2007, 13:52
Сообщение
galover » 28 апр 2010, 11:21
ну тогда попробуй такой костыль, на 5.4.29 это работает, но сдается мне, что это просто дыра, по крайней мере в других языках (C++(clr), C#) область видимости базового класса не может быть меньше наследника
Код: Выделить всё
// Wrapper.vih
#ifndef __Wrapper___
#define __Wrapper___
#component "F_OFP"
objinterface objDocReqWrapper(objDocReq);
end;
vipinterface iDocReqWrapper(iDocReq) implements objDocReqWrapper;
#end
// Wrapper.vip
#component "F_OFP"
interface iDocReqWrapper;
end.
// Свой код
#include Wrapper.vih
#component "MyComponent"
var piDocReq: F_OFP::iDocReqWrapper new;
piDocReq.DocReq_Fill(bufDocReq, 801);
galover
Местный житель
Сообщения: 794 Зарегистрирован: 16 ноя 2007, 13:52
Сообщение
galover » 28 апр 2010, 13:40
Невероятно, но факт! Только что проверил, оказывается достаточно закомментить ключевое слово private в vih и все будет работать! Создал тестовый ресурсник, где objinterface объявлен как private, подключил его. Потом скомпилили другой ресурсник, где используется ссылка на первый objinterface, но без слова private. Запустил и сработало! Видимо при расчете двоичной суммы модификаторы видимости вообще в расчет не принимаются (private лишь с 5.1.23), дырка однозначно!
Max_Fin
На пенсии
Сообщения: 797 Зарегистрирован: 29 мар 2005, 17:49
Откуда: г. Тюмень
Контактная информация:
Сообщение
Max_Fin » 28 апр 2010, 20:39
tmb_aDocReq.vih:
Код: Выделить всё
#ifndef __TMB_ADocReq_VIH__
#define __TMB_ADocReq_VIH__
#ifdef ComponentVersion
#component "F_OFP"
#end
#include ofptypes.vpp
#include aDocReq.vih
ObjInterface tmb_objDocReq(objDocReq);
End;
VipInterface tmb_iDocReq(iDocReq) implements tmb_objDocReq
;
#end //__TMB_ADocReq_VIH__
tmb_aDocReq.vip:
Код: Выделить всё
#ifdef ComponentVersion
#component "F_OFP"
#end
#include tmb_aDocReq.vih
interface tmb_iDocReq;
end.
Код: Выделить всё
Ошибка: Не совпадает структура родительского интерфейса iDocReq с описанием (стр.9, поз.22 в tmb_aDocReq.vip)
[/color]
Пока оставил как и было у меня
tmb_aDocReq.vih:
Код: Выделить всё
#ifndef __TMB_ADocReq_VIH__
#define __TMB_ADocReq_VIH__
#ifdef ComponentVersion
#component "F_OFP"
#end
#include ofptypes.vpp
ObjInterface tmb_objDocReq;
Function DocReq_AfterInsert(bufDocReq: TDocReq): boolean;
Procedure DocReq_Fill(var bufDocReq: TDocReq; _DocType: word);
End;
VipInterface tmb_iDocReq implements tmb_objDocReq
;
#end //__TMB_ADocReq_VIH__
tmb_aDocReq.vip:
Код: Выделить всё
#ifdef ComponentVersion
#component "F_OFP"
#end
#include ofptypes.vpp
#include aDocReq.vih
#include tmb_aDocReq.vih
interface tmb_iDocReq;
create view
var
piDocReq: iDocReq;
;
public Function DocReq_AfterInsert(bufDocReq: TDocReq): boolean;
{
DocReq_AfterInsert := piDocReq.DocReq_AfterInsert(bufDocReq);
}
public Procedure DocReq_Fill(var bufDocReq: TDocReq; _DocType: word);
{
piDocReq.DocReq_Fill(bufDocReq, _DocType);
}
HandleEvent
cmOnVipLoad:
{
}
cmOnVipUnload:
{
}
end;
end.
Про "private", да подтверждаю, когда только начал разбираться с вопросом, почему у меня перестал интерфейс собираться, проверил сборку при удаленном "private", собралоь на ура. Галактика на использование отличного ОИ ни чего не сообщила
Жду выхода Вселенная 2.12!
galover
Местный житель
Сообщения: 794 Зарегистрирован: 16 ноя 2007, 13:52
Сообщение
galover » 29 апр 2010, 11:05
Ошибка: Не совпадает структура родительского интерфейса iDocReq с описанием (стр.9, поз.22 в tmb_aDocReq.vip)
Странно, ради интереса сделал тестовый проект с данными как в посте. Компилится нормально. Подозрение, что компонентная принадлежность не участвует в сборке, может забыл #define ComponentVersion?