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

    иды наверное сидят в DAT-файле...опять к слову...
    Цитата Лена @
    CMapXDataset * ds = Form1->Map1->DataSets->_Item(Variant(1));
    ds = Form1->Map1->DataSets->Add(miDataSetLayer,Variant(lyr),Variant(lyr->Name));

    не совсем понятно, что делает вторая строчка, тем не менее ds - из карты, а не из внешней базы (dbf)
    Цитата Лена @
    for(int i = 1; i <= ds->Fields->Count; i++)
    {
    Param1.operator = (i);
    ShowMessage(ds->Fields->_Item(Param1)->Name);
    //Вижу все имена колонок из Table1. ID идет вторым.
    }

    следовательно - видишь ты поля из DAT-файла, Table1 тут ни при чем...
    Цитата Лена @
    lyr->Find->FindDataset = Form1->Map1->DataSets->_Item(Variant(1));

    по той же деревенской логике lyr->Find->FindDataset не может быть свойством на запись!!!
    сравни это с тем, что ты делала на полстраницы выше, где все было ОК:
    Цитата Лена @
    CMapXDataset * ds = Form1->Map1->DataSets->_Item(Variant(1));
      Цитата Лена @
      Теперь на форме к Table1 пристегнута эта же DBF таблица в режиме конструктора.
      А эта Table1 открыта не в монопольном режиме?
      И зачем эта Table1 вообще нужна?
        Цитата
        следовательно - видишь ты поля из DAT-файла, Table1 тут ни при чем...


        Это понятно. Просто комментарий написала не корректный.

        Цитата

        CMapXDataset * ds = Form1->Map1->DataSets->_Item(Variant(1));
        ds = Form1->Map1->DataSets->Add(miDataSetLayer,Variant(lyr),Variant(lyr->Name));
        не совсем понятно, что делает вторая строчка, тем не менее ds - из карты, а не из внешней базы (dbf)


        Слой имеет свой dataset, ведь данные в него были добавлены геокодированием на этапе разрабоки в MapInfo.
        Первая строка создает укзатель на данные этого слоя. Вторая строка инициализация.

        Цитата

        по той же деревенской логике lyr->Find->FindDataset не может быть свойством на запись!!!


        FindDataset это свойство. А что же записать в это свойство? :wall:
        Я по аналогии с Делфи писала.

        -юсртыхэю
        Цитата trainer @
        Цитата Лена @
        Теперь на форме к Table1 пристегнута эта же DBF таблица в режиме конструктора.
        А эта Table1 открыта не в монопольном режиме?
        И зачем эта Table1 вообще нужна?

        В дальнейшем Table1 буду использовать так:
        пользователю буде предоставлен столбец с названием улиц. Щелок по этой улице подставит в метод Seach ID из таблицы для поиска такого же ID на карте. И соотвественно пользователь увидет на карте, то что нужно.

        Что касается монопольного режима, то речь идет о свойстве Exlusive? Оно false.

        В коде который я привела дело не доходит до применения не посредственно Table1. Cпотыкаюсь на lyr->Find->FindDataset.
          Цитата Лена @
          В дальнейшем Table1 буду использовать так:
          пользователю буде предоставлен столбец с названием улиц. Щелок по этой улице подставит в метод Seach ID из таблицы для поиска такого же ID на карте. И соотвественно пользователь увидет на карте, то что нужно.

          Приплылиииии!
          Лена, есть понятие целостности данных в базах данных, коей в частности является МапИнфо. Представь ситуацию, что некто удалил (добавил)
          часть записей в DBF и забыл перелопатить карту (или действовал со злым умыслом)?
          Ты можешь средствами MapX получить из DAT-файла реальную (из карты) таблицу в удобном для юзера виде? Если да, то забудь ты про DBF.
            ExpandedWrap disabled
              CMapXLayer * lyr = Form1->Map1->Layers->_Item(Variant(1));
               
              if(lyr==NULL)
                {
                  ShowMessage("Нет слоя");
                  return;
                }
               
              CMapXDataset * ds = Form1->Map1->DataSets->_Item(Variant(1));
              ds = Form1->Map1->DataSets->Add(miDataSetLayer,Variant(lyr),Variant(lyr->Name));
               
              if(ds==NULL)
                {
                  ShowMessage("Проблема с dataset");
                  return;
                }
               
              Variant Param1;
              for(int i = 1; i <= ds->Fields->Count; i++)
                 {
                     Param1.operator = (i);
                   ShowMessage(ds->Fields->_Item(Param1)->Name);
                  //Вижу все имена из DAT файла ID идет вторым.
                 }
               
              int x = Form1->Map1->DataSets->Count; //здесь цифра 1
               
              lyr->Find->FindDataset = Form1->Map1->DataSets->_Item(Variant(1));
               
              if(lyr->Find->FindDataset==NULL)//всегда true


            Где в моем коде выше используется Table1? Нигде. MapX получает все из своих ресуров для поиска. Table1 будет использовать ниже в методе Seash, а до него я не дохожу.
              Цитата Лена @
              Где в моем коде выше используется Table1?

              НИГДЕ!!! Я не про код, а про сам подход к целостности данных!!! >:(
              А что касается кода, то вот это явно не то:
              Цитата Лена @
              lyr->Find->FindDataset = Form1->Map1->DataSets->_Item(Variant(1));

              у тебя уже есть ds, ранее добавленный в коллекцию наборов данных для этого слоя, ты из него можешь читать данные.
              Т.е. у твоего lyr в коллекции наборов данных уже есть набор, пристегнутый тобой, что-то типа lyr->DataSets[i]...
                Может надо добавить один из методов на рисунке? :wall:
                Прикреплённая картинка
                Прикреплённая картинка
                  Я бы попробовал так
                  ExpandedWrap disabled
                      FoundObj = ds->Search(.......);

                  причем Search и с одним параметром, и с двумя, и посмотрел бы, что в этом самом обже получится
                    Цитата Coala @
                    Я бы попробовал так
                    ExpandedWrap disabled
                        FoundObj = ds->Search(.......);

                    причем Search и с одним параметром, и с двумя, и посмотрел бы, что в этом самом обже получится

                    В прилагаемом мною рисунке (см.выше) метода Seach нет у ds.
                    Попытка написать FoundObj = ds-> сразу
                    [C++ Error] Unit1.cpp(1): Unable to invoke Code Completion due to errors in source code
                      Ага, там есть CMapXDataSet::get_Layer() и CMapXDataSet::Layer, возвращающие CMapXLayer - слой, связанный с этим ds
                      и что дальше :wall: :wall: :wall:
                        А у lyr->Find-> столько методов, что просто ужас! :blink:
                        см.рисунок
                        Прикреплённая картинка
                        Прикреплённая картинка
                          ЗАРАБОТАЛО!
                          Как выяснилось для Builder необходимым условием, в отличии от VBA, Делфи, VC, должно быть чтобы поле по которому искалась информация было ТОЛЬКО первым в файле DAT. В VBA, Делфи, VC можно вести поиск по любому полю в таблице (по первому, второму, третьему и т.д.)
                          Код ниже ищет нужную улицу. Поле, по которому идет поиск, перемещено в таблице на первое место:
                          Цитата

                          void __fastcall TForm1::Button1Click(TObject *Sender)
                          {
                          CMapXFindFeature *FoundObj =
                          Form1->Map1->Layers->_Item(OleVariant(1))->Find->Search(WideString("576090"));

                          if(FoundObj->FindRC % 10 == 1)
                          {
                          Form1->Map1->Zoom = 0.5;
                          Form1->Map1->CenterX = FoundObj->get_CenterX();
                          Form1->Map1->CenterY = FoundObj->get_CenterY();
                          }
                          else
                          {
                          ShowMessage(IntToStr(FoundObj->FindRC));
                          }

                          }

                          Этот же пример работает, например, в Делфи не взирая на то под каким номером идет поле.
                          Cпасибо всем за помощь и терпение! :)
                            Цитата Лена @
                            Как выяснилось для Builder необходимым условием, в отличии от VBA, Делфи, VC, должно быть чтобы поле по которому искалась информация было ТОЛЬКО первым в файле DAT.
                            Быть такого не может. Ну не знает MapInfo, на чем написан код, который его вызывает.
                            Лена, я со 101%-ной уверенностью заявляю, что этого быть не может. Проблема в чем-то другом. Например, в индексировании.
                              MapX 5.0
                              Делаю поиск в Делфи. Поле ID первоначально находиться в третей колонке. Все работает.
                              Пробую в Builder 6 не работает. В Builder 1.0 и MapX 3.0 работает.

                              Открываю слой с дорогами в MapInfo. Средствами MapInfo перемещаю ID на первое место, меняю тип с float на integer (хотя в Builder 1.0 и MapX 3.0 был float) и о чудо - поиск работает! Следовательно, Builder может искать ТОЛЬКО по KeyField которое находиться на первом месте в таблице. Думаю, что это можно назвать глюком Builder. Может, поэтому официально MapInfo не декларирует работу MapX в Builder 6 из-за наличия этих подводных камней.

                              Добавлено
                              Поиск средствами FindField и FindDataSet по-прежнему не работает. Явно проблема с адаптацией Builder для MapX.
                                Цитата Лена @
                                Следовательно, Builder может искать ТОЛЬКО по KeyField которое находиться на первом месте в таблице.
                                Builder ничего не ищет и не может искать. Он всего лишь среда разработки. Ищет код, написанный программистом, в данных, созданных пользователем.
                                Не стоит одушевлять программу.
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (10) « Первая ... 6 7 [8] 9 10  все


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