На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
[!] Как относитесь к модерированию на этом форуме? Выскажите свое мнение здесь
Страницы: (10) « Первая ... 4 5 [6] 7 8 ... Последняя » все  ( Перейти к последнему сообщению )  
> Поиск объекта , Вопрос тем, кто работал с MapX5.0
    Опытным путем пришла к такому коду, естественно он с моей ошибкой :)
    ExpandedWrap disabled
      void __fastcall TFStr_Search::Button2Click(TObject *Sender)
      {
       
        Table2->First();
        OleVariant Param1, Param2;
        AnsiString NAME = "_ROAD";
        AnsiString Field = "ID";
        Param1.operator =(NAME);
        Param2.operator =(Field);
       
       CMapXLayer * lyr;
       lyr = Form1->Map1->Layers->_Item(Param1);
       //long x = Form1->Map1->DataSets->Count; //тут вижу 48 все правильно!
       
       Form1->Map1->DataSets->Add(miDataSetLayer,OleVariant(lyr),OleVariant(lyr->Name));//так ли?
       lyr->Find->FindDataset = Form1->Map1->DataSets->get_Item(Param1);
       CMapXDataset *ds = Form1->Map1->DataSets->get_Item(Param1);
       
       
      //цикл для теста
      for(int i = 1; i <= ds->Fields->Count; i++)
        {
          Param1.operator = (i);
          ShowMessage(ds->Fields->_Item(Param1)->Name);
          //здесь конкретно вижу имя каждого поля из базы данных. Все точно! Поле ID идет вторым.
        }
       
       
      lyr->Find->FindField = ds->Fields->_Item(Param1);
       
      CMapXFindFeature *FoundObj;
      FoundObj = lyr->get_Find()->Search(WideString(Table2->FieldByName("ID")->AsString));
        if (FoundObj->FindRC % 10 == 1)// ОШИБКА!!! Получить возвращаемое значение никак не удается! Метод get_FindRC не помогает.
        {
          ShowMessage("Yes");
          Form1->Map1->Zoom = 30;
          Form1->Map1->CenterX = FoundObj->get_CenterX();
          Form1->Map1->CenterY = FoundObj->get_CenterY();
        }
        else
        {
          ShowMessage("No");
        }
       
      }

    Или не правильно оформила ADD (см.рисунок) или вступает в силу второй параметр Seach.

    Добавлено
    lyr->Find->FindField = ds->Fields->_Item(Param1); надо Param1 но тоже не помогает.

    Добавлено
    lyr->Find->FindField = ds->Fields->_Item(Param1); надо Param2 но тоже не помогает.
    Прикреплённая картинка
    Прикреплённая картинка
      Цитата Лена @
      ОШИБКА!!! Получить возвращаемое значение никак не удается! Метод get_FindRC не помогает.
      И не поможет. Т.к. FindRC и get_FindRC - фактически одно и то же.

      Очевидно, что должно быть примерно так.
      Загрузка слоев:
      ExpandedWrap disabled
        void __fastcall TForm1::Button3Click(TObject *Sender) {
           int i;
           TTable * table = DataModule1->Table5;
           CMapXLayer * layer;
           CMapXDataset * dataset;
           table->First();
           for( i = table->RecordCount ; i >= 0 ; --i ) {
              layer = Map1->Layers->Add(table->FielbByName("FILE")->AsVariant);
              dataset = Map1->Datasets->Add(miDataSetLayer,layer,OleVariant(layer->Name));
              table->Next();
           }
        }

      Поиск:
      ExpandedWrap disabled
        void __fastcall TFStr_Search::Button2Click(TObject *Sender) {
           CMapXLayer * layer = Form1->Map1->Layers->_Item(OleVariant("_ROAD"));
           CMapXDataset * dataset = layer->Datasets->_Item(OleVariant("_ROAD"));
           CMapXField * field = dataset->Fields->_Item(OleVariant("ID"));
           CMapXLayerFind * find = layer->Find;
           find->FindDataset = dataset;
           find->FindField = field;
           CMapXFoundFeature * find_result = find->Search(OleVariant(Edit1->Text));
           if( (find_result->FindRC%10) == 1 ) {
              Form1->Map1->Zoom = 30;
              Form1->Map1->CenterX = find_result->get_CenterX();
              Form1->Map1->CenterY = find_result->get_CenterY();
           } else {
              char buffer[1024];
              sprintf("Не смог найти объект\nКод результата поиска: %d",find_result->FindRC);
              MessageBox(Handle,buffer,"Ошибка",MB_ICONSTOP|MB_OK);
           }
        }


      Как выглядит файл TAB?

      P.S. 1) Возможно, что я ошибаюсь;
      2) Возможно, что некоторые действия можно не повторять каждый раз, а вынести из поиска в загрузку.
        CMapXDataset * dataset = layer->Datasets->_Item(OleVariant("_ROAD"));

        layer DataSet пуст. Нужно

        CMapXDataSet *dataset = Form1->Map1->DataSets->_Item(OleVariant("_ROAD"));
          Цитата trainer @
          Как выглядит файл TAB?

          Это описание полей конкретной таблицы, например:
          !table
          !version 300
          !charset WindowsCyrillic

          Definition Table
          Type NATIVE Charset "WindowsCyrillic"
          Fields 13
          obj_COD Integer ;
          obj_NUM Integer ;
          obj_NAM Char (32) ;
          atr_003 Char (32) ;
          atr_005 Char (32) ;
          atr_009 Char (254) ;
          atr_015 Char (32) ;
          atr_028 Float ;
          atr_032 Char (32) ;
          atr_033 Char (32) ;
          atr_036 Char (32) ;
          atr_040 Char (32) ;
          atr_247 Char (254) ;


          Лена, вышли для trainer свой реальный road.tab (или _road.tab)
          ЗЫ.
          Сама карта - это 4 файла:
          - TAB
          - MAP - собственно метрика объектов карты (слоя карты, в принципе в MapInfo всю карту можно вбухать в 1 слой)
          - DAT - атрибуты объектов (семантика, характеристики). Каждой записи в MAP соответствует запись в DAT (даже если она пустая)
          - ID - честно говоря, не совсем понял, что в нем идентифицируется.
          Три последних файла - двоичные.
          ...
          Похоже - в предыдущем посте Guest говорит дело!
          В первом случае получаем Датасет из коллекции Датасетов некоторого слоя, а во втором - из коллекции Датасетов карты!
          Сообщение отредактировано: Coala -
            Адаптировала код от trainer не работает:
            ExpandedWrap disabled
                 CMapXLayer * lyr = Form1->Map1->Layers->_Item(OleVariant("_ROAD"));
                 CMapXDataset * dataset = lyr->DataSets->_Item(OleVariant("_ROAD"));//при переходе на следующую строку исключение компонента
                 CMapXField * field = dataset->Fields->_Item(OleVariant("ID"));
                 CMapXLayerFind * find = lyr->Find;
                 find->FindDataset = dataset;
                 find->FindField = field;
                 CMapXFindFeature *FoundObj;
                 FoundObj = lyr->Find->Search(WideString(Table2->FieldByName("ID")->AsString));
                 if(FoundObj->FindRC % 10 == 1)
                  {
                    Form1->Map1->Zoom = 30;
                    Form1->Map1->CenterX = FoundObj->get_CenterX();
                    Form1->Map1->CenterY = FoundObj->get_CenterY();
                 }
               
                 else {
                    ....
                 }


            Мой новый код тоже на работает, хотя выглядит все правильно:
            ExpandedWrap disabled
              void __fastcall TFStr_Search::Button2Click(TObject *Sender)
              {
                Table2->First();
                OleVariant Param1, Param2;
                AnsiString NAME = "_ROAD";
                AnsiString Field = "ID";
                Param1.operator =(NAME);
                Param2.operator =(Field);
               
                int x = Form1->Map1->DataSets->Count;//вижу цифру 48
               
               CMapXLayer *  lyr = Form1->Map1->Layers->_Item(Param1);
               CMapXDataset * ds = lyr->DataSets->_Item(OleVariant(lyr));  //ds = NULL
               ds = Form1->Map1->DataSets->Add(miDataSetLayer,OleVariant(lyr)); //теперь ds != NULL
               lyr->Find->FindDataset = ds;
               
              /*
              //цикл для теста
              for(int i = 1; i <= ds->Fields->Count; i++)
                {
                  Param1.operator = (i);
                  ShowMessage(ds->Fields->_Item(Param1)->Name);
                  //здесь вижу все заголовки колонок таблицы
                }
              */
              //ShowMessage(ds->Fields->_Item(Param2)->Name); //вижу поле ID
               
              lyr->Find->FindField = ds->Fields->_Item(Param2);
               
              CMapXFindFeature *FoundObj;
              FoundObj = lyr->Find->Search(WideString(Table2->FieldByName("ID")->AsString));//тут что-то не так?
                if (FoundObj->FindRC % 10 == 1)//Ошибка компонента!!! Стандартное окно ошибки MapX.
                {
                  ShowMessage("Yes");
                  Form1->Map1->Zoom = 30;
                  Form1->Map1->CenterX = FoundObj->get_CenterX();
                  Form1->Map1->CenterY = FoundObj->get_CenterY();
                }
                else
                {
                  ShowMessage("No");
                }
               
              }


            Добавлено
            Если напиписать так if(FoundObj!=NULL && FoundObj->FindRC % 10 == 1)
            то удается увидеть, что FoundObj=NULL :(
            Прикреплённая картинка
            Прикреплённая картинка
              Цитата Лена @

              CMapXLayer * lyr = Form1->Map1->Layers->_Item(Param1);
              CMapXDataset * ds = lyr->DataSets->_Item(OleVariant(lyr)); //ds = NULL
              ds = Form1->Map1->DataSets->Add(miDataSetLayer,OleVariant(lyr)); //теперь ds != NULL
              lyr->Find->FindDataset = ds;


              Лена, об этом тебе уже писал Guest - пост № 78. Во второй строке ты пытаешься получить Датасет от слоя...
              В третьей строке - все вроде ОК, добавляешь Датасет именно в карту.
              А в четвертой - ИМХО явная лажа (ты методу присваиваешь свойство), тем более, что
              Цитата Лена @
              //цикл для теста
              for(int i = 1; i <= ds->Fields->Count; i++)
              {
              Param1.operator = (i);
              ShowMessage(ds->Fields->_Item(Param1)->Name);
              //здесь вижу все заголовки колонок таблицы
              }

              тестируешь ты именно ds - и все ОК. Так и попробуй Search для ds...а не для lyr
                ExpandedWrap disabled
                  void __fastcall TFStr_Search::Button2Click(TObject *Sender)
                  {
                    Table2->First();
                    OleVariant Param1, Param2;
                    AnsiString NAME = "_ROAD";
                    AnsiString Field = "ID";
                    Param1.operator =(NAME);
                    Param2.operator =(Field);
                   
                    //int x = Form1->Map1->DataSets->Count;
                   
                   CMapXLayer *  lyr = Form1->Map1->Layers->_Item(Param1);
                   CMapXDataset * ds = Form1->Map1->DataSets->_Item(Param1);
                   ds = Form1->Map1->DataSets->Add(miDataSetLayer,OleVariant(lyr));
                   lyr->Find->FindDataset = Form1->Map1->DataSets->_Item(Param1);
                   lyr->Find->FindField = ds->Fields->_Item(Param2);
                   
                  CMapXFindFeature *FoundObj;
                  FoundObj = lyr->Find->Search(WideString(Table2->FieldByName("ID")->AsString));
                    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"); //оказываюсь здесь
                    }
                   
                  }
                  Что содержит этот самый road.tab?
                    > ds = Form1->Map1->DataSets->Add(miDataSetLayer,OleVariant(lyr));
                    > lyr->Find->FindDataset = Form1->Map1->DataSets->_Item(Param1);
                    > lyr->Find->FindField = ds->Fields->_Item(Param2);

                    ds и Form1->Map1->DataSets->_Item(Param1) могут не совпасть

                    lyr->Find->FindDataset = Form1->Map1->DataSets->_Item(Param1);
                    lyr->Find->FindField = Form1->Map1->DataSets->_Item(Param1)->Fields->_Item(Param2);

                    или (наверно это лучше, если откомпилится)
                    lyr->Find->FindDataset = Form1->Map1->DataSets->_Item(Param1);
                    lyr->Find->FindField = lyr->Find->FindDataset->Fields->_Item(Param2);
                      >Что содержит этот самый road.tab?

                      Road.tab это карта c дорогами созданная в MapInfo. К карте привязаны индификаторы. Щелчок по карте показывает этот индификатор. Индификаторы которые привязаны к карте храняться в таблице dbf. В этой же таблице и названия улицы в другой колонке.
                      В первом Builder было так
                      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"], "" );


                      >ds и Form1->Map1->DataSets->_Item(Param1) могут не совпасть

                      Да. Похоже.
                      Буду пробывать.


                      Ну вот, только дошла до самого интересного, как руководство поручили срочно схемы рисовать в CorelDRAW для выставки! :(
                        Лена, вопрос на засыпку: зачем я указал третий параметр для функции Add?

                        Добавлено
                        Цитата Лена @
                        Road.tab это карта c дорогами созданная в MapInfo
                        Я знаю, что это такое, я умею читать документацию. Что конкретно он содержит?
                          Цитата trainer @
                          Лена, вопрос на засыпку: зачем я указал третий параметр для функции Add?

                          Я пробовала разные кол-во параметров и два и три. :(
                            Цитата Лена @
                            Адаптировала код от trainer не работает
                            не надо адаптировать, надо переписать как есть, обе функции.
                            И посмотрев, работает или не работает - уже адаптировать.

                            Добавлено
                            Цитата Лена @
                            Я пробовала разные кол-во параметров и два и три.
                            С двумы параметрами тот фрагмент не будет работать гарантированно.
                              Под словом адаптировала я имела в виду правку синтаксиса для MapX т.е. вместо Datasets писала DataSets (регистр). :)
                              Я еще раз все попробую.
                                Цитата Лена @
                                Road.tab это карта c дорогами созданная в MapInfo. К карте привязаны индификаторы. Щелчок по карте показывает этот индификатор. Индификаторы которые привязаны к карте храняться в таблице dbf. В этой же таблице и названия улицы в другой колонке.

                                road.tab - это не карта, карта - это все 4 файла road.XXX
                                ИМХО названия улиц хранятся в файле road.dat.А если нет, то что вообще хранится в DAT-файле?
                                Если MapInfo выводит всю информацию об объекте карты, то взять ее она может только из DAT-файла.
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0793 ]   [ 15 queries used ]   [ Generated: 18.07.25, 04:54 GMT ]