| Предыдущая тема :: Следующая тема | 
	
	
		| Автор | Сообщение | 
	
		| 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.
 _________________
 С уважением, Михаил Власов.
 |  | 
	
		| Вернуться к началу |  | 
	
		|  | 
	
		|  |