Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Использование ActiveX, компонет MapX не работает в Builder 
:(
    Опции темы
Лена
Дата 16.8.2006, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 879
Регистрация: 16.8.2006

Репутация: 11
Всего: 11



Есть компонент для картографии MapX. В примерах к нему есть код создающий специальный слой – карту, на которой можно затем рисовать. Код из стандартной справки на VB:

dim lyrInsertion as MapXlib.Layer
set lyrInsertion = Map1.Layers("USA")
lyrInsertion.Editable = True
Set Map1.Layers.InsertionLayer = lyrInsertion
После этого кода можно рисовать на слой – карте USA.

Пишу код на Builder:
Код

CMapXLayer * SelectAreaLayer;
void __fastcall TForm1::FormShow(TObject *Sender)
{
SelectAreaLayer = Map1->Layers->get_Item(OleVariant(1));//в Builder по номеру, №1 это нужный мне слой - карта
SelectAreaLayer->Editable = true;
Map1->Layers->InsertionLayer = SelectAreaLayer;
}


однако это не работает: свойство InsertionLayer не устанавливается.

Пробовала так:
Код

CMapXLayer * SelectAreaLayer;
void __fastcall TForm1::FormShow(TObject *Sender)
{
SelectAreaLayer = Map1->Layers->get_Item(OleVariant(1));
SelectAreaLayer->set_Editable(1);
Map1->Layers->set_InsertionLayer(SelectAreaLayer);
}

Тоже возвращает NULL.

Попытка обернуть в OLE:
Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
Variant vMap = Map1;
Variant SelectAreaLayer = vMap.OlePropertyGet("Layers").OlePropertyGet("Item",1);//эдесь!
SelectAreaLayer.OlePropertySet("Editable",true);
vMap.OlePropertyGet("Layers").OlePropertySet("InsertionLayer",SelectAreaLayer);
vMap.OlePropertySet("CurrentTool",miAddRegionTool);
}


Вызывает на строке исключение (рис в архиве)


Попытка получить доступ через IDispatch.Invoke (так правильно?):
Код

CMapXLayer * SelectAreaLayer;
SelectAreaLayer = Map1->Layers->get_Item(OleVariant(1));
SelectAreaLayer->Editable = true;

CMapXLayersDisp ServerForLayer; //тип из TLB файла без буквы T на конце
ServerForLayer.BindDefault(); //тут ошибка, которая ниже
ServerForLayer.get_Item(OleVariant(1));
ServerForLayer.set_InsertionLayer(SelectAreaLayer);

Юнит компилируется, а при общей компиляции ошибка:
[Linker Error] Unresolved external 'Mapxlib_tlb::CLSID_Layers' referenced from C:\DOCUMENTS AND SETTINGS\LENA\DESKTOP\AREA2\UMAP.OBJ

Может кто подскажет как с этим бороться?
Прилагаю файл TLB от MapX. Посмотрите, кто знает, это ошибка компонента в среде Builder или существует специфичный способ задания InsertionLayer в Builder?
сайт компонента: http://extranet.mapinfo.com/products/Overv...uctcategoryid=1




Это сообщение отредактировал(а) Лена - 16.8.2006, 15:09

Присоединённый файл ( Кол-во скачиваний: 10 )
Присоединённый файл  ex.zip 86,81 Kb
PM MAIL   Вверх
Лена
Дата 16.8.2006, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 879
Регистрация: 16.8.2006

Репутация: 11
Всего: 11



Ошибка с OLE

Присоединённый файл ( Кол-во скачиваний: 22 )
Присоединённый файл  ex.gif 9,10 Kb
PM MAIL   Вверх
kefir01
Дата 25.6.2008, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 22.6.2007

Репутация: 1
Всего: 2



Думаю нужно просто Variant

Вот рабочий код
Код

CMapXLayer *lyr;
lyr = Map1->Layers->_Item(Variant(1));
lyr->Editable = true;
Map1->Layers->InsertionLayer = lyr;


Это сообщение отредактировал(а) kefir01 - 25.6.2008, 16:17
PM MAIL   Вверх
Лена
Дата 25.6.2008, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 879
Регистрация: 16.8.2006

Репутация: 11
Всего: 11



При любом коде InsertionLayer не работает в Builder. Чтобы в этом убедиться можно после любого кода поробывать получить имя InsertionLayer слоя:
wchar_t * name = Map1->Layers->InsertionLayer->_Name; //всегда исключение
PM MAIL   Вверх
kefir01
Дата 3.7.2008, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 22.6.2007

Репутация: 1
Всего: 2



И действительно, однако код что я привел создает слой и позволяет менять его свойства.
На самом деле у меня самого возникла проблема с созданием объектов на слое, но думаю проблема тут не в InsertionLayer...
PM MAIL   Вверх
Лена
Дата 3.7.2008, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 879
Регистрация: 16.8.2006

Репутация: 11
Всего: 11



AnimationLayer тоже не желает работать в Builder :(
http://forum.sources.ru/index.php?showtopi...=animationlayer
AnimationLayer и InsertionLayer не удалось победить в C++ Builder. Остальное вроде работает.

Цитата(kefir01 @  3.7.2008,  13:44 Найти цитируемый пост)
На самом деле у меня самого возникла проблема с созданием объектов на слое,


Что имеется в виду?


P.S.
Если возникнет задача установить MapX на С++ Builder 2007, то тут инструкция:
http://qc.codegear.com/wc/qcmain.aspx?d=48143

PM MAIL   Вверх
kefir01
Дата 3.7.2008, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 22.6.2007

Репутация: 1
Всего: 2



Проблемы хотя бы с созданием точек
Пробую такой код:
Код

WideString lyrname = "CUSTOM";
MapX->Layers->CreateLayer(lyrname);
lyr = MapX->Layers->_Item(Variant(lyrname));
lyr->Editable = true;

  PointPtr pt;
  pt.CreateInstance(CLSID_Point, (void*)NULL, CLSCTX_INPROC_SERVER);
  pt->Set_(32.998,54.242);

  TVariant point   = (IDispatch*)pt;
  FeaturePtr p = MapX->FeatureFactory->CreateSymbol(point,Variant(MapX->DefaultStyle));

  lyr->AddFeature(p);

  pt.AddRef();
  VariantClear(point);


Результат - EAccessViolation 

Это сообщение отредактировал(а) kefir01 - 3.7.2008, 14:47
PM MAIL   Вверх
Лена
Дата 3.7.2008, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 879
Регистрация: 16.8.2006

Репутация: 11
Всего: 11



А если так:
Код

CMapXLayer * TempLayer;

void __fastcall TForm1::Button1Click(TObject *Sender)
{
CMapXPointsDisp points;
points.Bind(StringToOleStr("MapX.Points.5"));
points.AddXY(20,10); //просто для примера
TempLayer->AddFeature(points);
long x = points.get_X(1);
long y = points.get_Y(1);
Map1->CenterX = x;
Map1->CenterY = y;
//points.RemoveAll();
//points.Unbind(StringToOleStr("MapX.Points.5"));
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
//константа для временного слоя  Temp Layer
TempLayer = Map1->Layers->CreateLayer(WideString("Temp Layer"));
}
//---------------------------------------------------------------------------


Это сообщение отредактировал(а) Лена - 3.7.2008, 16:48
PM MAIL   Вверх
kefir01
Дата 3.7.2008, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 22.6.2007

Репутация: 1
Всего: 2



Лена, огромное тебе спасибо! 
Так как в примере не получилось (0 эффекта при нажатии), зато получилось вот так.

Код

    CMapXPointDisp point;                        //изменил на точку
    point.Bind(StringToOleStr("MapX.Point.5"));  //ах вот как оказывается, а я пробовал до этого как в дельфи через CreateOleObject
    point.Set_(X1,Y1);

    Variant pt = (IDispatch*)point;

    FeaturePtr p = MapX->FeatureFactory->CreateSymbol(pt,Variant(MapX->DefaultStyle));
    lyr->AddFeature(p);

    VariantClear(pt);


Это сообщение отредактировал(а) kefir01 - 3.7.2008, 21:40
PM MAIL   Вверх
Лена
Дата 4.7.2008, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 879
Регистрация: 16.8.2006

Репутация: 11
Всего: 11



Хорошо, что все получилось. С реально работающим кодом MapX в С++ Builder трудно разобраться. МapInfo официально не поддреживает MapX в C++ Builder, поэтому трудно найти нормальные примеры. Но, хорошо что китайцы такие умные программисты.  smile 
Некоторые фрагменты кода для MapX, в свое время нашла на китайских сайтах.  У китайских товарищей совсем нет проблем с MapX в C++ Builder smile 
А вот о InsertionLayer и AnimationLayer инфо не нашла...

Это сообщение отредактировал(а) Лена - 4.7.2008, 09:53
PM MAIL   Вверх
kefir01
Дата 4.7.2008, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 22.6.2007

Репутация: 1
Всего: 2



А можешь тогда еще подкинуть код на вставку слоев из файла? Буду очень признателен.
А про поддержку BCB я в курсе. Китайцы трудолюбивые програмисты. Я на 3 день парок на форумы полез, а они видать сидят пробуют все пока не найдут решение =)

Этот код отказывается работать.
Код

CMapXLayerInfoDisp li;

li.Bind(StringToOleStr("MapX.LayerInfo.5"));
li.Type = miLayerInfoTypeTab;
li.AddParameter(WideString("FileSpec"),Variant(GetCurrentDir()+"\\maps\\x700.TAB"));
li.AddParameter(WideString("Visible"),Variant(true));
li.AddParameter(WideString("Name"),Variant("x700"));

Variant layer = (IDispatch*)li;

MapX->Layers->Add(layer,Variant(1));


Это сообщение отредактировал(а) kefir01 - 4.7.2008, 11:20
PM MAIL   Вверх
Лена
Дата 4.7.2008, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 879
Регистрация: 16.8.2006

Репутация: 11
Всего: 11



Самое простое это создать в геосет менеджере геосет из нужных слоев и затем грузить его:
Map1->GeoSet = WideString("C:\\Program Files\\MAP\\имя_геосета.gst");
//Map1->Title->set_Visible(0);

Если грузить отдельный слой, то примерно как-то так:
Код

//можно вместо "индекс" переменную цикла
CMapXLayer * LYR[100];
CMapXDataset *DTS[100];
OleVariant unusedParam, unusedParam2;
AnsiString S = "путь к tab карте"
unusedParam.operator =(S);
LYR[индекс] =  Map1->Layers->Add(unusedParam, OleVariant(индекс));
DTS[индекс] = Map1->DataSets->Add(miDataSetLayer,Variant(LYR[индекс]),Variant(LYR[индекс]->Name));
//Map1->Layers->Move(индекс,позиция);
unusedParam2.operator =(индекс);
Map1->Layers->_Item(unusedParam2)->ZoomLayer = true;
Map1->Layers->_Item(unusedParam2)->ZoomMin = 
Map1->Layers->_Item(unusedParam2)->ZoomMax = 
Map1->Layers->_Item(unusedParam2)->Visible = 

PM MAIL   Вверх
kefir01
Дата 4.7.2008, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 22.6.2007

Репутация: 1
Всего: 2



Ок. Буду пробовать.
PM MAIL   Вверх
kefir01
Дата 7.7.2008, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 22.6.2007

Репутация: 1
Всего: 2



Нет, этот код не работает. Пытаюсь найти решение. Судя по документации слои добавляются через создание LayerInfo типа miLayerInfoTypeTab. Однако загвоздка заключается в том, что:

Код

Dim li as MapXLib.LayerInfo
Set li = CreateObject ("MapXMobile.LayerInfo.5")
li.Type = miLayerInfoTypeTab
li.AddParameter "FileSpec", "\My Documents\Maps\USA.tab"
li.AddParameter "Visible", False
li.AddParameter "AutoCreateDataset", True
li.AddParameter "DatasetName", "dsUSA"
Map1.Layers.Add li


И мой вариант:
Код

CMapXLayerInfoDisp li;
li.Bind(StringToOleStr("MapX.LayerInfo.5"));
li.Type = miLayerInfoTypeTab;
li.AddParameter(WideString("FileSpec"),Variant(GetCurrentDir()+"\\maps\\x700.TAB"));
li.AddParameter(WideString("Visible"),Variant(true));
li.AddParameter(WideString("Name"),Variant("x700"));
Variant layer = (IDispatch*)li;
MapX->Layers->Add(layer,Variant(1));


По идее в точности повторяет пример из руководства, за исключением того что там создается объект MapXMobile.LayerInfo.5 а у меня MapX.LayerInfo.5 подозреваю что ошибка может быть в этом.
PM MAIL   Вверх
Лена
Дата 8.7.2008, 09:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 879
Регистрация: 16.8.2006

Репутация: 11
Всего: 11



Цитата(kefir01 @  7.7.2008,  16:38 Найти цитируемый пост)
Нет, этот код не работает.


У меня этот код работает. В Table храняться пути к слоям, значаения min, max, ZoomLayer, Visible...

Код

Table1->First();

   AnsiString S;
   //S = DataModule1->Table5->FieldValues["FILE"];
   OleVariant unusedParam,unusedParam1,unusedParam2,unusedParam3, unusedParam4,unusedParam5;
   //unusedParam1.operator =(0);
   int i = 0;
   bool fromtable;
   double min;
   double max;
   CMapXLayer * LYR[100];
   CMapXDataset *DTS[100];

    for(int Cnt_Lyr=1; Cnt_Lyr<=Table1->RecordCount; Cnt_Lyr++)
          {
          S = Table1->FieldValues["FILE"];
          unusedParam.operator =(S);
          LYR[i] =  Map1->Layers->Add(unusedParam, OleVariant(i));
          DTS[i] = Map1->DataSets->Add(miDataSetLayer,Variant(LYR[i]),Variant(LYR[i]->Name));
          unusedParam2.operator =(Cnt_Lyr);
          Map1->Layers->Move(i,50);
          //проверка
          LYR[i] = Map1->Layers->_Item(unusedParam2);
          if(!LYR[i])
               {

                Label1->Caption = S;
                Application->MessageBox("Слой не создан...","Ошибка",MB_ICONEXCLAMATION);
                //return;

                }

          fromtable = Table1->FieldByName("VIS")->AsBoolean;
          unusedParam3.operator =(fromtable);
          min = (Table1->FieldValues["MIN"]);
          max = (Table1->FieldValues["MAX"]);
          unusedParam4.operator =(min);
          unusedParam5.operator =(max);
          Map1->Layers->_Item(unusedParam2)->ZoomLayer = true;
          Map1->Layers->_Item(unusedParam2)->ZoomMin = unusedParam4;
          Map1->Layers->_Item(unusedParam2)->ZoomMax = unusedParam5;
          Map1->Layers->_Item(unusedParam2)->Visible = unusedParam3;

          Table1->Next();
          i++;
         }




Это сообщение отредактировал(а) Лена - 8.7.2008, 09:11
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0568 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.