Страница 1 из 1

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

Добавлено: 10 сен 2008, 14:22
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
В обычном фейсе этот код отрабатывает как надо, а вприсоединенке такая вот фигня. Что еще забыл подкрутить? Спасибо!

Добавлено: 10 сен 2008, 15:12
Ksenia
попробуйте использовать LoadVipInterface, у меня при переходе с 8 на 8.1 тоже такое произошло, меняла везде вызовы

Добавлено: 10 сен 2008, 16:12
k_vit

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

#component "SomeComponent" 

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


.var 
  var _foo : _Имя_реализации_(сам интерфейс); 
.endvar

Добавлено: 10 сен 2008, 16:13
k_vit
И подгружать его не обязательно, если он лежит в том же ресурсе что и форма.

Добавлено: 10 сен 2008, 16:25
galover
k_vit
Ksenia
вопрос в том, как имея ссылку на objInterface получить ссылку на реализацию. Ощущение что LoadVipRef не работает для присоединенной формы, поскольку данный код корректно отрабатывает в других фейсах

Добавлено: 10 сен 2008, 16:27
k_vit
Зачастую Объектный интерфейс называется именем реализации, т.е в данном случае Foo. Поищите его...

Добавлено: 10 сен 2008, 16:31
galover
k_vit
И подгружать его не обязательно, если он лежит в том же ресурсе что и форма
не лежит

Добавлено: 10 сен 2008, 16:36
galover
Зачастую Объектный интерфейс называется именем реализации, т.е в данном случае Foo. Поищите его...
написать vipInterface Foo implements IFoo я могу. Задача другая!!!!!
Есть IFoo нужно сослаться на Foo/ Ни больше, ни меньше
Поэтому хочу разобраться -> почему не отрабатывает LoadVipRef в присоединенной форме- это баг или стандартное поведение

Добавлено: 10 сен 2008, 16:38
k_vit

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

.var 
  var _foo : foo;
.endvar
пробовали?

Добавлено: 10 сен 2008, 16:43
galover
k_vit
.var
var _foo : foo;
.endvar

ежу понятно что так заработает.
Ладно, похоже баг - не работает LoadVipRef в присоединенке. Закроем тему

Добавлено: 11 сен 2008, 16:31
k_vit
Если вам так упорно хотите использовать LoadVipInterface.

то при этом :

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

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

.var
   objFoo : Foo;
.endvar

.begin
   LoadVipRef(objFoo);
end.

должно всё работать.....

Добавлено: 11 сен 2008, 16:39
k_vit
ошибся т.е. LoadVipRef(objFoo, 'SomeComponent::Foo');

Добавлено: 11 сен 2008, 20: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);