На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
[!] Как относитесь к модерированию на этом форуме? Выскажите свое мнение здесь
Страницы: (10) [1] 2 3 ...  9 10 все  ( Перейти к последнему сообщению )  
> Поиск объекта , Вопрос тем, кто работал с MapX5.0
    Как правильно найти объект на карте в С++ Builder 6?

    ExpandedWrap disabled
      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));
      Что?
      Цитата Лена @
      Вывод: в строке ниже что-то неправильно:
      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
      и вообще как-то странно - по значению остатка определять ДА или НЕТ :huh:

      тоже немножко странно
      OleVariant unusedParam;
      unusedParam.operator =(48); //номер нужного слоя

      хотя присваивание
      unusedParam = 48 делает то же самое... :huh:
      Сообщение отредактировано: Coala -
        Свой пример я основывала на примере из help. Для Builder help-a нет.
        Вот он:
        ExpandedWrap disabled
          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.
          Цитата Лена @
          Однако в Builder нет Item, а например есть _Item ...

          Лена, ты где-то здорово запуталась...Речь идет не о Билдере, у него действительно нет Item
          В хелпе УЖЕ приведен сишный код с использованием компонентов MapX и их причиндалов (свойств, методов, интерфейсов etc...)
          Я так понял, что тебе надо вести поиск по номеру слоя, а не по названию - это тебя и смутило - :(
            Цитата 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 нет. :(
              Дело в том что когда я делал поиск то для того что бы вытянуть название улицы и номер дома, все зависит от того как сделанна карат, нужно смотреть как это сделали разработчики, дело в том что в таблице с улицами может и не быть названий улиц, она может иметь указатели на другую таблицу... тебе нудно знать какую и в каком поле оно находиться и уже по соответствующей колонке делать выборку...
                Цитата Лена @
                MapX после интеграции в различные среды подставляет различные методы для каждой среды

                Лена, ты на 100% уверена? ActiveX для того и придумали, чтобы и на Билдере, и на Дельфях, и на всем остальном юзеры (программисты)
                не ломали голову!
                Цитата Лена @
                Для Делфи будет Item принимающий имя слоя, для Builder будет _Item принимающий индекс слоя

                Если это действительно так - то таких программеров (утопить/дать Нобелевку - выбрать по желанию)
                Еще раз:
                Цитата Coala @
                В хелпе УЖЕ приведен сишный код с использованием компонентов MapX

                не бывает в Дельфи void и if (такого как в хелпе) без begin и end.
                  Coala, в хэлпе приведен код для VC, он может значительно отличаться от кода для билдера. Например, в коде Лены, Form1->Map1 - почти наверняка - компонент, брошенный на форму, т.е. указатель, а хэлпе явно используется или ссылочная переменная, или объект, и методы его возвращают ссылки или объекты, а не указатели.
                    Цитата Adil @
                    он может значительно отличаться от кода для билдера

                    Я имею ввиду разницу в параметрах для одного и того же метода
                    Цитата Adil @
                    Например, в коде Лены, Form1->Map1 - почти наверняка - компонент, брошенный на форму, т.е. указатель, а хэлпе явно используется или ссылочная переменная, или объект, и методы его возвращают ссылки или объекты, а не указатели

                    ИМХО такое просто не пропустит компилятор - или не обязательно?
                      Фрагмент help который я привела выше для VC. MapX компонент на форме. Примера на Делфи у меня нет, но там Item и практически тоже самое, я раньше видела пример в Интернете. Вот как ищет объект Visual Basik практически одно и тоже.

                      ExpandedWrap disabled
                        '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) откуда этот слой получил данные об улицах (прилагаю).
                      Однако не находит. Что-то я упускаю.
                      Прикреплённая картинка
                      Прикреплённая картинка
                        Цитата Лена @
                        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) или как?
                          Из той справки что я имею вот его описание 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 под рукой.
                            Цитата Лена @
                            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"] и "" . :ph34r:
                              Пробывала передать пустые кавычки, тоже не находит:
                              ExpandedWrap disabled
                                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);
                                Лена, попробуй так

                                FoundFeature = Form1->Map1->Layers->_Item(unusedParam)->get_Find()->Search(WideString(Table2->FieldByName("ID")->AsString), WideString(""));
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (10) [1] 2 3 ...  9 10 все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0635 ]   [ 16 queries used ]   [ Generated: 8.05.24, 21:18 GMT ]