Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
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? |
|
Вернуться к началу |
|
|
|