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

    Я им пишу "так покажите фрагмент кода как правильно!", а они молчат как партизаны! :)
      Лена, отправь им то, что я тебе предложил...
      Вполне возможно, что tagVariant - это 0 [по умолчанию]?
      Цитата Coala @
      таких программеров (утопить/дать Нобелевку - выбрать по желанию)

      оставить только утопить
      и начать с этой самой Cindy c ее I don't see the value that you're trying to find in your code?

      К сожалению, в таких случаях приходится пробовать методом тыка :'(

      P.S. Есть дилер MapInfo (в том числе) фирма Резидент, если память не изменяет - www.resident.ru (можно поискать в яндексе).
      Эти ребята пишут и сами - может быть, они смогут помочь... :ph34r:
      Сообщение отредактировано: Coala -
        ну вообщето это я делал, только наоборот, поиск к точке ближайших объектов, и все работало, только осталось найти старые исходники... :huh:
          Цитата MAX2002 @
          ну вообщето это я делал, только наоборот, поиск к точке ближайших объектов, и все работало, только осталось найти старые исходники... :huh:

          MAX2002, буду очень признательна, если найдутся ЛЮБЫЕ фрагменты вашего кода, и вы их мне вышлите! Даже если вы их найдете через месяц, все равно они будут актуальны. Мне надо обязательно доделать свой проект!
          Я от этого MapX, скоро стану похожа на этот смайлик: :wacko:
            Лена, Вы бы выложили здесь TLB от MapX ActiveX или сгенерированный на его основе Builder'ом заголовочный файл. Возможно, что уже давно бы получили ответ. :)
              Цитата Лена @
              сгенерированный на его основе Builder'ом заголовочный файл

              Как всегда - в лузу!!! Мог бы и сам давно сообразить... :wall:
              ----
              Намудрил с цитатами, trainer, sorry :'(
              Сообщение отредактировано: Coala -
                Цитата trainer @
                Лена, Вы бы выложили здесь TLB от MapX ActiveX или сгенерированный на его основе Builder'ом заголовочный файл. Возможно, что уже давно бы получили ответ. :)

                Вот h, cpp, tlb:
                Прикреплённый файлПрикреплённый файлMapX.zip (94.65 Кбайт, скачиваний: 119)
                  Ага, есть - в MapXLib_TLB.h

                  Mapxlib_tlb::CMapXFeatures* __fastcall Search(BSTR strWhere, VARIANT Variables/*[opt]*/= TNoParam());

                  Народ, кто пограмотней в ActiveX - подскажите!
                    Вот еще папка с файлами примеров для Делфи, которая идет в стандартной поставке MapX. Сейчас пытаюсь адаптировать фрагменты кода для Builder, но пока особого успеха нет из-за разных параметров в функциях.
                    Прикреплённый файлПрикреплённый файлSamples.zip (98.72 Кбайт, скачиваний: 124)
                      А какое значение возвращает FindRC?
                        После выполнения строки:
                        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 и зачем оно? Обидно, что мое приложение практически готово и многое умеет делать. Вот только с поиском проблема. :(
                        ExpandedWrap disabled
                          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
                          Лена, я спрашивал не адреса объектов и функций - они мне неинтересны, а значение, возвращаемое функцией get_FindRC(или, что тоже самое - значение свойства FindRC). Или есть проблемы с сохранением значения в переменную?

                          Добавлено
                          Цитата Лена @
                          Что конкретно делает метод get_FindRC() я не знаю
                          Возвращает код результата поиска - успешно/неуспешно, почему неуспешно и т.д.
                            Цитата Лена @
                            Обидно, что мое приложение практически готово и многое умеет делать

                            Обидно то, что ты не понимаешь - как оно работает.
                            trainer
                            Цитата Coala @
                            Mapxlib_tlb::CMapXFeatures* __fastcall Search(BSTR strWhere, VARIANT Variables/*[opt]*/= TNoParam());

                            первый параметр - это WideString, а что за бред во втором параметре :wall: :wall: :wall:, не силен я в OLE-заморочках... :blink:
                            Лена
                            Цитата Лена @
                            //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);

                            что за ошибки-то - либо своими словами, либо скриншотики...
                              >Обидно то, что ты не понимаешь - как оно работает.

                              То, что я уже сделала в своем приложении, я понимаю, как работает: динамическая загрузка слоев, различные инструменты для карты, замеры расстояний, печати областей и т.п. Там понятна каждая строчка. :)

                              А вот поиск объекта :wall:

                              В случае использования метода
                              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, но тоже ошибка.

                              Все таки код из Делфи мне кажется более правильный, более подробно с моими предположительными комментариями:

                              ExpandedWrap disabled
                                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"], "" );
                              Прикреплённая картинка
                              Прикреплённая картинка
                                С кодом Делфи, может понятнее:
                                ExpandedWrap disabled
                                  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");
                                   
                                     }
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (10) 1 [2] 3 4 ...  9 10 все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0571 ]   [ 15 queries used ]   [ Generated: 19.05.24, 23:41 GMT ]