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

    Лена, слой "_ROAD" индексирован? И это точно он содержит улицы? На всякий случай: road по-английски - дорога, улица - street. Хотя, конечно, при создании слоя его могли назвать как угодно. :)

    Добавлено
    Цитата Лена @
    Тогда что выглядит более правильным
    Ни то, ни другое. Объект, инкапсулирующий VARIANT, изначально создается пустым. В первом случае IsNull() не делает никаких осмысленных действий, во втором - объект получает значение "пустая строка". Unassigned и пустая строка, строго говоря - разные значения(хотя конкретный компонент может интерпретировать их одинаково).

    Добавлено
    И почему все время параметры называются "Неиспользуемый параметр"(unusedParam)? Чтобы врагов запутать? :lol:

    Добавлено
    Если FindRC действительно возвращает -3, то это какая-то недокументированная ошибка(или случайное значение), ибо это не соответствует ни одному из кодов результата операции поиска или коду ошибки.
      Цитата trainer @
      Coala, кончай нести чушь и запутывать Лену.

      Look at yourself :ph34r:
      Оба на кофейной гуще гадаем...
        Всем мои извинения...малость погавкались...
        Цитата trainer @
        Если FindRC действительно возвращает -3, то это какая-то недокументированная ошибка(или случайное значение), ибо это не соответствует ни одному из кодов результата операции поиска или коду ошибки.

        Тут trainer прав. Поэтому (может быть, я уже всех достал), но возникает два вопроса
        - что возвращает строка
        Цитата Лена @
        FoundObj = Form1->Map1->Layers->_Item(unusedParam1)->get_Find()->Search(WideString(Table2->FieldByName("ID")->AsString),unusedParam2);

        т.е. что именно сидит в FoundObj
        - есть ли что-нибудь в хелпах по поводу кодов ошибок
        -----------------------------
        Второй параметр Search - TNoParam() определен в utilcls.h
        Можно попробовать следующее
        ExpandedWrap disabled
            // в хидере
            TNoParam * prm;
            // в FormCreate
            prm = new TNoParam();
            
            .....
            
            ...->Search(wide_string.bstr(), prm);
        Сообщение отредактировано: Coala -
          Мне кажется, что я сейчас выкладываю код самый близкий к правильному. В нем ошибка. Если есть мысли, подскажите как ее обойти.
          ExpandedWrap disabled
            void __fastcall TFStr_Search::Button2Click(TObject *Sender)
            {
              OleVariant Param1;
              Param1.operator =(48); //номер слоя
             
              CMapXLayer * lyr;
              CMapXDataset *ds;
              Table2->First();
             
              lyr = Form1->Map1->Layers->_Item(Param1);
              lyr->Name; //просто проверка в точке отстановки, все нормально
             
            /*
              from Delhi
              lyr, ds: variant;
              ds := Map1.Datasets.Item[findDataset.text];
              lyr.Find.FindDataset := Map1.Datasets.Item[findDataset.text];
              lyr.Find.FindField := ds.Fields.Item[findField.text];
              Где  findDataset, findDataset, findField, FindItem это тексты из ComboBox примера.
              я не могу объявить lyr, ds как Variant, потому что не смогу строить цепочку lyr->
            */
             
            //подготовка lyr для последующего вызова Search по аналогии c Делфи
              ds = Form1->Map1->DataSets->_Item(Param1); //здесь в точке останова ds = NULL?!
              lyr->Find->FindDataset = Form1->Map1->DataSets->_Item(Param1);
              lyr->Find->FindField = ds->Fields->_Item(Param1); //ds = NULL поэтому исключение. Ошибка только во время выполнения.
             
            //код ниже, по моему мнению, правильный
             CMapXFindFeature* feature;
             CMapXLayerFind* lfind = lyr->get_Find();
             
             if(lfind!=NULL)
             {
               feature = lfind->Search(WideString(Table2->FieldByName("ID")->AsString).c_bstr());
              }
              
               if(feature!=NULL)
               {
                  WideString Name = feature ->get_Name();
                  Form1->Label5->Caption = Name;
               }
             
             if (feature ->FindRC % 10 == 1)
              {
               ShowMessage("Yes");
               Form1->Map1->Zoom = 30;
               Form1->Map1->CenterX = feature ->get_CenterX();
               Form1->Map1->CenterY = feature ->get_CenterY();
              }
              else
               {
                ShowMessage("No");
             
               }
             
            }// конец обработчика

          Как правильно реализовать эту строчку: ds = Form1->Map1->DataSets->_Item(Param1);? Даже если жестко прописывать значение из базы данных, все равно ds = NULL. Строка явно не правильно мною сформирована.
          Самая главная просьба - не сортесь, пожалуйста, из-за этого не победимого MapX! :)
            Цитата Лена @
            Самая главная просьба - не сортесь, пожалуйста, из-за этого не победимого MapX!

            Мы постараемся, главная проблема в том, что мы не можем смоделировать твою ситуацию - поэтому и (мягко говоря) гадаем...
            Все-таки попробуй ввести в Search 2 параметра - как я написал в посте № 48...
              Думаю в ds = Form1->Map1->DataSets->_Item(Param1); надо передать не Param1, а значение из базы данных, но пока не соображу как.

              -юсртыхэю
              Цитата Coala @
              Цитата Лена @
              Самая главная просьба - не сортесь, пожалуйста, из-за этого не победимого MapX!

              Мы постараемся, главная проблема в том, что мы не можем смоделировать твою ситуацию - поэтому и (мягко говоря) гадаем...
              Все-таки попробуй ввести в Search 2 параметра - как я написал в посте № 48...

              Я уже пробывала и два и один. Мне кажется lyr не готов к вызову Seach. lyr-у надо предварительно указать поле из базы данных, чего раньше я не делала. И затем Seach по текущей записи в этом поле найдет, то что нужно. В коде выше я пытаюсь подготовить слой lyr.
                Цитата Лена @
                Я уже пробывала и два

                я имел ввиду второй параметр класса TNoParam() - как в вызове метода, описанном в MapXLib_TLB.h
                  Посмотрите как основательно готовиться в ранней версии Builder вызов метода Seach
                  ExpandedWrap disabled
                    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"));
                    find = l_A.OlePropertyGet("Find").OleFunction("Search", Table2->FieldValues["ID"], "" );

                  инициализируется Dataset у слоя (в данном случае роль слоя это l_A) и приписывается поле ID через Fields и только после этого вызывается "Search" для текущей записи. Все мои Search раньше ничего не находили и не найдут потому что поиск мною был не поготовлен для lyr.
                  Я попробую
                  ExpandedWrap disabled
                    // в хидере
                      TNoParam * prm;
                      // в FormCreate
                      prm = new TNoParam();
                      
                      .....
                      
                      ...->Search(wide_string.bstr(), prm);

                  но не найдет. lyr не готов.
                    Цитата Лена @
                    ds = Form1->Map1->DataSets->_Item(Param1); //здесь в точке останова ds = NULL?!

                    По идее, у Map->DataSets должно быть свойство Count (в общем, количество этих самых доступных ДатаСетов),
                    посмотри в отладчике чему оно равно...
                      Цитата Лена @
                      ds = Form1->Map1->DataSets->_Item(Param1); //здесь в точке останова ds = NULL?!
                      Насколько я понимаю, 48-й набор данных не обязан быть источником данных для 48-го слоя. Точно также, как и слой "_ROAD" может иметь набор данных с другим именем. Слой может вообще не иметь набора данных или иметь несколько наборов данных.
                      Проверять надо через Form1->Map1->Layers->_Item(OleVariant(L"_ROAD"))->DataSets;
                        Да все правильно, очевидно слой не содержит данных раз ds=NULL.
                        Но я не соображу, что поменять в коде ниже исходя из вашего совета?
                        ExpandedWrap disabled
                          void __fastcall TFStr_Search::Button2Click(TObject *Sender)
                          {
                           
                          OleVariant Param1, Param2;
                          AnsiString NAME = "_ROAD";
                          AnsiString Field = "ID";
                           
                          Param1.operator =(NAME);//имя слоя
                          Param2.operator =(Field); //имя колонки в таблице
                          CMapXLayer * lyr;
                          CMapXDataset *ds;
                          Table1->First();
                           
                          lyr = Form1->Map1->Layers->_Item(Param1);
                          //lyr->Name; //для проверки ОК
                           
                          ds = Form1->Map1->DataSets->_Item(Param1);//что тут написать? как привизать данные к lyr?
                          lyr->Find->FindDataset = Form1->Map1->DataSets->_Item(Param1);
                          lyr->Find->FindField = ds->Fields->_Item(Param2);
                           
                          CMapXFindFeature* feature;
                          CMapXLayerFind* lfind = lyr->get_Find();
                           
                          if(lfind!=NULL)
                          {
                          feature = lfind->Search(WideString(Table1->FieldByName("ID")->AsString).c_bstr());
                          }
                           
                          if (feature ->FindRC % 10 == 1)
                          {
                          ShowMessage("Yes");
                          Form1->Map1->Zoom = 30;
                          Form1->Map1->CenterX = feature ->get_CenterX();
                          Form1->Map1->CenterY = feature ->get_CenterY();
                          }
                          else
                          {
                          ShowMessage("No");
                           
                          }
                           
                          }
                          Цитата Лена @
                          Но я не соображу, что поменять в коде ниже исходя из вашего совета?
                          Я не знаю деталей реализации. Например, что из себя представляет источник данных? DAO? ADO? ODBC? RDO? Lotus Notes? OLE? Что-то еще?
                          Для начала:
                          ExpandedWrap disabled
                            void __fastcall TFStr_Search::Button2Click(TObject *Sender)
                               CMapXDatasets * layer_datasets = Form1->Map1->Layers->_Item(OleVariant(L"_ROAD"))->DataSets;
                               if( layer_datasets ) {
                                  if( layer_datasets->Count > 0 ) {
                                     char buffer[256];
                                     sprintf(buffer,"Слой имеет %d источников данных",layer_datasets->Count);
                                     MessageBox(Handle,buffer,"Информация",MB_ICONINFORMATION|MB_OK);
                                  } else {
                                     MessageBox(Handle,"Слой не имеет источников данных","Ошибка",MB_ICONSTOP|MB_OK);
                                  }
                               } else {
                                  MessageBox(Handle,"Ошибка при получении набора источников данных слоя","Ошибка",MB_ICONSTOP|MB_OK);
                               }
                            }
                          И посмотреть, что будет выведено. Хотя, насколько я понимаю, если данные отображаются, то источник данных должен быть(если только это не картинка)
                            Это - начало заголовка WOR-файла MapInfo:

                            !Workspace
                            !Version 600
                            !Charset WindowsCyrillic
                            Open Table "гидрография_L" As гидрография_L
                            Open Table "растительность_A" As растительность_A
                            Open Table "дорожная_сеть_L" As дорожная_сеть_L
                            и т.д....


                            при этом все данные слоя/таблицы хранятся в файлах tab_name.DAT, .ID, .MAP, .TAB.

                            Для этого набора данных MapInfo в диалоге Карта->Управление слоями дает такую последовательность:

                            косметический слой
                            дорожная_сеть_L
                            гидрография_L
                            растительность_A


                            Вывод - не факт, что слой с номером N из диалога связан с таблицей под таким же номером...
                            Далее - наличие косметического слоя (в AutoCAD это системный, неудаляемый и т.д.). Не надо ли учитывать его наличие
                            при индексировании слоев?

                            Цитата trainer @
                            Например, что из себя представляет источник данных? DAO? ADO? ODBC? RDO? Lotus Notes? OLE? Что-то еще?

                            trainer, очевидно, что-то еще...Самодельное от разработчиков MapX...
                            Лена, запусти тест trainer из предыдущего поста, возможно, появится ясность...
                            ............
                            :wall: Вот тут действительно малость отморозил - если это данные объектов (семантика) из самой карты, то они в DAT-файлах (метрика соответственно в MAP)и доступ к ним идет средствами MapInfo (MapBasic, MapX, etc), а вот если это данные из внешней базы, то trainer
                            задал справедливый вопрос :blink:
                            Сообщение отредактировано: Coala -
                              trainer и Coala спасибо за помощь!
                              По-моему мы все в шаге от Нобелевской премии за попытку разобраться как работает MapX в среде C++ Builder :)
                              Мне кажется, что в данный момент на просторах CНГ только я одна работаю с MapX в Builder :)
                              Источник данных BDE таблицы dbf.
                              trainer объясните, что зачем буква L перед кавычками в строке _Item(OleVariant(L"_ROAD"))? Прежде чем тестировать, хочу понять сам код.
                              Наш с вами топик внимательно читал еще один человек. Я получила от него письмо. У него не установлен MapX но на основании его рекомендаций у меня получился новый код. Мне кажется я в шаге от решения:
                              ExpandedWrap disabled
                                void __fastcall TFStr_Search::Button2Click(TObject *Sender)
                                {
                                  Table2->First();
                                  OleVariant Param1;
                                  AnsiString NAME = "_ROAD";
                                  Param1.operator =(NAME); //имя слоя
                                  
                                  
                                  CMapXLayer * lyr;
                                 lyr = Form1->Map1->Layers->_Item(Param1);
                                 
                                //ЕСЛИ НЕТ БАЗЫ ДАННЫХ, ПОИСК БЕСПОЛЕЗЕН, НИЧЕГО НЕ НАЙДЕТ
                                //ПОЭТОМУ СОЗДАЕТСЯ БАЗА ДАННЫХ ДЛЯ ТОГО СЛОЯ В КОТОРОМ БУДЕТ ПОИСК
                                 Form1->Map1->DataSets->Add(miDataSetLayer, lyr, Param1); //здесь у меня ошибка, надо не CMapXLayer а вариант для второго параметра
                                 lyr->Find->FindDataset = Form1->Map1->DataSets->_Item(Param1);//заносим в lyr
                                 
                                 CMapXDataset *ds = Form1->Map1->DataSets->_Item(Param1);
                                //цикл для теста
                                for(int i = 1; i <= ds->Fields->Count; i++)
                                  {
                                    ShowMessage(ds->Fields->_Item(Param1)->Name);
                                    // Чтобы удостовериться в наличии поля ID
                                  }
                                 
                                 lyr->Find->FindField = ds->Fields->_Item(исходя из цикла);//ID
                                 
                                CMapXFindFeature *FoundObj;
                                  FoundObj =
                                lyr->get_Find()->Search(WideString(Table2->FieldByName("ID")->AsString));
                                 
                                  if (FoundObj->FindRC % 10 == 1) //константа -3 ищ справки будет означаеть, что ничего не найдено.
                                  {
                                    ShowMessage("Yes");
                                    Form1->Map1->Zoom = 30;
                                    Form1->Map1->CenterX = FoundObj->get_CenterX();
                                    Form1->Map1->CenterY = FoundObj->get_CenterY();
                                  }
                                  else
                                  {
                                    ShowMessage("No");
                                  }
                                }


                              Form1->Map1->DataSets->Add(miDataSetLayer, lyr, Param1); Как я понимаю, должно быть похоже на это: Map1->DataSets->Add(miDataSetLayer, lyr, lyr->Name); Первый параметр предопределенная константа, два других варианты.

                              Добавлено
                              Раньше я выложила код на форуме MapInfo, там не было еще метода Add: вот сегодня ответ

                              I don't see anywhere in this code where you issue a Datasets.Add. Is that somewhere else in your code? If you issue Map1.Datasets.Count, does it return a number greater than 0?

                              Cindy
                              MapInfo Technical Support

                              Значит мы движемся в ПРАВЕЛЬНОМ направлении метод ADD!!!!
                                Цитата Лена @
                                По-моему мы все в шаге от Нобелевской премии за попытку разобраться как работает MapX в среде C++ Builder

                                Скорее - от белой рубахи до пола с очччччень длинными рукавами :lool:
                                Лена, мне действительно такая рубаха скоро понадобится!
                                Цитата Лена @
                                Источник данных BDE таблицы dbf.

                                BDE - не источник данных, а механизм доступа к ним.
                                Рубаху мне, рубаху :wall: :wall: :wall:

                                Если я правильно понимаю вопрос, то MapX создан для работы с внутренним форматом MapInfo (DAT, ID, MAP, TAB - файлами или цифровой картой), если
                                MapX позволяет пристегнуть и внешние базы - то причем тут BDE, а если не позволяет, то как MapX можно с ним скрестить?
                                Слои карты и таблицы базы связаны между собой или как?
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (10) « Первая ... 2 3 [4] 5 6 ...  9 10 все


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