www.map-info.ru :: Просмотр темы - Интегрированная картография - вызов процедуры
                               РќР° главную страницу сайта

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

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



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

СообщениеДобавлено: Пн Май 14, 2007 1:15 pm    Заголовок сообщения: Интегрированная картография - вызов процедуры Добавить ответ со ссылкой на данный текст

Столкнулся с проблемой вызова процедур и функций MapBasic'а извне. Необходимо вызвать процедуру MapBasic'а и передать ей несколько параметров. Конструкция типа
mi.Do("Run Application \"F:\\KirTemp\\MapInfo\\Map\\mb\\EM.MBX\"");
mi.Do("Call Sync(\"regionsnew\", 23949, 875.5)");
не работает :(

Каким образом можно это сделать? В доках ничего про это не могу найти....

Функция MapBasic'а:
Declare Sub Sync (ByVal tableName As String, ByVal id As Integer, ByVal value As Float)
Sub Sync (ByVal tableName As String, ByVal id As Integer, ByVal value As Float)
Dim ss As Alias
ss = "object_id"
Select * From tableName Where ss = id
Update Selection Set POPUL = value
Commit Table tableName
End Sub
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Gimly



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

СообщениеДобавлено: Ср Май 16, 2007 8:06 am    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

Что, неужели нет ничего лучше, чем тупо последовательно выполнять действия?? :( Залипуха...

mi.Do("Dim ss As Alias ss = \"object_id\" " +
"Select * From tableName Where ss = " + id + " " +
"Update Selection Set POPUL = " + value + " " +
"Commit Table " + tableName);
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
FedorinoFF



Зарегистрирован: 01.02.2007
Сообщения: 272
Откуда: Санкт-Петербург

СообщениеДобавлено: Сб Май 19, 2007 3:46 pm    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

Можно выкрутиться так: написать MBX с твоими функциями, и в нем написать два обработчика (или одит) RemoteMsgHandler и Remote... (более точно посмотри в доке по Mapbasic в районе интеграции и использования DDE. Слова про DDE пусть не пугают, аналогично работает по OLE/COM).
Из своего приложения делаешь типа
Do('mycommandkey')
в MBX в обработчике будет написано:
if SendedCommand = 'mycommandkey' then
Call ...

В строке из твоего приложения можно передавать и параметры и разбирать их на стороне Mapbasic-
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Gimly



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

СообщениеДобавлено: Пн Май 28, 2007 8:13 am    Заголовок сообщения: мозгов нехватает Добавить ответ со ссылкой на данный текст

Приболел => неделя почти вся вылетела... :(

Прописал по доке:
Declare Function RemoteQueryHandler() As String
Function RemoteQueryHandler() As String
Dim s_item_name As String
s_item_name = CommandInfo(CMD_INFO_MSG)

If s_item_name = "code1" Then
Call Do
End If
End Function

Не совсем понятно, что надо писать в "Do". mi.Do("code1") ?

Где-то вычитал, что "Do" должно быть не от объекта MapInfo, а от объекта MapBasic'а. Отсюда возникла проблема - не могу получить этот объект.

miApplication.Do("Run Application \"F:\\EM.MBX\"");
MapInfo.DMBApplications miMBapps = miApplication.MBApplications as MapInfo.DMBApplications;
MapInfo.DMapBasicApplication mb1 = miMBapps.Item(1) as MapInfo.DMapBasicApplication;

В miApps (с учетом первой строки) пишет Count = 1, но при получении, mb1 равен null'у.

Ps: miMBapps.Item(0) равен null, miMBapps.Item(1) - COM объект.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
FedorinoFF



Зарегистрирован: 01.02.2007
Сообщения: 272
Откуда: Санкт-Петербург

СообщениеДобавлено: Пн Май 28, 2007 11:21 am    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

Да, в "Do" писать строку с обрабатываемым кодом.
По поводу получения интерфеса на MapbasicApplication, то попробуй не Item(1), a Item(MBXName)
На Delphi я писал так

var
MBApplications: DMBApplications;
begin
....
MBApplications:= DMBApplications(AMIApplication.MBApplications);
FMBApplication:= DMapBasicApplication(MBApplications.Item(MBXFileName));
...

Так как без промежуточного получения MBApplications ничего не получалось
MBXFileName - полное имя файла приложения
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Gimly



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

СообщениеДобавлено: Пн Май 28, 2007 12:26 pm    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

Тот же результат :(
Пробовал различные варианты (с расширением, путем, кавычками и т.п.). Уже не знаю, какие еще варианты пробовать...

Ps: Пишу на шарпе.
--------

Если получаю
MapInfo.DMapInfo obj = dmbapps.Item(1) as MapInfo.DMapInfo;
(или "EM.MBX", что без разницы), то в свойствах obj "Name" находится название файла (тот самый "EM.MBX"), в "FullName" - полный путь до него... А при попытке вызвать любой метод выкидывает эксепшн:
"Член группы не найден. (Exception from HRESULT: 0x80020003 (DISP_E_MEMBERNOTFOUND))"
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Gimly



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

СообщениеДобавлено: Ср Май 30, 2007 4:02 pm    Заголовок сообщения: Все-равно залипуха... Добавить ответ со ссылкой на данный текст

Пришлось написать dll-ку на VB с Object'ами, которая получает от меня MapInfo, имя программы MB и команду. Возвращает строку ответа... Хотя собирать/разбирать эти строки, мягко сказать, неудобно. Зато работает...

Public Function ExecuteFunction(ByVal miApplication As Object, ByVal mbProgramm As String, ByVal fuctionCode As String) As String
Dim mbApplications As Object
Dim mbApplication As Object
Dim result As Object

If miApplication.Equals(Nothing) Then
Return Nothing
End If
mbApplications = miApplication.MBApplications()

If mbApplications.Equals(Nothing) Then
Return Nothing
End If
mbApplication = mbApplications.Item(mbProgramm)

If mbApplication.Equals(Nothing) Then
Return Nothing
End If
result = mbApplication.Eval(fuctionCode)

Return result
End Function


В шарпе такая же конструкция не пашет...
Type tp = qo.GetType();
MethodInfo mi__i = tp.GetMethod("Eval");
mi__i.Invoke(qo, new object[] {"Export \"regionsnew\" Into ..."});
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
FedorinoFF



Зарегистрирован: 01.02.2007
Сообщения: 272
Откуда: Санкт-Петербург

СообщениеДобавлено: Чт Май 31, 2007 9:23 am    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

Да, в работе с Mapinfo иногда приходится изощряться. А с .net у них пока еще не очень...
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
aleksvl76



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

СообщениеДобавлено: Пт Сен 27, 2019 3:59 pm    Заголовок сообщения: Re: Все-равно залипуха... Добавить ответ со ссылкой на данный текст

Gimly писал(а):
Пришлось написать dll-ку на VB с Object'ами, которая получает от меня MapInfo, имя программы MB и команду. Возвращает строку ответа... Хотя собирать/разбирать эти строки, мягко сказать, неудобно. Зато работает...

Public Function ExecuteFunction(ByVal miApplication As Object, ByVal mbProgramm As String, ByVal fuctionCode As String) As String
Dim mbApplications As Object
Dim mbApplication As Object
Dim result As Object

If miApplication.Equals(Nothing) Then
Return Nothing
End If
mbApplications = miApplication.MBApplications()

If mbApplications.Equals(Nothing) Then
Return Nothing
End If
mbApplication = mbApplications.Item(mbProgramm)

If mbApplication.Equals(Nothing) Then
Return Nothing
End If
result = mbApplication.Eval(fuctionCode)

Return result
End Function



Добрый день!
Откройте тайну как вам удается подключать в МапИнфо DLL-ки сделанные в VB?
Вы используете VB-Net или VB6?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
   Список форумов www.map-info.ru | Форум - программирование в среде MapInfo Добавить ответ
Страница 1 из 1

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


Top.Mail.Ru