Страница 1 из 1
Платежный календарь OFP.240- поиск наименее кровавого метода
Добавлено: 27 апр 2010, 20:49
Max_Fin
В патчах 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 не хочется.
Может кто уже на такие грабли наступал и нашел красивое решение?
Добавлено: 27 апр 2010, 22:06
galover
в лоб, просто обернуть нужные функции в свой фейс
Код: Выделить всё
// 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);
Добавлено: 27 апр 2010, 22:25
Max_Fin
Так я и сделал, только вот экстенсивно это получается.
Хочется без объявления реализации iDocReqWrapper обойтись.
Пробывал через
Код: Выделить всё
#ifdef ComponentVersion
#component "F_OFP"
#end
ObjInterface MF_objDocReq(objDocReq);
End;
но вот как использовать реализацию ОИ MF_objDocReq через iDocReq

Добавлено: 28 апр 2010, 11:21
galover
ну тогда попробуй такой костыль, на 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);
Добавлено: 28 апр 2010, 13:40
galover
Невероятно, но факт! Только что проверил, оказывается достаточно закомментить ключевое слово private в vih и все будет работать! Создал тестовый ресурсник, где objinterface объявлен как private, подключил его. Потом скомпилили другой ресурсник, где используется ссылка на первый objinterface, но без слова private. Запустил и сработало! Видимо при расчете двоичной суммы модификаторы видимости вообще в расчет не принимаются (private лишь с 5.1.23), дырка однозначно!
Добавлено: 28 апр 2010, 20:39
Max_Fin
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", собралоь на ура. Галактика на использование отличного ОИ ни чего не сообщила

Добавлено: 29 апр 2010, 11:05
galover
Ошибка: Не совпадает структура родительского интерфейса iDocReq с описанием (стр.9, поз.22 в tmb_aDocReq.vip)
Странно, ради интереса сделал тестовый проект с данными как в посте. Компилится нормально. Подозрение, что компонентная принадлежность не участвует в сборке, может забыл #define ComponentVersion?