| Предыдущая тема :: Следующая тема   | 
	
	
	
		| Автор | 
		Сообщение | 
	
	
		razin73
 
 
  Зарегистрирован: 02.10.2006 Сообщения: 2 Откуда: Петрозаводск
  | 
		
			
				 Добавлено: Ср 04 Окт 2006 17:27    Заголовок сообщения: BCB 6.0 Example | 
				     | 
			 
			
				
  | 
			 
			
				 	  | Код: | 	 		  
 
STDMETHODIMP TbbbhcImpl::Done()
 
{
 
  Form1->FIngeo->Release();
 
  Form1->FIngeo = NULL;
 
}
 
STDMETHODIMP TbbbhcImpl::Init(IIngeoApplication* anIngeo)
 
{ 
 
  Form1->FIngeo = anIngeo;
 
  Form1->FIngeo->AddRef();
 
}
 
 | 	  
 
 	  | Код: | 	 		  
 
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button1Click(TObject *Sender)
 
{
 
  IIngeoDb             *FActiveDb;
 
  IIngeoSemDbDataSet   *FIngeoSemDbDataSet;
 
  IIngeoSemDbValue     *FDbValue;
 
  IIngeoSelection      *FIngeoSelection;
 
  WideString           aSQL;
 
  Variant              aParams, aParamTypes;
 
  IIngeoMapObject      *FObject;
 
  WideString           FObjId;
 
  FIngeoSelection = FIngeo->get_Selection();
 
  FIngeoSelection->AddRef();
 
  FIngeoSelection->DeselectAll();
 
  FActiveDb = FIngeo->get_ActiveDb();
 
  FActiveDb->AddRef();
 
  aSQL = "select * from tAdres where id_adres='" + Edit1->Text + "'";
 
  aParams = varEmpty;
 
  aParamTypes = varEmpty;
 
  FIngeoSemDbDataSet = FActiveDb->SemDbTables->ExecSQL(aSQL, aParams, aParamTypes);
 
  FIngeoSemDbDataSet->AddRef();
 
  FIngeoSemDbDataSet->MoveFirst();
 
  if(FIngeoSemDbDataSet->EOF_) return;
 
//  ShowMessage("ok");
 
  FDbValue = FIngeoSemDbDataSet->Fields->get_Item(Variant(0));
 
  FDbValue->AddRef();
 
//  ShowMessage(FDbValue->get_Name());
 
  FObjId = FDbValue->get_DisplayValue();
 
//  ShowMessage(FObjId);
 
  FIngeoSelection->SelectAlone(FObjId, -1);
 
  FObject = FIngeo->ActiveDb->MapObjects->GetObjectA(FObjId);
 
  FIngeo->MainWindow->MapWindow->Navigator->FitWorldBounds(
 
                                                           FObject->X1,
 
                                                           FObject->Y1,
 
                                                           FObject->X2,
 
                                                           FObject->Y2,
 
                                                           infitAlwaysScale
 
                                                           );
 
}
 
//---------------------------------------------------------------------------
 
 | 	  
 
Плод многодневных изысканий совместно с Рустамом Тукаевым....
 
Обязательно поставить update на BCB6.0 | 
			 
		  | 
	
	
		| Вернуться к началу | 
		 | 
	
	
		  | 
	
	
		andreichernov
 
 
  Зарегистрирован: 14.02.2005 Сообщения: 209 Откуда: Самара
  | 
		
			
				 Добавлено: Чт 05 Окт 2006 09:50    Заголовок сообщения:  | 
				     | 
			 
			
				
  | 
			 
			
				А точно надо все время AddRef делать?
 
Мы как-то по-простому...:
 
----------
 
{
 
 IUnknown  *UnknownInterface;
 
 IIngeoApplication *IngeoApp;
 
//------------подсоединение
 
 int res;
 
 res = GetActiveObject(CLSID_IngeoApplication,NULL,&UnknownInterface);
 
 UnknownInterface->QueryInterface(IID_IIngeoApplication,(void**)&IngeoApp);
 
//-----------использование
 
  IIngeoMapObject *aObject;
 
  IIngeoMapObjects *aMO;
 
  IIngeoContourPart *aConPart;
 
  IIngeoContour     *aContour;
 
  IIngeoLayer   *aLayer;
 
  aLayer = IngeoApp->ActiveProjectView->ActiveLayerView->Layer;
 
  aMO = IngeoApp->ActiveDb->MapObjects; //начало транзакции
 
  //добавление объекта
 
  aObject = aMO->AddObject( aLayer->ID );
 
  //вставка контура первым стилем  из списка стилей слоя
 
  aContour = aObject->Shapes->Insert( 0, aLayer->Styles->get_Item(0)->ID )->Contour;
 
  //вставка части контура
 
  aConPart = aContour->Insert(0);
 
  aConPart->InsertVertex( 0,0,0,0 );
 
  aConPart->InsertVertex( 1,10,0,0 );
 
  aConPart->InsertVertex( 2,10,10,0 );
 
  aConPart->InsertVertex( 3,0,10,0 );
 
  aConPart->Closed = 1;
 
  //применение транзакции
 
  aMO->UpdateChanges();
 
  aConPart = NULL;
 
  aContour = NULL;
 
  aObject = NULL:
 
  aMO = NULL;
 
  aLayer = NULL;
 
//------отключение
 
 IngeoApp  = NULL;
 
} | 
			 
		  | 
	
	
		| Вернуться к началу | 
		 | 
	
	
		  | 
	
	
		razin73
 
 
  Зарегистрирован: 02.10.2006 Сообщения: 2 Откуда: Петрозаводск
  | 
		
			
				 Добавлено: Чт 05 Окт 2006 10:45    Заголовок сообщения: 2 andreichernov | 
				     | 
			 
			
				
  | 
			 
			
				Уважаемый andreichernov!
 
В функции STDMETHODIMP TbbbhcImpl::Init(IIngeoApplication* anIngeo) обязательно делать Form1->FIngeo->AddRef(); иначе в форме указатель FIngeo оказывается недействительным. Обязательно  ли делать AddRef() для остальных объектов я не тестировал. Вроде как в пределах одной функции эти указатели и так никуда не денутся... У Вас тоже все вроде как в пределах одной функции, так что AddRef() похоже можно не делать, но вроде как корректнее все таки с AddRef()...
 
Методом проб и ошибок выяснил, что вместо BSTR обязательно использовать WideString!!!
 
А также функция ExecSQL(aSQL, aParams, aParamTypes) у меня пошла только в этом варианте (всего вариантов этой функции два).
 
Давно ли Вы пишете модули ИнГео на C++? Не пора ли как-то кому-то взяться и сделать комплект примеров на C++Builder? Потому что Тукаев мне сказал, что у него нет информации по тому кто и как программирует модули на C++... | 
			 
		  | 
	
	
		| Вернуться к началу | 
		 | 
	
	
		  | 
	
	
		andreichernov
 
 
  Зарегистрирован: 14.02.2005 Сообщения: 209 Откуда: Самара
  | 
		
			
				 Добавлено: Чт 05 Окт 2006 15:36    Заголовок сообщения:  | 
				     | 
			 
			
				
  | 
			 
			
				мы пишем, в основном на Delphi 
 
один был модуль на C-билдере по размещению надписей без наложения. | 
			 
		  | 
	
	
		| Вернуться к началу | 
		 | 
	
	
		  | 
	
	
		Алексей В. Бастриков
 
 
  Зарегистрирован: 02.06.2008 Сообщения: 118 Откуда: ООО "Инфопроект", г. Екатеринбург
  | 
		
			
				 Добавлено: Вт 17 Июн 2008 12:16    Заголовок сообщения:  | 
				     | 
			 
			
				
  | 
			 
			
				AddRef использовать совсем не обязательно.Нужно просто правильно форму включать в BCB-проект и все ок будет.
 
Насчет BSTR, их использовать для параметров на вход в функцию нормально можно там есть WideToOLESTR(BSTR) возвращает то что надо. Я вообще WideString не пользуюсь...))
 
В C++ куча возможностей, нужно просто их внимательно изучать и все время пробовать разные варианты, тогда и модули для ИнГео будут "в лёт" писаться | 
			 
		  | 
	
	
		| Вернуться к началу | 
		 | 
	
	
		  | 
	
	
		Михаил Власов
 
  
  Зарегистрирован: 14.02.2005 Сообщения: 580 Откуда: ИНТЕГРО
  | 
		
			
				 Добавлено: Чт 19 Июн 2008 11:02    Заголовок сообщения:  | 
				     | 
			 
			
				
  | 
			 
			
				Перед началом использования COM-интерфейса всегда необходимо вызывать AddRef.
 
 
После завершения работы с интерфейсом он должен быть освобожден методом Release.
 
 
То есть - на протяжении всего времени использования COM-объекта, он должен быть зареференсен. Даже если все использование заключается в вызове пары методов.
 
 
Чтобы облегчить себе работу, для хранения ссылок на COM-интерфейсы можно использовать стандартную обертку TComInterface<T> .
 
 
Она сама делает все AddRef и Release. _________________ С уважением, Михаил Власов. | 
			 
		  | 
	
	
		| Вернуться к началу | 
		 | 
	
	
		  | 
	
	
		 |