
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.30] |
![]() |
|
Страницы: (10) « Первая ... 3 4 [5] 6 7 ... 9 10 все ( Перейти к последнему сообщению ) |
Сообщ.
#61
,
|
|
|
В одной таблице dbf, например в одной из колонок данными могут быть пути на эти самые файлы TAB. В момент старта приложения я указываю MapX брать для загрузки слоев из этой колонки эти самые пути. MapX в цикле бежит по колонке в которой например такая запись С:/MYmap/road.map берет и загружает этот самый road.map затем переходит к другой записи. 48 записей 48 слоев получаю в MapX. Соответственно на форме обыкновенные Table1, Table2, … и их DataSourse. Соответственно есть и алиас в Builder для доступа к таблицам. Ниже код загрузки всех слоев: ![]() ![]() 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++; } } Добавлено Лишнее скопировла в код, но общий смысл должен быть понятен. Добавлено без лишнего ![]() ![]() 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++; } } |
Сообщ.
#62
,
|
|
|
Если я правильно понял, то DBF по большому счету ни при чем.
Ты считываешь имена файлов (MAP или TAB, у тебя в посте нестыковочка) и подставляешь их в MapX (добавляешь слои в карту). Вопрос: Цитата Лена @ Map1->DataSets->Add(miDataSetLayer,unusedParam); - кто такой miDataSetLayer |
Сообщ.
#63
,
|
|
|
>- кто такой 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 Мг. |
Сообщ.
#64
,
|
|
|
Цитата Лена @ Map1->DataSets->Add(miDataSetLayer,unusedParam); Ага, ты добавляешь в коллекцию наборов данных именно слой с именем файла из DBF в unusedParam - кстати, все-таки MAP-файл, DAT-файл или TAB-файл? |
Сообщ.
#65
,
|
|
|
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 и т.д. |
Сообщ.
#66
,
|
|
|
Цитата Лена @ соотвествнно MapX добовляет road.map, building.map и т.д. Yes, mam!!! А кто добавляет саму семантику из DAT-файлов??? ![]() Лена, если ты после такой загрузки видишь в среде MapInfo карту, то выдает ли MapInfo информацию по ее объектам? |
Сообщ.
#67
,
|
|
|
Цитата Coala @ MapInfo карту, то выдает ли MapInfo информацию по ее объектам? Да. MapX все показывает. Вижу все 48 карт. Код ниже позволяет посмотреть что находиться в MapX ![]() ![]() void __fastcall TForm1::Button1Click(TObject *Sender) { OleVariant unusedParam; Map1->Layers->LayersDlg(unusedParam,unusedParam); int kol = Map1->Layers->Count; Label1->Caption = "Всего слоев: " + IntToStr(kol); } Добавлено В моем примере осталось правильно сформировать метод Add. |
Сообщ.
#68
,
|
|
|
Цитата Лена @ Да. MapX все показывает. Вижу все 48 карт. Я не это спрашиваю... В MapInfo в тулбаре Операции нажми на кнопочку i и ткни мышой в любой объект карты... |
Сообщ.
#69
,
|
|
|
Да, конечно показывает. Открыла карту _ROAD. При шелчке получаю окно с информацией какое ID. Карты все рабочие, из раннего приложения.
|
Сообщ.
#70
,
|
|
|
Сообщ.
#71
,
|
|
|
Цитата Coala @ Ну если действительно есть вся информация по ОБЪЕКТУ (как на рисунке), то ты где-то рядом... Да. У меня примерно так. Только еще пункт ID присуствует. |
Сообщ.
#72
,
|
|
|
Все подводные камни проверили, остался последний - Search
![]() |
Сообщ.
#73
,
|
|
|
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 Теперь у меня так: ![]() ![]() 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"); } } |
Сообщ.
#74
,
|
|
|
Цитата Лена @ У меня он не только не установлен, я вообще никогда не работал с картографической информацией и в живую MapX и подобные не видел. У него не установлен MapX но на основании его рекомендаций у меня получился новый код. ![]() Цитата Лена @ L"_ROAD" - это строка в кодировке Unicode - каждый символ имеет тип не char, а wchar_t. Можно также писать OLETEXT("_ROAD")trainer объясните, что зачем буква L перед кавычками в строке _Item(OleVariant(L"_ROAD"))? Так что показал мой код? Поле FILE таблицы DataModule1->Table5 содержит путь к MAP- или DBF-файлу? Добавлено Цитата Лена @ Это практически то же самое, что и должен делать приведенный мною код в Поиск объекта (сообщение #848560), только для конкретного слоя. Я так понимаю, что я зря все это пишу. If you issue Map1.Datasets.Count, does it return a number greater than 0? |
Сообщ.
#75
,
|
|
|
Код с буквой L не работал, а так работает, но пишет, что слой не имеет источника данных.
![]() ![]() 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 файлам карт. Так организовала всю загрузку карт: ![]() ![]() 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; Добавлено Похоже надо так организовать подгрузку данных: ![]() ![]() CMapXLayer * LYR[100]; LYR[0] = Map1->Layers->Add(unusedParam, unusedParam1); Map1->DataSets->Add(miDataSetLayer,Variant(LYR[0])); Сейчас все проверю. Сообщу. Добавлено YES!!! Код выше показал, что x стал 48. Иду дальше! ![]() |