Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.143.22.26] |
|
Страницы: (10) 1 2 [3] 4 5 ... 9 10 все ( Перейти к последнему сообщению ) |
Сообщ.
#31
,
|
|
|
А откуда уверенность, что это именно 48-й слой? Чем не нравится обращение к слою по имени?
|
Сообщ.
#32
,
|
|
|
Я через свойство lyr->Name в операторе if предварительно убедилась, что имя этого слоя равно "_ROAD" именно это улицы. Мало того я могу во время выполнения, используя MapX просмотреть в специальном окне расположение слоев после их динамической загрузки. Слой "_ROAD" на последнем 48 месте.
Я бы с удовольствием хотела обратиться по имени слоя в методе _Item в Builder, но он принимает параметр tadVariant index, раз index значит по номеру, поэтому я не знаю, как передать по имени "_ROAD" как если бы это было в Делфи. Вот в Делфи метод Item принимает имя слоя. |
Сообщ.
#33
,
|
|
|
Цитата Лена @ Раз VARIANT, значит принимает значения разных типов. Это ActiveX - значит интерфейс определяется компонентом, а не языком. Не может быть такого, чтобы один и тот же компонент принимал текст из программы на одном языке и не принимал на другом.tadVariant index, раз index значит по номеру Цитата Лена @ Так и передать. поэтому я не знаю, как передать по имени "_ROAD" |
Сообщ.
#34
,
|
|
|
Спасибо, в понедельник попробую. Проект на работе в офисе, мысль понятна. Просто слово index мною однозначно интенпритировалось в данном контексте как номер!
Добавлено Правда, пока не понимаю как передать пустой второй параметр в функции Search. |
Сообщ.
#35
,
|
|
|
Цитата Лена @ Правда, пока не понимаю как передать пустой второй параметр в функции Search. В этом - весь идиотизм ActiveX, написанных шибко продвинутыми программерами Особливо для переменной типа Variant...Попробуй методом тыка - 0, NULL, "", EmptyParam (как в Ворде)... |
Сообщ.
#36
,
|
|
|
void __fastcall TFStr_Search::Button3Click(TObject *Sender) { Table2->First(); OleVariant unusedParam; unusedParam.operator =(48);//номер слоя CMapXLayer * lyr = Form1->Map1->Layers->_Item(unusedParam); AnsiString id = "_ROAD"; //имя слоя WideString wsid = WideString(id); //---- начало проверки ------------------- if(WideString(lyr->Name) == wsid) { Form1->Label5->Caption = (WideString(lyr->Name)); Application->MessageBox("Cëîé_ROAD","Проверка",MB_ICONEXCLAMATION); } //----- конец проверки. Успешно --------- OleVariant unusedParam1; //готовлю параметр для _Item в цепочке поиска unusedParam1.operator =(id); OleVariant unusedParam2; //готовлю пустой параметр для Search unusedParam2.IsEmpty(); CMapXFindFeature *FoundObj; FoundObj = Form1->Map1->Layers->_Item(unusedParam1)->get_Find()->Search(WideString(Table2->FieldByName("ID")->AsString),unusedParam2); 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"); } } Все время попадаю в секцию else. Если написать в Search первым параметром WideString(Table2->FieldValues["ID"]) вместо WideString(Table2->FieldByName("ID")->AsString возникает исключение (см.рисунок). Прикреплённая картинка
|
Сообщ.
#37
,
|
|
|
Цитата Лена @ Вообще его не указывать. На то и существуют в C++ параметры со значениями по умолчанию, что бы в данном случае вызов без указания второго параметра был бы эквивалентен пустому параметру. Правда, пока не понимаю как передать пустой второй параметр в функции Search. |
Сообщ.
#38
,
|
|
|
Цитата Лена @ Слой "_ROAD" на последнем 48 месте А индексация начинается с 0, или с 1? |
Сообщ.
#39
,
|
|
|
Индексация в MapX начинается с 1, это относиться к слоям и фичам на слое...
|
Сообщ.
#40
,
|
|
|
Цитата Coala @ Mapxlib_tlb::CMapXFeatures* __fastcall Search(BSTR strWhere, VARIANT Variables/*[opt]*/= TNoParam()); Если следовать букве...то первый параметр типа BSTR должен создаваться примерно так: WideString layName; ...Search(layName.BSTR(),...); Что касается второго параметра - Лена, что за метод TNoParam(), что там про это дело в хелпе сказано? |
Сообщ.
#41
,
|
|
|
Цитата Coala @ Цитата Coala @ Mapxlib_tlb::CMapXFeatures* __fastcall Search(BSTR strWhere, VARIANT Variables/*[opt]*/= TNoParam()); Если следовать букве...то первый параметр типа BSTR должен создаваться примерно так: WideString layName; ...Search(layName.BSTR(),...); Что касается второго параметра - Лена, что за метод TNoParam(), что там про это дело в хелпе сказано? Cпасибо буду пробывать. Мысль layName.BSTR(),...); интересная. По поводу вторго параметра, есть тольк информация в файле TLB и описание его для Делфи (ниже). Описание методов и примеров для Builder нет. A string, which is the name of the refining boundary object. Used when a refining layer is specified. For example, "NY", "21135". If a refine layer has been set, this argument is required; otherwise it is optional. В Builder этот параметр не тип string, а Variant и судя по коду переделываемого мной приложения он не нужен. Речь идет о каком-то refining boundary object, котрый мы не определяем и поэтому в первом приложении было так find = l_A.OlePropertyGet("Find").OleFunction("Search", Table2->FieldValues["ID"], "" ); второй параметр пустой. |
Сообщ.
#42
,
|
|
|
Цитата Лена @ второй параметр пустой Он не пустой, он - пустая строка. Меня больше всего смущает его описание в хидере - тип VARIANT. Это в Дельфи - Variant и VARIANT - одно и то же... |
Сообщ.
#43
,
|
|
|
IsEmpty не делает объект пустым, а проверяет объект на пустоту
|
Сообщ.
#44
,
|
|
|
Цитата trainer @ IsEmpty не делает объект пустым, а проверяет объект на пустоту Тогда что выглядит более правильным: OleVariant unusedParam2; unusedParam2.IsNull(); //для второго параметра Search или OleVariant unusedParam2; AnsiString Second =""; unusedParam2.operator =(Second); |
Сообщ.
#45
,
|
|
|
Лена, Variant и OleVarint - разные типы! Может тут...
|