Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.118.254.94] |
|
Страницы: (10) [1] 2 3 ... 9 10 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Как правильно найти объект на карте в С++ Builder 6?
CMapXFindFeature *FoundFeature; OleVariant unusedParam; unusedParam.operator =(48); //номер нужного слоя FoundFeature = Form1->Map1->Layers->_Item(unusedParam)->get_Find()->Search(WideString(Edit1->Text)); //в Edit1->Text храниться название улицы находящейся на слое №48 Проверка в if говорит о том, что улицу не находит, хотя она есть на карте. if (FoundFeature->get_FindRC() % 10 == 1) { ShowMessage("Есть"); Form1->Map1->Zoom = 30; Form1->Map1->CenterX = FoundFeature->get_CenterX(); Form1->Map1->CenterY = FoundFeature->get_CenterY(); } else { ShowMessage("Нет улицы"); } Вывод: в строке ниже что-то неправильно: FoundFeature = Form1->Map1->Layers->_Item(unusedParam)->get_Find()->Search(WideString(Edit1->Text)); Что? |
Сообщ.
#2
,
|
|
|
Цитата Лена @ Вывод: в строке ниже что-то неправильно: FoundFeature = Form1->Map1->Layers->_Item(unusedParam)->get_Find()->Search(WideString(Edit1->Text)); Что? Не факт... Малость смущает цепочка ->get_Find()->Search() == ->найти->исследовать - это первое. Второе - проверь, что возвращает сам FoundFeature->get_FindRC(). Третье - FoundFeature->get_FindRC() % 10 - может быть так - FoundFeature->get_FindRC() % 0x10 и вообще как-то странно - по значению остатка определять ДА или НЕТ тоже немножко странно OleVariant unusedParam; unusedParam.operator =(48); //номер нужного слоя хотя присваивание unusedParam = 48 делает то же самое... |
Сообщ.
#3
,
|
|
|
Свой пример я основывала на примере из help. Для Builder help-a нет.
Вот он: void CSampleProjectView::SimpleFind() { try { CMapXFindFeature FoundObject = m_Map.GetLayers(). Item("US Major Cities").GetFind().Search("Columbia","SC"); if(FoundObject.GetFindRC() %10 == 1) { m_Map.SetZoom(100); m_Map.SetCenterX(FoundObject.GetCenterX()); m_Map.SetCenterY(FoundObject.GetCenterY()); } else AfxMessageBox("No exact match found."); } catch (COleDispatchException *e) { e->ReportError(); e->Delete(); } catch (COleException *e) { e->ReportError(); e->Delete(); } } Однако в Builder нет Item, а например есть _Item принимающий не имя а индекс типа OleVariant. Соответственно метод Search в Builder принимает параметр wchat_t * address. Исходя из этого и пробовала перевести выше приведенный код на C++ Builder 6. |
Сообщ.
#4
,
|
|
|
Цитата Лена @ Однако в Builder нет Item, а например есть _Item ... Лена, ты где-то здорово запуталась...Речь идет не о Билдере, у него действительно нет Item В хелпе УЖЕ приведен сишный код с использованием компонентов MapX и их причиндалов (свойств, методов, интерфейсов etc...) Я так понял, что тебе надо вести поиск по номеру слоя, а не по названию - это тебя и смутило - |
Сообщ.
#5
,
|
|
|
Цитата Coala @ Цитата Лена @ Однако в Builder нет Item, а например есть _Item ... Лена, ты где-то здорово запуталась...Речь идет не о Билдере, у него действительно нет Item В хелпе УЖЕ приведен сишный код с использованием компонентов MapX и их причиндалов (свойств, методов, интерфейсов etc...) Я так понял, что тебе надо вести поиск по номеру слоя, а не по названию - это тебя и смутило - _Item это метод MapX но в среде C++ Builder. Пишу Form1->Map1->Layers-> в выпадающем списке подскази ищу соответствующий метод, нахожу похожий из примера, это _Item его и использую в своей цепочке. В Делфи в выпадающем списке будет метод Item. MapX после интеграции в различные среды подставляет различные методы для каждой среды. Для Делфи будет Item принимающий имя слоя, для Builder будет _Item принимающий индекс слоя. Метод Search в Делфи принимает имя, а метод Search для Builder принимает wchat_t * address. Вот я и пытаюсь найти по индексу слоя, используя методы MapX, в среде Builder, потому что поиска по имени слоя в MapX в Builder нет. |
Сообщ.
#6
,
|
|
|
Дело в том что когда я делал поиск то для того что бы вытянуть название улицы и номер дома, все зависит от того как сделанна карат, нужно смотреть как это сделали разработчики, дело в том что в таблице с улицами может и не быть названий улиц, она может иметь указатели на другую таблицу... тебе нудно знать какую и в каком поле оно находиться и уже по соответствующей колонке делать выборку...
|
Сообщ.
#7
,
|
|
|
Цитата Лена @ MapX после интеграции в различные среды подставляет различные методы для каждой среды Лена, ты на 100% уверена? ActiveX для того и придумали, чтобы и на Билдере, и на Дельфях, и на всем остальном юзеры (программисты) не ломали голову! Цитата Лена @ Для Делфи будет Item принимающий имя слоя, для Builder будет _Item принимающий индекс слоя Если это действительно так - то таких программеров (утопить/дать Нобелевку - выбрать по желанию) Еще раз: Цитата Coala @ В хелпе УЖЕ приведен сишный код с использованием компонентов MapX не бывает в Дельфи void и if (такого как в хелпе) без begin и end. |
Сообщ.
#8
,
|
|
|
Coala, в хэлпе приведен код для VC, он может значительно отличаться от кода для билдера. Например, в коде Лены, Form1->Map1 - почти наверняка - компонент, брошенный на форму, т.е. указатель, а хэлпе явно используется или ссылочная переменная, или объект, и методы его возвращают ссылки или объекты, а не указатели.
|
Сообщ.
#9
,
|
|
|
Цитата Adil @ он может значительно отличаться от кода для билдера Я имею ввиду разницу в параметрах для одного и того же метода Цитата Adil @ Например, в коде Лены, Form1->Map1 - почти наверняка - компонент, брошенный на форму, т.е. указатель, а хэлпе явно используется или ссылочная переменная, или объект, и методы его возвращают ссылки или объекты, а не указатели ИМХО такое просто не пропустит компилятор - или не обязательно? |
Сообщ.
#10
,
|
|
|
Фрагмент help который я привела выше для VC. MapX компонент на форме. Примера на Делфи у меня нет, но там Item и практически тоже самое, я раньше видела пример в Интернете. Вот как ищет объект Visual Basik практически одно и тоже.
'The code for a find command button Private Sub cmdFind_Click() 'Create a MapXLib for the feature found Dim FindCityObject As MapXLib.FindFeature 'Sets the find feature object to the city the user types in Set FindCityObject = Map1.Layers("US Top 20 _ Cities").Find.Search(txtCityName.Text, txtStateName.Text) 'Use result codes to determine if a city is found If (FindCityObject.FindRC Mod 10 = 1) Then 'Recenter the map to the city location Map1.ZoomTo 200, FindCityObject.CenterX, _ FindCityObject.CenterY Else 'Print out message box indicating city was not found MsgBox ("City not found") End If End Sub Все однотипно и похоже и для VC и для Делфи и для VBA. Только у MapX в Builder свои прибамбасы To MAX2002 Да, мне кажется, что решение где-то рядом и возможно, мой код правильный. Вот несколько строчек кода начала поиска из рабочей программы из ранней версии Buildet, который ищет улицу. В ранней версии применялась технология OLE и MapX версии 3: //Variant l_A, ds_A, find; объявлены в классе формы l_A.OlePropertyGet("Find").OlePropertySet("FindDataset", ds_A); l_A.OlePropertyGet("Find").OlePropertySet("FindField", ds_A.OlePropertyGet("Fields","ID")); l_A.OlePropertyGet("Find").OlePropertySet("ClosestAddr", true); Table2->First(); find = l_A.OlePropertyGet("Find").OleFunction("Search", Table2->FieldValues["ID"], "" );//вот оно! Значит, человек в конечно итоге ищет по id (таблица приложена ниже), значит, мой код для 6 версии должен выглядеть так: CMapXFindFeature *FoundFeature = Form1->Map1->Layers->get_Item(unusedParam)->get_Find()->Search(WideString(Table2->FieldValues["ID"])); unusedParam - номер слоя Слой с улицами загружен в MapX я его вижу, знаю его номер, есть таблица (*.dbf) откуда этот слой получил данные об улицах (прилагаю). Однако не находит. Что-то я упускаю. Прикреплённая картинка
|
Сообщ.
#11
,
|
|
|
Цитата Лена @ CMapXFindFeature FoundObject = m_Map.GetLayers().Item("US Major Cities").GetFind().Search("Columbia","SC"); Цитата Лена @ Set FindCityObject = Map1.Layers("US Top 20 _Cities").Find.Search(txtCityName.Text, txtStateName.Text) в обоих примерах Search имеет 2 параметра - в данных случаях, название города и название штата. Цитата Лена @ FoundFeature = Form1->Map1->Layers->_Item(unusedParam)->get_Find()->Search(WideString(Edit1->Text)); Второй параметр допустимо не указывать (NULL по умолчанию для wchar_t) или как? |
Сообщ.
#12
,
|
|
|
Из той справки что я имею вот его описание OBJECT.Search (Address, [ Boundary ] )
N1 первый параметр №2 - второй. 1. A string, which is the name of the object or street address that you want to find. For example, "Rensselaer, 6 Georgian Ct,", "London", or "3 Elm Street". 2. 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. Я так понимаю, что параметр не обязатлен и самое главное я перевожу код из раней версии Builder и там у человека пусто и все работает. Поэтому я опустила этот параметр. find = l_A.OlePropertyGet("Find").OleFunction("Search", Table2->FieldValues["ID"], "" );//из ранеей версии, видно что пусто. Еще если у MAX2002 есть код на Делфи для поиска объекта, выложите его пожалуйста, А то у меня на VC и VBA под рукой. |
Сообщ.
#13
,
|
|
|
Цитата Лена @ FoundFeature = Form1->Map1->Layers->_Item(unusedParam)->get_Find()->Search(WideString(Edit1->Text)); Цитата Лена @ find = l_A.OlePropertyGet("Find").OleFunction("Search", Table2->FieldValues["ID"], "" ); Аленушка, разницу видишь? У предшественника - 2 параметра - Table2->FieldValues["ID"] и "" . |
Сообщ.
#14
,
|
|
|
Пробывала передать пустые кавычки, тоже не находит:
CMapXFindFeature *FoundFeature; OleVariant unusedParam, unusedParam1; unusedParam.operator =(48); AnsiString id2 = ""; unusedParam1.operator =(id2); FoundFeature = Form1->Map1->Layers->_Item(unusedParam)->get_Find()->Search(WideString(Table2->FieldByName("ID")->AsString),unusedParam1); |
Сообщ.
#15
,
|
|
|
Лена, попробуй так
FoundFeature = Form1->Map1->Layers->_Item(unusedParam)->get_Find()->Search(WideString(Table2->FieldByName("ID")->AsString), WideString("")); |