
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.3] |
![]() |
|
Страницы: (10) « Первая ... 6 7 [8] 9 10 все ( Перейти к последнему сообщению ) |
Сообщ.
#106
,
|
|
|
иды наверное сидят в 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 не может быть свойством на запись!!! сравни это с тем, что ты делала на полстраницы выше, где все было ОК: |
Сообщ.
#107
,
|
|
|
А эта Table1 открыта не в монопольном режиме?
И зачем эта Table1 вообще нужна? |
Сообщ.
#108
,
|
|
|
Цитата следовательно - видишь ты поля из 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 это свойство. А что же записать в это свойство? ![]() Я по аналогии с Делфи писала. -юсртыхэю Цитата trainer @ А эта Table1 открыта не в монопольном режиме? И зачем эта Table1 вообще нужна? В дальнейшем Table1 буду использовать так: пользователю буде предоставлен столбец с названием улиц. Щелок по этой улице подставит в метод Seach ID из таблицы для поиска такого же ID на карте. И соотвественно пользователь увидет на карте, то что нужно. Что касается монопольного режима, то речь идет о свойстве Exlusive? Оно false. В коде который я привела дело не доходит до применения не посредственно Table1. Cпотыкаюсь на lyr->Find->FindDataset. |
Сообщ.
#109
,
|
|
|
Цитата Лена @ В дальнейшем Table1 буду использовать так: пользователю буде предоставлен столбец с названием улиц. Щелок по этой улице подставит в метод Seach ID из таблицы для поиска такого же ID на карте. И соотвественно пользователь увидет на карте, то что нужно. Приплылиииии! Лена, есть понятие целостности данных в базах данных, коей в частности является МапИнфо. Представь ситуацию, что некто удалил (добавил) часть записей в DBF и забыл перелопатить карту (или действовал со злым умыслом)? Ты можешь средствами MapX получить из DAT-файла реальную (из карты) таблицу в удобном для юзера виде? Если да, то забудь ты про DBF. |
Сообщ.
#110
,
|
|
|
![]() ![]() 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, а до него я не дохожу. |
Сообщ.
#111
,
|
|
|
Цитата Лена @ Где в моем коде выше используется Table1? НИГДЕ!!! Я не про код, а про сам подход к целостности данных!!! ![]() А что касается кода, то вот это явно не то: Цитата Лена @ lyr->Find->FindDataset = Form1->Map1->DataSets->_Item(Variant(1)); у тебя уже есть ds, ранее добавленный в коллекцию наборов данных для этого слоя, ты из него можешь читать данные. Т.е. у твоего lyr в коллекции наборов данных уже есть набор, пристегнутый тобой, что-то типа lyr->DataSets[i]... |
Сообщ.
#112
,
|
|
|
Сообщ.
#113
,
|
|
|
Я бы попробовал так
![]() ![]() FoundObj = ds->Search(.......); причем Search и с одним параметром, и с двумя, и посмотрел бы, что в этом самом обже получится |
Сообщ.
#114
,
|
|
|
Цитата Coala @ Я бы попробовал так ![]() ![]() FoundObj = ds->Search(.......); причем Search и с одним параметром, и с двумя, и посмотрел бы, что в этом самом обже получится В прилагаемом мною рисунке (см.выше) метода Seach нет у ds. Попытка написать FoundObj = ds-> сразу [C++ Error] Unit1.cpp(1): Unable to invoke Code Completion due to errors in source code |
Сообщ.
#115
,
|
|
|
Ага, там есть CMapXDataSet::get_Layer() и CMapXDataSet::Layer, возвращающие CMapXLayer - слой, связанный с этим ds
и что дальше ![]() ![]() ![]() |
Сообщ.
#116
,
|
|
|
Сообщ.
#117
,
|
|
|
ЗАРАБОТАЛО!
Как выяснилось для 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пасибо всем за помощь и терпение! ![]() |
Сообщ.
#118
,
|
|
|
Цитата Лена @ Быть такого не может. Ну не знает MapInfo, на чем написан код, который его вызывает.Как выяснилось для Builder необходимым условием, в отличии от VBA, Делфи, VC, должно быть чтобы поле по которому искалась информация было ТОЛЬКО первым в файле DAT. Лена, я со 101%-ной уверенностью заявляю, что этого быть не может. Проблема в чем-то другом. Например, в индексировании. |
Сообщ.
#119
,
|
|
|
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. |
Сообщ.
#120
,
|
|
|
Цитата Лена @ Builder ничего не ищет и не может искать. Он всего лишь среда разработки. Ищет код, написанный программистом, в данных, созданных пользователем.Следовательно, Builder может искать ТОЛЬКО по KeyField которое находиться на первом месте в таблице. Не стоит одушевлять программу. |