Программирование на Атлантисе (VIP, FCOM, ARD), FastReport
Модераторы: m0p3e , edward_K , Модераторы
galover
Местный житель
Сообщения: 794 Зарегистрирован: 16 ноя 2007, 13:52
Сообщение
galover » 10 сен 2008, 14:22
Проблема в следующем - есть некий интерфейс, содержащийся в компоненте 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 » 10 сен 2008, 15:12
попробуйте использовать LoadVipInterface, у меня при переходе с 8 на 8.1 тоже такое произошло, меняла везде вызовы
Учиться, учиться и еще раз учиться
k_vit
Постоянный обитатель
Сообщения: 143 Зарегистрирован: 09 авг 2006, 16:40
Откуда: Россия, Тюмень, ОАО "Сибирский Научно-Аналитический Центр"
Сообщение
k_vit » 10 сен 2008, 16:12
Код: Выделить всё
#component "SomeComponent"
objInterface IFoo
public: procedure Bar;
end;
VipInterface _Имя_реализации_(сам интерфейс) Implements IFoo;
.var
var _foo : _Имя_реализации_(сам интерфейс);
.endvar
k_vit
Постоянный обитатель
Сообщения: 143 Зарегистрирован: 09 авг 2006, 16:40
Откуда: Россия, Тюмень, ОАО "Сибирский Научно-Аналитический Центр"
Сообщение
k_vit » 10 сен 2008, 16:13
И подгружать его не обязательно, если он лежит в том же ресурсе что и форма.
galover
Местный житель
Сообщения: 794 Зарегистрирован: 16 ноя 2007, 13:52
Сообщение
galover » 10 сен 2008, 16:25
k_vit
Ksenia
вопрос в том, как имея ссылку на objInterface получить ссылку на реализацию. Ощущение что LoadVipRef не работает для присоединенной формы, поскольку данный код корректно отрабатывает в других фейсах
k_vit
Постоянный обитатель
Сообщения: 143 Зарегистрирован: 09 авг 2006, 16:40
Откуда: Россия, Тюмень, ОАО "Сибирский Научно-Аналитический Центр"
Сообщение
k_vit » 10 сен 2008, 16:27
Зачастую Объектный интерфейс называется именем реализации, т.е в данном случае Foo. Поищите его...
galover
Местный житель
Сообщения: 794 Зарегистрирован: 16 ноя 2007, 13:52
Сообщение
galover » 10 сен 2008, 16:31
k_vit
И подгружать его не обязательно, если он лежит в том же ресурсе что и форма
не лежит
galover
Местный житель
Сообщения: 794 Зарегистрирован: 16 ноя 2007, 13:52
Сообщение
galover » 10 сен 2008, 16:36
Зачастую Объектный интерфейс называется именем реализации, т.е в данном случае Foo. Поищите его...
написать vipInterface Foo implements IFoo я могу. Задача другая!!!!!
Есть IFoo нужно сослаться на Foo/ Ни больше, ни меньше
Поэтому хочу разобраться -> почему не отрабатывает LoadVipRef в присоединенной форме- это баг или стандартное поведение
k_vit
Постоянный обитатель
Сообщения: 143 Зарегистрирован: 09 авг 2006, 16:40
Откуда: Россия, Тюмень, ОАО "Сибирский Научно-Аналитический Центр"
Сообщение
k_vit » 10 сен 2008, 16:38
galover
Местный житель
Сообщения: 794 Зарегистрирован: 16 ноя 2007, 13:52
Сообщение
galover » 10 сен 2008, 16:43
k_vit
.var
var _foo : foo;
.endvar
ежу понятно что так заработает.
Ладно, похоже баг - не работает LoadVipRef в присоединенке. Закроем тему
k_vit
Постоянный обитатель
Сообщения: 143 Зарегистрирован: 09 авг 2006, 16:40
Откуда: Россия, Тюмень, ОАО "Сибирский Научно-Аналитический Центр"
Сообщение
k_vit » 11 сен 2008, 16:31
Если вам так упорно хотите использовать 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 » 11 сен 2008, 16:39
ошибся т.е. LoadVipRef(objFoo, 'SomeComponent::Foo');
galover
Местный житель
Сообщения: 794 Зарегистрирован: 16 ноя 2007, 13:52
Сообщение
galover » 11 сен 2008, 20:52
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);