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