
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.30] |
![]() |
|
Страницы: (10) « Первая ... 4 5 [6] 7 8 ... Последняя » все ( Перейти к последнему сообщению ) |
Сообщ.
#76
,
|
|
|
Опытным путем пришла к такому коду, естественно он с моей ошибкой
![]() ![]() ![]() 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 но тоже не помогает. Прикреплённая картинка
|
Сообщ.
#77
,
|
|
|
Цитата Лена @ И не поможет. Т.к. FindRC и get_FindRC - фактически одно и то же.ОШИБКА!!! Получить возвращаемое значение никак не удается! Метод get_FindRC не помогает. Очевидно, что должно быть примерно так. Загрузка слоев: ![]() ![]() 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(); } } Поиск: ![]() ![]() 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) Возможно, что некоторые действия можно не повторять каждый раз, а вынести из поиска в загрузку. |
Сообщ.
#78
,
|
|
|
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 говорит дело! В первом случае получаем Датасет из коллекции Датасетов некоторого слоя, а во втором - из коллекции Датасетов карты! |
Сообщ.
#80
,
|
|
|
Адаптировала код от trainer не работает:
![]() ![]() 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 { .... } Мой новый код тоже на работает, хотя выглядит все правильно: ![]() ![]() 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 ![]() Прикреплённая картинка
|
Сообщ.
#81
,
|
|
|
Цитата Лена @ 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 |
Сообщ.
#82
,
|
|
|
![]() ![]() 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"); //оказываюсь здесь } } |
Сообщ.
#83
,
|
|
|
Что содержит этот самый road.tab?
|
Сообщ.
#84
,
|
|
|
> 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); |
Сообщ.
#85
,
|
|
|
>Что содержит этот самый 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 для выставки! ![]() |
Сообщ.
#86
,
|
|
|
Лена, вопрос на засыпку: зачем я указал третий параметр для функции Add?
Добавлено Цитата Лена @ Я знаю, что это такое, я умею читать документацию. Что конкретно он содержит? Road.tab это карта c дорогами созданная в MapInfo |
Сообщ.
#87
,
|
|
|
Цитата trainer @ Лена, вопрос на засыпку: зачем я указал третий параметр для функции Add? Я пробовала разные кол-во параметров и два и три. ![]() |
Сообщ.
#88
,
|
|
|
Цитата Лена @ не надо адаптировать, надо переписать как есть, обе функции.Адаптировала код от trainer не работает И посмотрев, работает или не работает - уже адаптировать. Добавлено Цитата Лена @ С двумы параметрами тот фрагмент не будет работать гарантированно. Я пробовала разные кол-во параметров и два и три. |
Сообщ.
#89
,
|
|
|
Под словом адаптировала я имела в виду правку синтаксиса для MapX т.е. вместо Datasets писала DataSets (регистр).
![]() Я еще раз все попробую. |
Сообщ.
#90
,
|
|
|
Цитата Лена @ Road.tab это карта c дорогами созданная в MapInfo. К карте привязаны индификаторы. Щелчок по карте показывает этот индификатор. Индификаторы которые привязаны к карте храняться в таблице dbf. В этой же таблице и названия улицы в другой колонке. road.tab - это не карта, карта - это все 4 файла road.XXX ИМХО названия улиц хранятся в файле road.dat.А если нет, то что вообще хранится в DAT-файле? Если MapInfo выводит всю информацию об объекте карты, то взять ее она может только из DAT-файла. |