Страница 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
Добавлено: 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);