Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.142.197.212] |
|
Страницы: (10) 1 [2] 3 4 ... 9 10 все ( Перейти к последнему сообщению ) |
Сообщ.
#16
,
|
|
|
Цитата Coala @ Лена, попробуй так FoundFeature = Form1->Map1->Layers->_Item(unusedParam)->get_Find()->Search(WideString(Table2->FieldByName("ID")->AsString), WideString("")); Вот тут и начинаются проблемы с тем, что нет толковой документации именно для Builder. Дело в том, что например, метод Search в Builder требует первым параметром тип wchar_t * address, а вторым tagVariant, что отличается от классического примера. Вывод только один - пока MapInfo не выпустить нормальный help к MapX он не победим в среде C++ Builder 6. Правда мне удалось многое сделать: динамичиская загрузка слоев, масштабирование, замер расстояний, печать выделенной области, а вот важную операцию -поиск объекта не удалось. Я даже задала вопрос на форуме MapInfo, а в ответ на свой код получила: What value are you passing in Find.Search? I don't see the value that you're trying to find in your code? Cindy MapInfo Technical Support Я им пишу "так покажите фрагмент кода как правильно!", а они молчат как партизаны! |
Сообщ.
#17
,
|
|
|
Лена, отправь им то, что я тебе предложил...
Вполне возможно, что tagVariant - это 0 [по умолчанию]? оставить только утопить и начать с этой самой Cindy c ее I don't see the value that you're trying to find in your code? К сожалению, в таких случаях приходится пробовать методом тыка P.S. Есть дилер MapInfo (в том числе) фирма Резидент, если память не изменяет - www.resident.ru (можно поискать в яндексе). Эти ребята пишут и сами - может быть, они смогут помочь... |
Сообщ.
#18
,
|
|
|
ну вообщето это я делал, только наоборот, поиск к точке ближайших объектов, и все работало, только осталось найти старые исходники...
|
Сообщ.
#19
,
|
|
|
Цитата MAX2002 @ ну вообщето это я делал, только наоборот, поиск к точке ближайших объектов, и все работало, только осталось найти старые исходники... MAX2002, буду очень признательна, если найдутся ЛЮБЫЕ фрагменты вашего кода, и вы их мне вышлите! Даже если вы их найдете через месяц, все равно они будут актуальны. Мне надо обязательно доделать свой проект! Я от этого MapX, скоро стану похожа на этот смайлик: |
Сообщ.
#20
,
|
|
|
Лена, Вы бы выложили здесь TLB от MapX ActiveX или сгенерированный на его основе Builder'ом заголовочный файл. Возможно, что уже давно бы получили ответ.
|
Сообщ.
#21
,
|
|
|
Цитата Лена @ сгенерированный на его основе Builder'ом заголовочный файл Как всегда - в лузу!!! Мог бы и сам давно сообразить... ---- Намудрил с цитатами, trainer, sorry |
Сообщ.
#22
,
|
|
|
Цитата trainer @ Лена, Вы бы выложили здесь TLB от MapX ActiveX или сгенерированный на его основе Builder'ом заголовочный файл. Возможно, что уже давно бы получили ответ. Вот h, cpp, tlb: Прикреплённый файлMapX.zip (94.65 Кбайт, скачиваний: 119) |
Сообщ.
#23
,
|
|
|
Ага, есть - в MapXLib_TLB.h
Mapxlib_tlb::CMapXFeatures* __fastcall Search(BSTR strWhere, VARIANT Variables/*[opt]*/= TNoParam()); Народ, кто пограмотней в ActiveX - подскажите! |
Сообщ.
#24
,
|
|
|
Вот еще папка с файлами примеров для Делфи, которая идет в стандартной поставке MapX. Сейчас пытаюсь адаптировать фрагменты кода для Builder, но пока особого успеха нет из-за разных параметров в функциях.
Прикреплённый файлSamples.zip (98.72 Кбайт, скачиваний: 124) |
Сообщ.
#25
,
|
|
|
А какое значение возвращает FindRC?
|
Сообщ.
#26
,
|
|
|
После выполнения строки:
FoundFeature = Form1->Map1->Layers->_Item(unusedParam)->get_Find()->Search(WideString(Table2->FieldByName("ID")->AsString)); FoundFeature становиться равным :04670C0 А строка FoundFeature->get_FindRC() равной :0040D270 Что конкретно делает метод get_FindRC() я не знаю, но во всех примерах он фигурирует, как метод проверки, что объект найден. Ниже переделанный мной из Делфийского примера, который я выложила выше. MapX не ругается везде предлагает после -> свои функции. Однако во время выполнения проблема. Я не понимаю, например, что такое VT_DISPATCH и зачем оно? Обидно, что мое приложение практически готово и многое умеет делать. Вот только с поиском проблема. OleVariant unusedParam, unusedParam1; AnsiString id = ""; unusedParam.operator =(48);//номер слоя, а в Делфи по имени unusedParam1.operator =(id); CMapXLayer * lyr; CMapXDataset *ds; CMapXFindFeature *FoundObj; Variant nothing; nothing.VType = VT_DISPATCH; lyr = Form1->Map1->Layers->_Item(unusedParam); ds = Form1->Map1->DataSets->_Item(unusedParam); lyr->Find->FindDataset = Form1->Map1->DataSets->_Item(unusedParam); lyr->Find->FindField = ds->Fields->_Item(unusedParam); //MapX выдает ошибку на этой строке ниже, если убрать три строки с VarAsType ошибка будет на строке с ф-цией Search lyr->Find->RefineLayer = VarAsType(nothing, VT_DISPATCH); lyr->Find->RefineDataset = VarAsType(nothing, VT_DISPATCH); lyr->Find->RefineField = VarAsType(nothing, VT_DISPATCH); FoundObj = lyr->Find->Search(WideString(Table2->FieldValues["ID"]),unusedParam1); if (FoundObj->get_FindRC() % 10 == 1) { ShowMessage("Yes"); Form1->Map1->Zoom = 30; //если объект найден карта увеличивается и помещает его в центре Form1->Map1->CenterX = FoundObj->get_CenterX(); Form1->Map1->CenterY = FoundObj->get_CenterY(); } else { ShowMessage("No"); } Родной код на Делфи в архиве выше в папке FIND |
Сообщ.
#27
,
|
|
|
Лена, я спрашивал не адреса объектов и функций - они мне неинтересны, а значение, возвращаемое функцией get_FindRC(или, что тоже самое - значение свойства FindRC). Или есть проблемы с сохранением значения в переменную?
Добавлено Цитата Лена @ Возвращает код результата поиска - успешно/неуспешно, почему неуспешно и т.д. Что конкретно делает метод get_FindRC() я не знаю |
Сообщ.
#28
,
|
|
|
Цитата Лена @ Обидно, что мое приложение практически готово и многое умеет делать Обидно то, что ты не понимаешь - как оно работает. trainer Цитата Coala @ Mapxlib_tlb::CMapXFeatures* __fastcall Search(BSTR strWhere, VARIANT Variables/*[opt]*/= TNoParam()); первый параметр - это WideString, а что за бред во втором параметре , не силен я в OLE-заморочках... Лена Цитата Лена @ //MapX выдает ошибку на этой строке ниже, если убрать три строки с VarAsType ошибка будет на строке с ф-цией Search lyr->Find->RefineLayer = VarAsType(nothing, VT_DISPATCH); lyr->Find->RefineDataset = VarAsType(nothing, VT_DISPATCH); lyr->Find->RefineField = VarAsType(nothing, VT_DISPATCH); FoundObj = lyr->Find->Search(WideString(Table2->FieldValues["ID"]),unusedParam1); что за ошибки-то - либо своими словами, либо скриншотики... |
Сообщ.
#29
,
|
|
|
>Обидно то, что ты не понимаешь - как оно работает.
То, что я уже сделала в своем приложении, я понимаю, как работает: динамическая загрузка слоев, различные инструменты для карты, замеры расстояний, печати областей и т.п. Там понятна каждая строчка. А вот поиск объекта В случае использования метода if (FoundFeature->get_FindRC() % 10 == 1) и в случае свойства if (FoundFeature->FindRC % 10 == 1) Возвращает в i цифру минус 3 short i = FoundFeature->FindRC; Очевидно это строка содержит ошибку: FoundFeature = Form1->Map1->Layers->_Item(unusedParam)->get_Find()->Search(WideString(Table2->FieldByName("ID")->AsString)); Со вторым параметром функции не совсем все понятно. Пробую так: OleVariant unusedParam1; AnsiString id = ""; unusedParam1.operator =(id); и использовать unusedParam1, но тоже ошибка. Все таки код из Делфи мне кажется более правильный, более подробно с моими предположительными комментариями: OleVariant unusedParam, unusedParam1; AnsiString id = ""; unusedParam.operator =(48);//номер слоя unusedParam1.operator =(id); CMapXLayer * lyr; CMapXDataset *ds; CMapXFindFeature *FoundObj; //cюда найденную улицу Variant nothing; nothing.VType = VT_DISPATCH; //готовиться какой-то дополнительный параметр lyr = Form1->Map1->Layers->_Item(unusedParam); //слою присваивается слой улицы по номеру (в делфи по имени) ds = Form1->Map1->DataSets->_Item(unusedParam); //очевидна инициализация ds данными из слоя улиц lyr->Find->FindDataset = Form1->Map1->DataSets->_Item(unusedParam);//очевидно привязка данных к слою lyr->Find->FindField = ds->Fields->_Item(unusedParam); //привязка полей? //три строки ниже явно готовить второй параметр для ф-ции Search, чтобы он был пустым //MapX выдает ошибку если не закоментрировать эти строки с VarAsType lyr->Find->RefineLayer = VarAsType(nothing, VT_DISPATCH); // ошибка см. рисунок lyr->Find->RefineDataset = VarAsType(nothing, VT_DISPATCH);//VarAsType требует const Variant &V и unsignet short AVarType lyr->Find->RefineField = VarAsType(nothing, VT_DISPATCH); //если три строки выше закомментированы, то ошибка в строке ниже //тут явная ошибка я передаю unusedParam1, а надо что-то другое. В делфи передается '', если убрать unusedParam1 ошибка остается //подготовительные мероприятия закончены далее строка поиска FoundObj = lyr->Find->Search(WideString(Table2->FieldValues["ID"]),unusedParam1); if (FoundObj->FindRC % 10 == 1) //здесь минус три { ShowMessage("Yes"); Form1->Map1->Zoom = 30; Form1->Map1->CenterX = FoundObj->get_CenterX(); Form1->Map1->CenterY = FoundObj->get_CenterY(); } else { ShowMessage("No"); } При написании FoundObj = lyr->Find->Search( получаю в скобках первый параметр wchar_t * address, второй tagVariant RefineBoundary который каким-то образом надо подготовить и указать что он пустой. Описание вторго параметра ф-ции Search но для Делфи: A string, which is the name of the refining boundary object. Used when a refining layer is specified. For example, "NY", "21135". If a refine layer has been set, this argument is required; otherwise it is optional. Очевидно что мы не определяем refine layer поэтому он должен быть optional т.е. пустой, как в коде приложения который работает, но в ранней версии Builder Напомню строки того, как это реализовывалась в ранней версии Builder Variant l_A, ds_A; Variant find; l_A.OlePropertyGet("Find").OlePropertySet("FindDataset", ds_A); l_A.OlePropertyGet("Find").OlePropertySet("FindField", ds_A.OlePropertyGet("Fields","ID")); Table2->First(); find = l_A.OlePropertyGet("Find").OleFunction("Search", Table2->FieldValues["ID"], "" ); Прикреплённая картинка
|
Сообщ.
#30
,
|
|
|
С кодом Делфи, может понятнее:
OleVariant unusedParam; unusedParam.operator =(48);//number of layer CMapXLayer * lyr; CMapXDataset *ds; CMapXFindFeature *FoundObj; Table2->First(); Variant nothing; //TVarData(nothing).VType := varDispatch; from Delhi TVarData(nothing).VType = varDispatch; //lyr := currentMap.Layers.Item[findLayer.text]; from Delhi lyr = Form1->Map1->Layers->_Item(unusedParam);//number of layer, no Layer name function in C++Builder /* from Delhi ds := currentMap.Datasets.Item[findDataset.text]; lyr.Find.FindDataset := currentMap.Datasets.Item[findDataset.text]; lyr.Find.FindField := ds.Fields.Item[findField.text]; */ ds = Form1->Map1->DataSets->_Item(unusedParam); lyr->Find->FindDataset = Form1->Map1->DataSets->_Item(unusedParam);// lyr->Find->FindField = ds->Fields->_Item(unusedParam); /* from Delhi lyr.Find.RefineLayer := VarAsType(nothing, varDispatch); lyr.Find.RefineDataSet := VarAsType(nothing, varDispatch); lyr.Find.RefineField := VarAsType(nothing, varDispatch); */ lyr->Find->RefineLayer = VarAsType(nothing, varDispatch); //problem??? lyr->Find->RefineDataset = VarAsType(nothing, varDispatch); lyr->Find->RefineField = VarAsType(nothing, varDispatch); FoundObj = lyr->Find->Search(WideString(Table2->FieldValues["ID"]),what second parameter here?); if (FoundObj->FindRC % 10 == 1) { ShowMessage("Yes"); Form1->Map1->Zoom = 30; Form1->Map1->CenterX = FoundObj->get_CenterX(); Form1->Map1->CenterY = FoundObj->get_CenterY(); } else { ShowMessage("No"); } |