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

    В одной таблице dbf, например в одной из колонок данными могут быть пути на эти самые файлы TAB. В момент старта приложения я указываю MapX брать для загрузки слоев из этой колонки эти самые пути. MapX в цикле бежит по колонке в которой например такая запись С:/MYmap/road.map берет и загружает этот самый road.map затем переходит к другой записи. 48 записей 48 слоев получаю в MapX.
    Соответственно на форме обыкновенные Table1, Table2, … и их DataSourse. Соответственно есть и алиас в Builder для доступа к таблицам.

    Ниже код загрузки всех слоев:

    ExpandedWrap disabled
      void __fastcall TForm1::Button3Click(TObject *Sender)
      {
         DataModule1->Table5->First();
         AnsiString S;
         S = DataModule1->Table5->FieldValues["FILE"];
         OleVariant unusedParam,unusedParam1;
         unusedParam1.operator =(0);
         int i = 0;
        
          for(Cnt_Lyr=1; Cnt_Lyr<=DataModule1->Table5->RecordCount; Cnt_Lyr++)
                {
                unusedParam.operator =(S);
                Map1->Layers->Add(unusedParam, unusedParam1);
                Map1->DataSets->Add(miDataSetLayer,unusedParam);
                void __fastcall TForm1::Button3Click(TObject *Sender)
      {
         DataModule1->Table5->First();
         AnsiString S;
         S = DataModule1->Table5->FieldValues["FILE"];
         OleVariant unusedParam,unusedParam1, nusedParam2;
         unusedParam1.operator =(0);
         int i = 0;
        
          for(Cnt_Lyr=1; Cnt_Lyr<=DataModule1->Table5->RecordCount; Cnt_Lyr++)
                {
                unusedParam.operator =(S);
                Map1->Layers->Add(unusedParam, unusedParam1);
                Map1->DataSets->Add(miDataSetLayer,unusedParam);
                unusedParam2.operator =(Cnt_Lyr);
       
       
                //для проверки
                Layer[i] = Map1->Layers->_Item(unusedParam2);
                if(!Layer[i])//                {
       
                      Label1->Caption = S;
                      Application->MessageBox("Не загрузил...","Ошибка",MB_ICONEXCLAMATION);
                      //return;
       
                      }
       
                
       
                DataModule1->Table5->Next();
                S = DataModule1->Table5->FieldValues["FILE"];
                i++;
           }
      }
       
                //для проверки
                Layer[i] = Map1->Layers->_Item(unusedParam2);
                if(!Layer[i])//                {
       
                      Label1->Caption = S;
                      Application->MessageBox("Не загрузил...","Ошибка",MB_ICONEXCLAMATION);
                      //return;
       
                      }
       
                
       
                DataModule1->Table5->Next();
                S = DataModule1->Table5->FieldValues["FILE"];
                i++;
           }
      }


    Добавлено
    Лишнее скопировла в код, но общий смысл должен быть понятен.

    Добавлено
    без лишнего
    ExpandedWrap disabled
      void __fastcall TForm1::Button3Click(TObject *Sender)
      {
         DataModule1->Table5->First();
         AnsiString S;
         S = DataModule1->Table5->FieldValues["FILE"];
         OleVariant unusedParam,unusedParam1, unusedParam2;
         unusedParam1.operator =(0);
         int i = 0;
        
          for(Cnt_Lyr=1; Cnt_Lyr<=DataModule1->Table5->RecordCount; Cnt_Lyr++)
                {
                unusedParam.operator =(S);
                Map1->Layers->Add(unusedParam, unusedParam1);
                Map1->DataSets->Add(miDataSetLayer,unusedParam);
                unusedParam2.operator =(Cnt_Lyr);
       
       
                //для проверки
                Layer[i] = Map1->Layers->_Item(unusedParam2);
                if(!Layer[i])//                {
       
                      Label1->Caption = S;
                      Application->MessageBox("Не загрузил...","Ошибка",MB_ICONEXCLAMATION);
                      //return;
       
                      }
       
                
       
                DataModule1->Table5->Next();
                S = DataModule1->Table5->FieldValues["FILE"];
                i++;
           }
      }
    Сообщение отредактировано: Лена -
      Если я правильно понял, то DBF по большому счету ни при чем.
      Ты считываешь имена файлов (MAP или TAB, у тебя в посте нестыковочка) и подставляешь их в MapX (добавляешь слои в карту).
      Вопрос:
      Цитата Лена @
      Map1->DataSets->Add(miDataSetLayer,unusedParam);

      - кто такой miDataSetLayer
        >- кто такой miDataSetLayer

        Type of Dataset being added takes a DatasetTypeConstants value.
        typedef enum DatasetTypeConstants
        {
        miDataSetDAO = 1,
        miDataSetODBC = 2,
        miDataSetUnbound = 3,
        miDataSetGlobalHandle = 4,
        miDataSetOLEData = 5,
        miDataSetLayer = 6,
        miDataSetNotesView = 7,
        miDataSetNotesQuery = 8,
        miDataSetSafeArray = 9,
        miDataSetDelphi = 1010,
        miDataSetDelphi4 = 1011,
        miDataSetDelphi5 = 1012,
        miDataSetDelphi6 = 1013,
        miDataSetADO = 12,
        miDataSetRDO = 13,
        miDatasetXML = 14,
        miDataSetOCI = 15
        } DatasetTypeConstants;

        больше в справке ничего нет.

        Добавлено
        Может мне выложить help файл для MapX5.0 на ftp сервере? Он 2.6 Мг.
          Цитата Лена @
          Map1->DataSets->Add(miDataSetLayer,unusedParam);

          Ага, ты добавляешь в коллекцию наборов данных именно слой с именем файла из DBF в unusedParam - кстати, все-таки MAP-файл, DAT-файл или TAB-файл?
            S = DataModule1->Table5->FieldValues["FILE"];
            unusedParam.operator =(S);
            Map1->Layers->Add(unusedParam, unusedParam1);
            В поле FILE строки типа С:/MYmap/road.map, С:/MYmap/building.map... соотвествнно MapX добовляет road.map, building.map и т.д.
              Цитата Лена @
              соотвествнно MapX добовляет road.map, building.map и т.д.

              Yes, mam!!!
              А кто добавляет саму семантику из DAT-файлов??? :wall:
              Лена, если ты после такой загрузки видишь в среде MapInfo карту, то выдает ли MapInfo информацию по ее объектам?
                Цитата Coala @
                MapInfo карту, то выдает ли MapInfo информацию по ее объектам?

                Да. MapX все показывает. Вижу все 48 карт.
                Код ниже позволяет посмотреть что находиться в MapX
                ExpandedWrap disabled
                  void __fastcall TForm1::Button1Click(TObject *Sender)
                  {
                   OleVariant unusedParam;
                   Map1->Layers->LayersDlg(unusedParam,unusedParam);
                   int kol = Map1->Layers->Count;
                   Label1->Caption = "Всего слоев: " + IntToStr(kol);
                  }


                Добавлено
                В моем примере осталось правильно сформировать метод Add.
                  Цитата Лена @
                  Да. MapX все показывает. Вижу все 48 карт.

                  Я не это спрашиваю...
                  В MapInfo в тулбаре Операции нажми на кнопочку i и ткни мышой в любой объект карты...
                    Да, конечно показывает. Открыла карту _ROAD. При шелчке получаю окно с информацией какое ID. Карты все рабочие, из раннего приложения.
                      Ну если действительно есть вся информация по ОБЪЕКТУ (как на рисунке), то ты где-то рядом...
                      Прикреплённая картинка
                      Прикреплённая картинка
                        Цитата Coala @
                        Ну если действительно есть вся информация по ОБЪЕКТУ (как на рисунке), то ты где-то рядом...

                        Да. У меня примерно так. Только еще пункт ID присуствует.
                          Все подводные камни проверили, остался последний - Search :wall:
                            C Seach у нас тоже порядок. Осталось прицепить к слою DataSets. Ведь не даром мне раньше написали о моем коде, когда не было в нем метода 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

                            Теперь у меня так:
                            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);
                               
                               Form1->Map1->DataSets->Add(miDataSetLayer,Param1); //проблема! Должно быть что-то типа Form1->Map1->DataSets->Add(miDataSetLayer,lyr,lyr->name);?
                               lyr->Find->FindDataset = Form1->Map1->DataSets->_Item(Param1);
                               CMapXDataset *ds = Form1->Map1->DataSets->_Item(Param1);
                               
                              //цикл для теста в коде он не нужен
                              for(int i = 1; i <= ds->Fields->Count; i++)
                                {
                                  Param1.operator = (i);
                                  ShowMessage(ds->Fields->_Item(Param1)->Name);
                                  
                                }
                               
                              lyr->Find->FindField = ds->Fields->_Item(Param2);
                               
                              CMapXFindFeature *FoundObj;
                              FoundObj = lyr->get_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");
                                }
                               
                              }
                              Цитата Лена @
                              У него не установлен MapX но на основании его рекомендаций у меня получился новый код.
                              У меня он не только не установлен, я вообще никогда не работал с картографической информацией и в живую MapX и подобные не видел. :D

                              Цитата Лена @
                              trainer объясните, что зачем буква L перед кавычками в строке _Item(OleVariant(L"_ROAD"))?
                              L"_ROAD" - это строка в кодировке Unicode - каждый символ имеет тип не char, а wchar_t. Можно также писать OLETEXT("_ROAD")

                              Так что показал мой код?

                              Поле FILE таблицы DataModule1->Table5 содержит путь к MAP- или DBF-файлу?

                              Добавлено
                              Цитата Лена @
                              If you issue Map1.Datasets.Count, does it return a number greater than 0?
                              Это практически то же самое, что и должен делать приведенный мною код в Поиск объекта (сообщение #848560), только для конкретного слоя. Я так понимаю, что я зря все это пишу.
                                Код с буквой L не работал, а так работает, но пишет, что слой не имеет источника данных.

                                ExpandedWrap disabled
                                  void __fastcall TForm1::Button5Click(TObject *Sender)
                                  {
                                   
                                    OleVariant Param1;
                                    AnsiString NAME = "_ROAD";
                                    Param1.operator =(NAME);
                                     CMapXDatasets * layer_datasets = Form1->Map1->Layers->_Item(Param1)->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);
                                     }
                                   
                                   
                                  }


                                Строка: long x = Form1->Map1->DataSets->Count; возвращает 0

                                Поле FILE таблицы DataModule1->Table5->FieldValues["FILE"]; содержит путь к TAB файлам карт.
                                Так организовала всю загрузку карт:
                                ExpandedWrap disabled
                                  void __fastcall TForm1::Button3Click(TObject *Sender)
                                  {
                                     DataModule1->Table5->First();
                                     AnsiString S;
                                     S = DataModule1->Table5->FieldValues["FILE"];
                                     OleVariant unusedParam,unusedParam1,unusedParam2;
                                     unusedParam1.operator =(0);
                                     int i = 0;
                                    
                                      for(Cnt_Lyr=1; Cnt_Lyr<=DataModule1->Table5->RecordCount; Cnt_Lyr++)
                                            {
                                            unusedParam.operator =(S);
                                            Map1->Layers->Add(unusedParam, unusedParam1);
                                            Map1->DataSets->Add(miDataSetLayer,unusedParam);// значит тут тоже проблема
                                            unusedParam2.operator =(Cnt_Lyr);
                                   
                                   
                                            //тест
                                            Layer[i] = Map1->Layers->_Item(unusedParam2);
                                            if(!Layer[i])
                                                 {
                                   
                                                  Label1->Caption = S;
                                                  Application->MessageBox("Не загрузил...","Ошибка",MB_ICONEXCLAMATION);
                                                
                                                  }
                                   
                                            AnsiString id = "_ROAD";
                                            String sid = String(id);
                                            WideString wsid = WideString(sid);
                                            if(WideString(Layer[i]->Name) == wsid)
                                                 {
                                   
                                                  Label5->Caption = IntToStr(i);
                                                  Application->MessageBox("Слой _ROAD","Проверка",MB_ICONEXCLAMATION);
                                                
                                                  }          
                                            DataModule1->Table5->Next();
                                            S = DataModule1->Table5->FieldValues["FILE"];
                                            i++;
                                       }
                                  }

                                Буду разбираться с Map1->DataSets->Add(miDataSetLayer,unusedParam); этого кода чтобы увидеть осмысленное число в long x = Form1->Map1->DataSets->Count;

                                Добавлено
                                Похоже надо так организовать подгрузку данных:
                                ExpandedWrap disabled
                                  CMapXLayer * LYR[100];
                                  LYR[0] =  Map1->Layers->Add(unusedParam, unusedParam1);
                                  Map1->DataSets->Add(miDataSetLayer,Variant(LYR[0]));


                                Сейчас все проверю. Сообщу.

                                Добавлено
                                YES!!!
                                Код выше показал, что x стал 48. Иду дальше! :)
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (10) « Первая ... 3 4 [5] 6 7 ...  9 10 все


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