Не работает LoadVipRef в присоединенной форме

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

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

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

Не работает LoadVipRef в присоединенной форме

Сообщение galover »

Проблема в следующем - есть некий интерфейс, содержащийся в компоненте SomeComponent. Есть и IFoo.vih файл:

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

#component "SomeComponent"

objInterface IFoo
  public: procedure Bar;
end;
В присоединенной форме пытаюсь заюзать этот фейс:

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

.var
  var _foo : IFoo;
.endvar
...
.begin
      LoadVipRef(_foo, 'SomeComponent::Foo'); // Тут уже пытаюсь подгрузить сам vip интерфейс
      _foo.Bar();    
end.
В файле проекта есть #include IFoo.vih (вставлял и в присоединенную форму также). Но при компиляции получаю ошибку
Test.RTF(10)Runtime error 216 (rtl: попытка обращения к некорректному деск
риптору)
in vip.exe at 0013BB45
В обычном фейсе этот код отрабатывает как надо, а вприсоединенке такая вот фигня. Что еще забыл подкрутить? Спасибо!
Ksenia
Посетитель
Сообщения: 39
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Украина, Киев
Контактная информация:

Сообщение Ksenia »

попробуйте использовать LoadVipInterface, у меня при переходе с 8 на 8.1 тоже такое произошло, меняла везде вызовы
Учиться, учиться и еще раз учиться
k_vit
Постоянный обитатель
Сообщения: 143
Зарегистрирован: 09 авг 2006, 16:40
Откуда: Россия, Тюмень, ОАО "Сибирский Научно-Аналитический Центр"

Сообщение k_vit »

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

#component "SomeComponent" 

objInterface IFoo 
  public: procedure Bar; 
end;
VipInterface _Имя_реализации_(сам интерфейс) Implements IFoo;


.var 
  var _foo : _Имя_реализации_(сам интерфейс); 
.endvar
k_vit
Постоянный обитатель
Сообщения: 143
Зарегистрирован: 09 авг 2006, 16:40
Откуда: Россия, Тюмень, ОАО "Сибирский Научно-Аналитический Центр"

Сообщение k_vit »

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

Сообщение galover »

k_vit
Ksenia
вопрос в том, как имея ссылку на objInterface получить ссылку на реализацию. Ощущение что LoadVipRef не работает для присоединенной формы, поскольку данный код корректно отрабатывает в других фейсах
k_vit
Постоянный обитатель
Сообщения: 143
Зарегистрирован: 09 авг 2006, 16:40
Откуда: Россия, Тюмень, ОАО "Сибирский Научно-Аналитический Центр"

Сообщение k_vit »

Зачастую Объектный интерфейс называется именем реализации, т.е в данном случае Foo. Поищите его...
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

Сообщение galover »

k_vit
И подгружать его не обязательно, если он лежит в том же ресурсе что и форма
не лежит
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

Сообщение galover »

Зачастую Объектный интерфейс называется именем реализации, т.е в данном случае Foo. Поищите его...
написать vipInterface Foo implements IFoo я могу. Задача другая!!!!!
Есть IFoo нужно сослаться на Foo/ Ни больше, ни меньше
Поэтому хочу разобраться -> почему не отрабатывает LoadVipRef в присоединенной форме- это баг или стандартное поведение
k_vit
Постоянный обитатель
Сообщения: 143
Зарегистрирован: 09 авг 2006, 16:40
Откуда: Россия, Тюмень, ОАО "Сибирский Научно-Аналитический Центр"

Сообщение k_vit »

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

.var 
  var _foo : foo;
.endvar
пробовали?
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

Сообщение galover »

k_vit
.var
var _foo : foo;
.endvar

ежу понятно что так заработает.
Ладно, похоже баг - не работает LoadVipRef в присоединенке. Закроем тему
k_vit
Постоянный обитатель
Сообщения: 143
Зарегистрирован: 09 авг 2006, 16:40
Откуда: Россия, Тюмень, ОАО "Сибирский Научно-Аналитический Центр"

Сообщение k_vit »

Если вам так упорно хотите использовать LoadVipInterface.

то при этом :

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

objInterface IFoo 
  public: procedure Bar; 
end; 
VipInterface Foo Implements IFoo;

.var
   objFoo : Foo;
.endvar

.begin
   LoadVipRef(objFoo);
end.

должно всё работать.....
k_vit
Постоянный обитатель
Сообщения: 143
Зарегистрирован: 09 авг 2006, 16:40
Откуда: Россия, Тюмень, ОАО "Сибирский Научно-Аналитический Центр"

Сообщение k_vit »

ошибся т.е. LoadVipRef(objFoo, 'SomeComponent::Foo');
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

Сообщение galover »

k_vit
Ну и какой хинт?
Объявление
.var
objFoo : Foo
.endvar

и так инстанциирует Foo (это происходит автоматически, если только не писать noauto) -> LoadVipRef вообще тогда не нужен!

Моя идея в динамическом связывании. Т.е. реальный тип объекта задается в виде строки! На этапе компиляции вообще может не быть информации о реальном типе. Т.е. может быть ситуация, когда один obj фейс реализуется несколькими vip фейсами. Тогда можно делать так (пример гипотетический, но идея думаю ясна):

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

var typeName : string;
var _foo         : IFoo;

if (someCondition)
  typeName := 'Comp1::Type1';
else typeName := 'Comp2::Type2';

_foo := LoadVipRef(_foo, typeName);
Ответить