Платежный календарь OFP.240- поиск наименее кровавого метода

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

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

Ответить
Max_Fin
На пенсии
Сообщения: 797
Зарегистрирован: 29 мар 2005, 17:49
Откуда: г. Тюмень
Контактная информация:

Платежный календарь OFP.240- поиск наименее кровавого метода

Сообщение 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) в которых используется реализация ОИ

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

var piDocReq: iDocReq;
конечно же появляется ошибка,

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

piDocReq.DocReq_Fill(bufDocReq, 801);
что не видит реализацию методов. Менять свою компонентную принадлежность на F_OFP не хочется.

Может кто уже на такие грабли наступал и нашел красивое решение?
Жду выхода Вселенная 2.12!
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

Сообщение 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);
Max_Fin
На пенсии
Сообщения: 797
Зарегистрирован: 29 мар 2005, 17:49
Откуда: г. Тюмень
Контактная информация:

Сообщение Max_Fin »

Так я и сделал, только вот экстенсивно это получается.
Хочется без объявления реализации iDocReqWrapper обойтись.

Пробывал через

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

#ifdef ComponentVersion 
#component "F_OFP" 
#end 
ObjInterface MF_objDocReq(objDocReq); 
End;
но вот как использовать реализацию ОИ MF_objDocReq через iDocReq :-?
Жду выхода Вселенная 2.12!
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

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

Сообщение galover »

Невероятно, но факт! Только что проверил, оказывается достаточно закомментить ключевое слово private в vih и все будет работать! Создал тестовый ресурсник, где objinterface объявлен как private, подключил его. Потом скомпилили другой ресурсник, где используется ссылка на первый objinterface, но без слова private. Запустил и сработало! Видимо при расчете двоичной суммы модификаторы видимости вообще в расчет не принимаются (private лишь с 5.1.23), дырка однозначно!
Max_Fin
На пенсии
Сообщения: 797
Зарегистрирован: 29 мар 2005, 17:49
Откуда: г. Тюмень
Контактная информация:

Сообщение 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", собралоь на ура. Галактика на использование отличного ОИ ни чего не сообщила :grin:
Жду выхода Вселенная 2.12!
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

Сообщение galover »

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