www.map-info.ru :: Просмотр темы - C++ Builder и MapInfo
                               РќР° главную страницу сайта

 
                                
ВходВход    РегистрацияРегистрация    ПрофильПрофиль    ПользователиПользователи    ГруппыГруппы    FAQFAQ    ПоискПоиск  

 
   Список форумов www.map-info.ru | Форум - программирование в среде MapInfo Добавить ответ
Предыдущая тема :: Следующая тема  
Автор Сообщение
sitesv



Зарегистрирован: 02.04.2010
Сообщения: 9

СообщениеДобавлено: Пт Апр 02, 2010 12:36 pm    Заголовок сообщения: C++ Builder и MapInfo Добавить ответ со ссылкой на данный текст

Доброго времени дня! Пытаюсь написать приложение в C++ Builder, которое бы использовало интегрированную картографию MapInfo.
Проанализировав примеры, реализованные на Delphi, сначала необходимо создать ОЛЕ объект
Variant a=CreateOleObject("MapInfo.Application");

При выполнении, эта строчка проходит нормально, а как проверить правильность ее выполнения?

В дальнейшем необходимо использовать метод a.DO... , но в c++ builder такого нет, и никаких комментариев по реализации в с++ builder нет, помогите с реализацией выполения кода MapBasic из под C++ Builder 6.0

Заранее спасибо.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Андрей Могильный



Зарегистрирован: 21.03.2006
Сообщения: 864

СообщениеДобавлено: Пт Апр 02, 2010 2:28 pm    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

1) Если код:
Variant a=CreateOleObject("MapInfo.Application");
выполнился без ошибки и в переменной a есть значение, то значит все хорошо.
2) Почему вы думаете, что в c++ builder так
a.DO('')
нельзя? Пробовали?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
sitesv



Зарегистрирован: 02.04.2010
Сообщения: 9

СообщениеДобавлено: Пт Апр 02, 2010 2:36 pm    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

Переменная "а" принимает значение {{ }}, это нормально?
a.do пробовал, хотел сделать по аналогии с примером для Delphi, но что-то никак не получилось... Билдер пишет "Member Identifier Expected", видимо он распознает do как структуру do...while
К примеру реализация команд MapBasic, так она выглядит в Delphi (из примера):
procedure TKDMapInfoServer.ExecuteCommandMapBasic(Command:string;const Args: array of const);
begind
a.do(Format(Command,Args));
end;

может быть какие-то доп.библиотеки нужны?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Arhara



Зарегистрирован: 18.02.2009
Сообщения: 400
Откуда: Moscow, RF

СообщениеДобавлено: Сб Апр 03, 2010 2:35 am    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

А должна иметь вид тестовой строки "Mapinfo Professional"
Mapinfo устанавливает себя как OLE-Сервер.
Прежде чем говорить о подпрограммах, надо выяснить происходит ли вообще обращение к Mapinfo.
Самый простой случай, что возвращает команда
a.Eval("2*2")
И прежде чем создавать объект MapInfo, который плохо управляем, попробуйте подключиться к активной запущенной ранее копии Mapinfo командой аналогичной
GetObject(,"MapInfo.Application")
К тому же, видимо именно для этих случаев, для Do есть аналог RunCommand
Код:

Sub Do(command As String)
    Member of MapInfo.MapInfoApplication

Sub RunCommand(command As String)
    Member of MapInfo.MapInfoApplication

Вернуться к началу
Посмотреть профиль Отправить личное сообщение
sitesv



Зарегистрирован: 02.04.2010
Сообщения: 9

СообщениеДобавлено: Сб Апр 03, 2010 2:11 pm    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

В обоих случаях a.RunCommand или a.Eval, RunCommand и Eval is not a member of Variant - Так выдает c++ builder при компиляции.
и вариант GetObject( , "MapInfo.Application") напрямую в билдере не проходит, он пишет Expression Syntax... Использую при открытом MapInfo GetActiveOleObject. Верный вариант? В вариантную переменную "а" записывается тоже выражение {{}} как и при CreateOleObject при закрытом MapInfo. c Eval и RunCommand не ясно.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Serj



Зарегистрирован: 25.08.2006
Сообщения: 50

СообщениеДобавлено: Сб Апр 03, 2010 4:47 pm    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

Все проще пареной репы:
1. Project -> Import Type Library...
Если в списке есть объект MapInfo - замечательно, если нет - говорим Add... и добавляем из папки, где лежит MapInfo либо файл MAPINFOW.TLB, а если его нет, то сам exe-юк (это зависит от версии)
2. Install - не обязательно, достаточно Create Unit. если не указано другое, то в папку CBuilder6\Imports\ положит интерфейсы и классы для доступа к MapInfo.
3. Хе! Не забываем header-ы подключить в свой проект!
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
sitesv



Зарегистрирован: 02.04.2010
Сообщения: 9

СообщениеДобавлено: Сб Апр 03, 2010 6:39 pm    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

Serj писал(а):
Все проще пареной репы:
1. Project -> Import Type Library...


Да, так и делал, только когда жму на клавишу Create Unit или Install, то в папке борланда в подкаталоге Import создается файл MapInfo_TLB.cpp, MapInfo_TLB.h, но никак не MapInfoW.h как во всех примерах.
Сделав #include "MapInfo_TLB.h" и прописав тип

DMapInfo a;

в этом случае возникает ошибка при компиляции, пишется

cannot create instance of abstract class 'DMapInfo'
class 'DMapInfo' is abstract because of '__stdcall IDispatch:GetTypeInfoCount(unsigned int *) = 0'

опять что-то не так
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Serj



Зарегистрирован: 25.08.2006
Сообщения: 50

СообщениеДобавлено: Сб Апр 03, 2010 8:02 pm    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

А в сами файлы заглянуть лень?
Пользовать надо DMapInfoDisp...
Ну, и в проект рожденные cpp не забыть подключить!
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
sitesv



Зарегистрирован: 02.04.2010
Сообщения: 9

СообщениеДобавлено: Сб Апр 03, 2010 8:44 pm    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

Serj писал(а):
А в сами файлы заглянуть лень?
Пользовать надо DMapInfoDisp...
Ну, и в проект рожденные cpp не забыть подключить!


Спасибо за нужный ответ!
Где бы найти описалово операторов по дальнейшей работе с MapInfo из-под билдера, отсутствует CreateDispatch для запуска MapInfo, хотя в user guide по mapbasic 10 присутствует.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Serj



Зарегистрирован: 25.08.2006
Сообщения: 50

СообщениеДобавлено: Сб Апр 03, 2010 9:04 pm    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

Users Guide описывает общие подходы, а дальше надо исходить от своего компилятора, и своего понимания... Опять же, заглянуть в рожденные файлы, справку по Builder поюзать... Лень матушка - уже не двигатель прогресса, а его полная остановка... )))
Ну хотя бы так...
void __fastcall TForm1::FormCreate(TObject *Sender)
{
if (!mapinfo.IsBound()) {
if (mapinfo.Bind(WideString("MapInfo.Application")) != S_OK) {
MessageDlg("Ошибка соединения с MapInfo!!!", mtError, TMsgDlgButtons() << mbOK, 0);
Application->Terminate();
return;
}
AnsiString param = "Set Application Window ";
param += (unsigned int) Handle;
mapinfo.Do(WideString(param));
}
}
Там только рано или поздно возникнет вопрос, когда запущено несколько приложений MapInfo... Вот тут уже сложности, решаемые, но не так просто... ;)))
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
sitesv



Зарегистрирован: 02.04.2010
Сообщения: 9

СообщениеДобавлено: Сб Апр 03, 2010 9:16 pm    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

Serj писал(а):

Вау! Большое прибольшое спасибо! Трудности возникли, как впервые столкнулся с задачей написания приложения для MapInfo. Еще раз спасибо за необходимый толчок!! Smile
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
sitesv



Зарегистрирован: 02.04.2010
Сообщения: 9

СообщениеДобавлено: Вс Апр 25, 2010 12:28 pm    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

А если сервер, т.е. MapInfo находится на другом компе, то как с помощью CreateOleObject подсоедениться к нему по средством локальной сети или интернета?

Можно ли в CreateOleObject(server.Project3) дописать ip адрес чтоб соединиться по локалке?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Андрей Могильный



Зарегистрирован: 21.03.2006
Сообщения: 864

СообщениеДобавлено: Пн Апр 26, 2010 5:53 pm    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

Вообще-то никак.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
sitesv



Зарегистрирован: 02.04.2010
Сообщения: 9

СообщениеДобавлено: Пн Апр 26, 2010 7:26 pm    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

Андрей Могильный писал(а):
Вообще-то никак.

т.е. mapinfo, т.е. сервер должен обязательно находиться на машине, на которой есть клиентское приложение?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Андрей Могильный



Зарегистрирован: 21.03.2006
Сообщения: 864

СообщениеДобавлено: Пн Апр 26, 2010 9:55 pm    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

Да, это технология COM. Есть конечно еще и DCOM (Distributed COM), но не уверен, что MapInfo сможет в ней работать, в документации ничего про это нет.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
Показать сообщения:   
   Список форумов www.map-info.ru | Форум - программирование в среде MapInfo Добавить ответ
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Top.Mail.Ru