Программирование на Атлантисе (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);