Список форумов www.integro.ru www.integro.ru
ЦСИ ИНТЕГРО
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

BCB 6.0 Example

 
Начать новую тему   Ответить на тему    Список форумов www.integro.ru -> Вопросы разработчиков
Предыдущая тема :: Следующая тема  
Автор Сообщение
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.

_________________
С уважением, Михаил Власов.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов www.integro.ru -> Вопросы разработчиков Часовой пояс: GMT + 5
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете добавлять приложения в этом форуме
Вы можете скачивать файлы в этом форуме


© phpBB Group
Русская поддержка phpBB