
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.121] |
![]() |
|
Страницы: (10) « Первая ... 2 3 [4] 5 6 ... 9 10 все ( Перейти к последнему сообщению ) |
Сообщ.
#46
,
|
|
|
Coala, кончай нести чушь и запутывать Лену.
Лена, слой "_ROAD" индексирован? И это точно он содержит улицы? На всякий случай: road по-английски - дорога, улица - street. Хотя, конечно, при создании слоя его могли назвать как угодно. ![]() Добавлено Ни то, ни другое. Объект, инкапсулирующий VARIANT, изначально создается пустым. В первом случае IsNull() не делает никаких осмысленных действий, во втором - объект получает значение "пустая строка". Unassigned и пустая строка, строго говоря - разные значения(хотя конкретный компонент может интерпретировать их одинаково). Добавлено И почему все время параметры называются "Неиспользуемый параметр"(unusedParam)? Чтобы врагов запутать? ![]() Добавлено Если FindRC действительно возвращает -3, то это какая-то недокументированная ошибка(или случайное значение), ибо это не соответствует ни одному из кодов результата операции поиска или коду ошибки. |
Сообщ.
#47
,
|
|
|
Цитата trainer @ Coala, кончай нести чушь и запутывать Лену. Look at yourself ![]() Оба на кофейной гуще гадаем... |
Сообщ.
#48
,
|
|
|
Всем мои извинения...малость погавкались...
Цитата trainer @ Если FindRC действительно возвращает -3, то это какая-то недокументированная ошибка(или случайное значение), ибо это не соответствует ни одному из кодов результата операции поиска или коду ошибки. Тут trainer прав. Поэтому (может быть, я уже всех достал), но возникает два вопроса - что возвращает строка Цитата Лена @ FoundObj = Form1->Map1->Layers->_Item(unusedParam1)->get_Find()->Search(WideString(Table2->FieldByName("ID")->AsString),unusedParam2); т.е. что именно сидит в FoundObj - есть ли что-нибудь в хелпах по поводу кодов ошибок ----------------------------- Второй параметр Search - TNoParam() определен в utilcls.h Можно попробовать следующее ![]() ![]() // в хидере TNoParam * prm; // в FormCreate prm = new TNoParam(); ..... ...->Search(wide_string.bstr(), prm); |
Сообщ.
#49
,
|
|
|
Мне кажется, что я сейчас выкладываю код самый близкий к правильному. В нем ошибка. Если есть мысли, подскажите как ее обойти.
![]() ![]() void __fastcall TFStr_Search::Button2Click(TObject *Sender) { OleVariant Param1; Param1.operator =(48); //номер слоя CMapXLayer * lyr; CMapXDataset *ds; Table2->First(); lyr = Form1->Map1->Layers->_Item(Param1); lyr->Name; //просто проверка в точке отстановки, все нормально /* from Delhi lyr, ds: variant; ds := Map1.Datasets.Item[findDataset.text]; lyr.Find.FindDataset := Map1.Datasets.Item[findDataset.text]; lyr.Find.FindField := ds.Fields.Item[findField.text]; Где findDataset, findDataset, findField, FindItem это тексты из ComboBox примера. я не могу объявить lyr, ds как Variant, потому что не смогу строить цепочку lyr-> */ //подготовка lyr для последующего вызова Search по аналогии c Делфи ds = Form1->Map1->DataSets->_Item(Param1); //здесь в точке останова ds = NULL?! lyr->Find->FindDataset = Form1->Map1->DataSets->_Item(Param1); lyr->Find->FindField = ds->Fields->_Item(Param1); //ds = NULL поэтому исключение. Ошибка только во время выполнения. //код ниже, по моему мнению, правильный CMapXFindFeature* feature; CMapXLayerFind* lfind = lyr->get_Find(); if(lfind!=NULL) { feature = lfind->Search(WideString(Table2->FieldByName("ID")->AsString).c_bstr()); } if(feature!=NULL) { WideString Name = feature ->get_Name(); Form1->Label5->Caption = Name; } if (feature ->FindRC % 10 == 1) { ShowMessage("Yes"); Form1->Map1->Zoom = 30; Form1->Map1->CenterX = feature ->get_CenterX(); Form1->Map1->CenterY = feature ->get_CenterY(); } else { ShowMessage("No"); } }// конец обработчика Как правильно реализовать эту строчку: ds = Form1->Map1->DataSets->_Item(Param1);? Даже если жестко прописывать значение из базы данных, все равно ds = NULL. Строка явно не правильно мною сформирована. Самая главная просьба - не сортесь, пожалуйста, из-за этого не победимого MapX! ![]() |
Сообщ.
#50
,
|
|
|
Цитата Лена @ Самая главная просьба - не сортесь, пожалуйста, из-за этого не победимого MapX! Мы постараемся, главная проблема в том, что мы не можем смоделировать твою ситуацию - поэтому и (мягко говоря) гадаем... Все-таки попробуй ввести в Search 2 параметра - как я написал в посте № 48... |
Сообщ.
#51
,
|
|
|
Думаю в ds = Form1->Map1->DataSets->_Item(Param1); надо передать не Param1, а значение из базы данных, но пока не соображу как.
-юсртыхэю Цитата Coala @ Цитата Лена @ Самая главная просьба - не сортесь, пожалуйста, из-за этого не победимого MapX! Мы постараемся, главная проблема в том, что мы не можем смоделировать твою ситуацию - поэтому и (мягко говоря) гадаем... Все-таки попробуй ввести в Search 2 параметра - как я написал в посте № 48... Я уже пробывала и два и один. Мне кажется lyr не готов к вызову Seach. lyr-у надо предварительно указать поле из базы данных, чего раньше я не делала. И затем Seach по текущей записи в этом поле найдет, то что нужно. В коде выше я пытаюсь подготовить слой lyr. |
Сообщ.
#52
,
|
|
|
Цитата Лена @ Я уже пробывала и два я имел ввиду второй параметр класса TNoParam() - как в вызове метода, описанном в MapXLib_TLB.h |
Сообщ.
#53
,
|
|
|
Посмотрите как основательно готовиться в ранней версии Builder вызов метода Seach
![]() ![]() Variant l_A, ds_A, find; 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"], "" ); инициализируется Dataset у слоя (в данном случае роль слоя это l_A) и приписывается поле ID через Fields и только после этого вызывается "Search" для текущей записи. Все мои Search раньше ничего не находили и не найдут потому что поиск мною был не поготовлен для lyr. Я попробую ![]() ![]() // в хидере TNoParam * prm; // в FormCreate prm = new TNoParam(); ..... ...->Search(wide_string.bstr(), prm); но не найдет. lyr не готов. |
Сообщ.
#54
,
|
|
|
Цитата Лена @ ds = Form1->Map1->DataSets->_Item(Param1); //здесь в точке останова ds = NULL?! По идее, у Map->DataSets должно быть свойство Count (в общем, количество этих самых доступных ДатаСетов), посмотри в отладчике чему оно равно... |
Сообщ.
#55
,
|
|
|
Цитата Лена @ Насколько я понимаю, 48-й набор данных не обязан быть источником данных для 48-го слоя. Точно также, как и слой "_ROAD" может иметь набор данных с другим именем. Слой может вообще не иметь набора данных или иметь несколько наборов данных.ds = Form1->Map1->DataSets->_Item(Param1); //здесь в точке останова ds = NULL?! Проверять надо через Form1->Map1->Layers->_Item(OleVariant(L"_ROAD"))->DataSets; |
Сообщ.
#56
,
|
|
|
Да все правильно, очевидно слой не содержит данных раз ds=NULL.
Но я не соображу, что поменять в коде ниже исходя из вашего совета? ![]() ![]() void __fastcall TFStr_Search::Button2Click(TObject *Sender) { OleVariant Param1, Param2; AnsiString NAME = "_ROAD"; AnsiString Field = "ID"; Param1.operator =(NAME);//имя слоя Param2.operator =(Field); //имя колонки в таблице CMapXLayer * lyr; CMapXDataset *ds; Table1->First(); lyr = Form1->Map1->Layers->_Item(Param1); //lyr->Name; //для проверки ОК ds = Form1->Map1->DataSets->_Item(Param1);//что тут написать? как привизать данные к lyr? lyr->Find->FindDataset = Form1->Map1->DataSets->_Item(Param1); lyr->Find->FindField = ds->Fields->_Item(Param2); CMapXFindFeature* feature; CMapXLayerFind* lfind = lyr->get_Find(); if(lfind!=NULL) { feature = lfind->Search(WideString(Table1->FieldByName("ID")->AsString).c_bstr()); } if (feature ->FindRC % 10 == 1) { ShowMessage("Yes"); Form1->Map1->Zoom = 30; Form1->Map1->CenterX = feature ->get_CenterX(); Form1->Map1->CenterY = feature ->get_CenterY(); } else { ShowMessage("No"); } } |
Сообщ.
#57
,
|
|
|
Цитата Лена @ Я не знаю деталей реализации. Например, что из себя представляет источник данных? DAO? ADO? ODBC? RDO? Lotus Notes? OLE? Что-то еще?Но я не соображу, что поменять в коде ниже исходя из вашего совета? Для начала: ![]() ![]() void __fastcall TFStr_Search::Button2Click(TObject *Sender) CMapXDatasets * layer_datasets = Form1->Map1->Layers->_Item(OleVariant(L"_ROAD"))->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); } } |
![]() |
|
|
Это - начало заголовка WOR-файла MapInfo:
!Workspace !Version 600 !Charset WindowsCyrillic Open Table "гидрография_L" As гидрография_L Open Table "растительность_A" As растительность_A Open Table "дорожная_сеть_L" As дорожная_сеть_L и т.д.... при этом все данные слоя/таблицы хранятся в файлах tab_name.DAT, .ID, .MAP, .TAB. Для этого набора данных MapInfo в диалоге Карта->Управление слоями дает такую последовательность: косметический слой дорожная_сеть_L гидрография_L растительность_A Вывод - не факт, что слой с номером N из диалога связан с таблицей под таким же номером... Далее - наличие косметического слоя (в AutoCAD это системный, неудаляемый и т.д.). Не надо ли учитывать его наличие при индексировании слоев? Цитата trainer @ Например, что из себя представляет источник данных? DAO? ADO? ODBC? RDO? Lotus Notes? OLE? Что-то еще? trainer, очевидно, что-то еще...Самодельное от разработчиков MapX... Лена, запусти тест trainer из предыдущего поста, возможно, появится ясность... ............ ![]() задал справедливый вопрос ![]() |
Сообщ.
#59
,
|
|
|
trainer и Coala спасибо за помощь!
По-моему мы все в шаге от Нобелевской премии за попытку разобраться как работает MapX в среде C++ Builder ![]() Мне кажется, что в данный момент на просторах CНГ только я одна работаю с MapX в Builder ![]() Источник данных BDE таблицы dbf. trainer объясните, что зачем буква L перед кавычками в строке _Item(OleVariant(L"_ROAD"))? Прежде чем тестировать, хочу понять сам код. Наш с вами топик внимательно читал еще один человек. Я получила от него письмо. У него не установлен MapX но на основании его рекомендаций у меня получился новый код. Мне кажется я в шаге от решения: ![]() ![]() void __fastcall TFStr_Search::Button2Click(TObject *Sender) { Table2->First(); OleVariant Param1; AnsiString NAME = "_ROAD"; Param1.operator =(NAME); //имя слоя CMapXLayer * lyr; lyr = Form1->Map1->Layers->_Item(Param1); //ЕСЛИ НЕТ БАЗЫ ДАННЫХ, ПОИСК БЕСПОЛЕЗЕН, НИЧЕГО НЕ НАЙДЕТ //ПОЭТОМУ СОЗДАЕТСЯ БАЗА ДАННЫХ ДЛЯ ТОГО СЛОЯ В КОТОРОМ БУДЕТ ПОИСК Form1->Map1->DataSets->Add(miDataSetLayer, lyr, Param1); //здесь у меня ошибка, надо не CMapXLayer а вариант для второго параметра lyr->Find->FindDataset = Form1->Map1->DataSets->_Item(Param1);//заносим в lyr CMapXDataset *ds = Form1->Map1->DataSets->_Item(Param1); //цикл для теста for(int i = 1; i <= ds->Fields->Count; i++) { ShowMessage(ds->Fields->_Item(Param1)->Name); // Чтобы удостовериться в наличии поля ID } lyr->Find->FindField = ds->Fields->_Item(исходя из цикла);//ID CMapXFindFeature *FoundObj; FoundObj = lyr->get_Find()->Search(WideString(Table2->FieldByName("ID")->AsString)); if (FoundObj->FindRC % 10 == 1) //константа -3 ищ справки будет означаеть, что ничего не найдено. { ShowMessage("Yes"); Form1->Map1->Zoom = 30; Form1->Map1->CenterX = FoundObj->get_CenterX(); Form1->Map1->CenterY = FoundObj->get_CenterY(); } else { ShowMessage("No"); } } Form1->Map1->DataSets->Add(miDataSetLayer, lyr, Param1); Как я понимаю, должно быть похоже на это: Map1->DataSets->Add(miDataSetLayer, lyr, lyr->Name); Первый параметр предопределенная константа, два других варианты. Добавлено Раньше я выложила код на форуме MapInfo, там не было еще метода 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 Значит мы движемся в ПРАВЕЛЬНОМ направлении метод ADD!!!! |
Сообщ.
#60
,
|
|
|
Цитата Лена @ По-моему мы все в шаге от Нобелевской премии за попытку разобраться как работает MapX в среде C++ Builder Скорее - от белой рубахи до пола с очччччень длинными рукавами ![]() Лена, мне действительно такая рубаха скоро понадобится! Цитата Лена @ Источник данных BDE таблицы dbf. BDE - не источник данных, а механизм доступа к ним. Рубаху мне, рубаху ![]() ![]() ![]() Если я правильно понимаю вопрос, то MapX создан для работы с внутренним форматом MapInfo (DAT, ID, MAP, TAB - файлами или цифровой картой), если MapX позволяет пристегнуть и внешние базы - то причем тут BDE, а если не позволяет, то как MapX можно с ним скрестить? Слои карты и таблицы базы связаны между собой или как? |