MB60UG
.pdfГлава 12: Интегрированная Картография
CommandInfo(7) + ”,” + CommandInfo(8)
Предположим, что Ваше приложение добавляет команду меню к локальному меню MapInfo. Каждый раз, когда пользователь выбирает команду меню, MapInfo посылает OLE-методу строку. Если команда меню имеет номер 101, строка будут выглядеть следующим образом:
”MI:,,,,,,,101”
В этом случае большинство элементов строки пусто, потому что функция CommandInfo( )
может возвращать только эту одну часть информации.
Теперь предположим, что Вы создаете кнопку панели MapInfo, которая позволяет пользователю линии на Карте. Строка теперь будет выглядеть следующим образом:
”MI:-73.5548,42.122,F,F,-72.867702,43.025,202,”
Теперь строка включает несколько элементов. Первые два элемента содержат x– и y– координаты точки, на которую пользователь указал мышкой; следующие два элемента сообщают, была ли нажата клавиша SHIFT или CTRL; следующие два элемента содержат координаты точки, где пользователь отпустил кнопку мышки; и последний элемент указывает номер идентификатора кнопки.
Совет: Если Вы приписываете уникальный идентификатор каждой из Ваших кнопок, Вы можете сделать так, что все кнопки будут вызывать один и тот же метод. Ваш метод может определять, какая из кнопка вызвала его, используя седьмой аргумент в переданной строке.
Разбор содержания строки возлагается на Ваше приложение.
Синтаксис C/C++ для функций уведомления
В предыдущем разделе были описаны обратные вызовы в контексте Visual Basic. Здесь мы рассмотрим синтаксис языка C.
Если Вы используете метод MapInfo SetCallback, MapInfo может автоматически генерировать обратные вызовы для Вашего объекта IDispatch. Обратные вызовы стандарта MapInfo имеют следующий синтаксис:
SCODE SetStatusText(LPCTSTR lpszMessage)
MapInfo вызывает метод SetStatusText всякий раз, когда изменяется содержание строки сообщений в MapInfo. Единственный аргумент – текст сообщения в строке состояний.
SCODE WindowContentsChanged(Unsigned Long windowID)
MapInfo вызывает метод WindowContentsChanged всякий раз, когда изменяется содержание окна Карты. Единственный аргумент представляет собой идентификатор этого окна. Этот повторный вызов аналогичен процедуре MapBasic WinChangedHandler.
225
Глава 12: Интегрированная Картография
Другие способы использования уведомлений
Как говорилось ранее, MapInfo может использовать обратные вызовы OLE, чтобы послать информацию Вашей клиентской программе. В некоторых случаях, однако, Вы должны применять повторные вызовы, которые не используют OLE. Например, если Вы пишете программы в Visual Basic 3.0, Вы не можете использовать OLE, потому что Visual Basic 3.0 не позволяет создавать Ваши собственные серверы Автоматизации OLE.
MapInfo поддерживает два типа уведомлений, которые не используют механизм OLE: использующие DDE, и использующие приложения MapBasic (файлы MBX).
Обратные вызовы DDE
Когда Вы создаете кнопки на инструментальной панели или команды меню, Вы указываете предложение Calling. Чтобы пользоваться обратным вызовом посредством DDE, используйте синтаксис вызова DDE-сервера. Всякий раз, когда пользователь использует кнопку или команду меню, MapInfo открывает DDE-связь с DDE-сервером, и затем посылает строку Вашему объекту. Строка использует формат, обсужденный в предыдущей секции (например, " MI:,,,,,, 101 ").
Пример смотрите в программе FindZip. Процедура Form Load посылает MapInfo оператор
Alter ButtonPad ... Add с предложением
Calling DDE ”FindZip”, ”MainForm”
Всякий раз, когда пользователь применяет инструмент, MapInfo открывает DDEсвязь с программой FindZip и посылает строку "MainForm" объекту. ("MainForm" – значение свойства формы LinkTopic). Подробнее смотрите в Главе 11.
Обратные вызовы MBX
Если Вы создаете приложение MapBasic (файл MBX), Вы можете сконструировать Ваши кнопки и команды меню так, чтобы они вызвали MapBasic п-роцедуры в MBX. В предложении вызова используйте синтаксис вызова процедуры MapBasic-программы.
После того, как Ваше приложение на языке Visual Basic запустит MapInfo, запустите MBX, послав MapInfo строку вида:
mapinfo.do ”Run Application ””C:\MB\MYAPP.MBX”” ”
Подробности о создании кнопок и команд меню смотрите в главе 6.
Справочная система
Приложение с Интегрированной Картой может активировать окна диалога MapInfo посредством OLE-метода RunMenuCommand. Если Ваше приложение, таким образом, активизирует окно диалога MapInfo, Вы можете контролировать доступность Справочной системы для этого окна.
226
Глава 12: Интегрированная Картография
Вызов стандартного Справочного файла MapInfo
Вы можете разрешить Вашим пользователям вызов стандартного Справочного файла MapInfo из диалогового окна. Такая конфигурация принимается по умолчанию. Если пользователь нажимает клавишу F1 в активном окне диалога MapInfo, Справочная система выводит на дисплей соответствующий раздел стандартного Справочного файла MapInfo MAPINFOW.HLP.
Замечание: После вывода на дисплей окна Справки MapInfo пользователь может щелкать по различным навигационным кнопкам для просмотра Справочного файла. Пользователи могут посчитать такую конфигурацию неудобной, так как в Справочном файле MapInfo описан пользовательский интерфейс MapInfo, а не пользовательский интерфейс Вашего приложения с Интегрированной Картой.
Запрещение вызова Справочной системы
Вы можете полностью запретить вызов Справочной системы для диалоговых окон MapInfo выдачей следующего оператора языка MapBasic:
Set Window Help Off
После исполнения оператора Set Window Help Off нажатие клавиши F1 в активном окне
диалога MapInfo игнорируется.
Вызов специализированного Справочного файла
Вы можете сконфигурировать MapInfo для вызова Справочной системой специализированного Справочного файла. Например, следующий MapBasic-оператор указывает MapInfo на необходимость использования Справочного файла CUSTOM.HLP вместо MAPINFOW.HLP:
Set Window Help File ”CUSTOM.HLP” Permanent
После исполнения оператора Set Window Help File...Permanent нажатие клавиши F1 приводит к вызову приложением MapInfo Справочной системы Windows, но при этом на дисплей выводится специфицированный Вами Справочный файл вместо Справочного файла MAPINFOW.HLP. Используйте такую конфигурацию, если Вы хотите обеспечить Справку для одного или нескольких окон диалога MapInfo, но при этом не желаете предоставлять пользователю доступ ко всему содержимому стандартного Справочного файла MapInfo.
Если Вы хотите предоставить специализированную Справку для окон диалога MapInfo, Вы должны обеспечить соответствие контекстных ID-номеров (Context ID) в Вашем Справоч- ном файле ID-номерам диалоговых окон MapInfo. Для определения ID-номера диалогового окна MapInfo:
1.Запустите MapInfo с аргументом -helpdiag в командной строке.
2.Активируйте диалог MapInfo, для которого Вы хотите создать Справку.
3.Нажмите клавишу F1. Вследствие использования аргумента -helpdiag вместо отображения Справочного файла MapInfo покажет ID-номер диалога, который Вам следует записать.
227
Глава 12: Интегрированная Картография
4.Используя программное обеспечение создания Справочных файлов, отредактируйте Ваш Справочный файл таким образом, чтобы ID-номер темы в Вашем файле совпадал с ID-номером соответствующего окна диалога MapInfo.
Например, диалоговое окно MapInfo “Поиск” имеет ID-номер 2202. Если Вы хотите обеспе- чить вывод Вашей собственной Справки для этого окна, присвойте значение 2202 контекстному ID-номеру (Context ID) соответствующей темы Вашего Справочного файла.
Учтите следующие факторы:
∙В комплект поставки языка MapBasic не включен компилятор Справочных файлов в формате Windows (.HLP).
∙ID-номера диалоговых окон MapInfo могут быть изменены в будущих версиях программы.
Полезные операторы и функции языка MapBasic
В этом разделе перечислены некоторые операторы и функции языка MapBasic, применение которых особенно полезно в приложениях с Интегрированной Картой. Детальное обсуждение этих операторов и функций смотрите в Справочнике MapBasic или Справочной системе.
Имя оператора или функции |
Описание |
|
Create Legend |
Создает новое окно Легенды; позволяет |
|
|
Вам создать окно Легенды как подчиненное |
|
|
окно Вашей программы. |
|
Map |
Создает новое окно Карты. |
|
MenuitemInfoByHandler( ), |
|
|
MenuitemInfoByID( ) |
Возвращает статус команды меню в |
|
|
MapInfo (отмечена галочкой или нет). |
|
Open Table |
Открывает таблицы MapInfo. |
|
RemoteQueryHandler( ) |
Позволяет MapBasic-программам |
|
|
обрабатывать запросы на чтение от DDE- |
|
|
клиентов. |
|
Run Menu Command |
Имитирует выбор пользователем команды |
|
|
меню MapInfo или кнопки на |
|
|
инструментальной панели (ButtonPad). |
|
SearchInfo( ) |
Возвращает информацию о результатах |
|
|
исполнения функций SearchPoint( ) è |
|
|
SearchRect( ). |
|
SearchPoint( ), SearchRect( ) |
Осуществляют поиск в выбранных слоях |
|
|
окна Карта объектов в точке с заданными |
|
|
координатами (x,y) или в заданной |
|
|
прямоугольной области соответственно. |
|
|
Эти функции позволяют Вам эмулировать |
228
|
Глава 12: Интегрированная Картография |
|
инструменты MapInfo Информация и |
|
Подпись. |
Set Application Window |
Обеспечивает переподчинение окон диалога |
|
и сообщений об ошибках MapInfo. |
|
Выдайте этот оператор в Вашей |
|
клиентской программе после запуска |
|
MapInfo или подключения к работающему |
|
экземпляру MapInfo. |
Set Map |
Управляет различными режимами |
|
представления окон типа Карты. |
Set Next Document |
Переподчиняет окно MapInfo-документа |
|
(например, окно Карты или Легенды) так, |
|
что оно становится порожденным окном |
|
Вашей программы-клиента. |
Set Window |
Управляет различными режимами |
|
представления окон MapInfo. |
Shade, Set Shade |
Создает или изменяет тематические слои |
|
Карты. |
SystemInfo( ) |
Некоторые значения, возвращаемые этой |
|
функцией, предназначены специально для |
|
Интегрированной Картографии. |
|
Пример: задайте в качестве аргумента |
|
SYS_INFO_APPLICATIONWND, чтобы |
|
получить HWND-номер приложения. |
WindowID( ), WindowInfo( ) |
Возвращают информацию об окнах |
|
MapInfo, в том числе переподчиненных. |
Объектная модель механизма управления объектами OLE
На следующей диаграмме приведена схема объектной модели MapInfo. Методы и Свойства
(Properties) детально описываются на следующих страницах.
229
Глава 12: Интегрированная Картография
Объект Application (Приложение) представляет работающий экземпляр MapInfo.
Семейство MBApplications (MapBasic-Приложения) представляет список MapBasic-прило- жений, работающих в данный момент.
Семейство MBGlobals (Глобальные переменные в среде MapBasic) представляет список глобальных переменных, объявленных одним из работающих MapBasic-приложений.
Свойства объекта Application
В следующей таблице перечислены свойства, применимые к объекту Application. Все свойства в этой таблице разрешены только для чтения, за исключением свойств Visible и LastErrorCode.
230
|
|
Глава 12: Интегрированная Картография |
||
|
|
|
|
|
|
Имя свойства |
Функциональность |
||
|
|
|
|
|
|
Name |
Возвращает имя приложения (например, |
||
|
“MapInfo”). Стандартное свойство OLE. |
|||
|
|
|||
|
|
Свойство по умолчанию для объекта Application. |
||
|
FullName |
Возвращает полный маршрут к исполняемому |
||
|
|
файлу приложения. Стандартное свойство OLE. |
||
|
Application |
Возвращает значение IDispatch объекта Application. |
||
|
|
Стандартное свойство OLE. |
||
|
Parent |
Возвращает значение IDispatch порождающего |
||
|
|
объекта; для объекта Application возвращает себя |
||
|
|
самого. Стандартное свойство OLE. |
||
|
Version |
Возвращает текстовое представление номера |
|
|
|
|
текущей версии, умноженного на 100 (например, |
|
|
|
|
MapInfo 6.0.0 возвращает “600”). |
||
|
ProductLevel |
Возвращает целое значение, обозначающее |
||
|
|
“уровень” программы MapInfo. Для MapInfo |
||
|
|
Professinal возвращает 400. |
||
|
Visible |
Разрешена для записи. Логическое значение, |
||
|
|
контролирующее видимость окна приложения. |
||
|
|
Считывание позволяет определить видимость окна; |
||
|
|
присваивание свойству значения устанавливает |
||
|
|
видимость или невидимость окна. |
||
|
LastErrorCode |
Разрешено для записи. Целое значение, |
||
|
|
указывающее кодовый номер последней MapBasic- |
||
|
|
ошибки, случившейся в процессе вызова метода Do, |
||
|
|
Eval или RunCommand. Коды ошибок, |
||
|
|
возвращаемые этим свойством, превышают на 1000 |
||
|
|
соответствующие коды ошибок в среде MapBasic. |
||
|
|
Эти коды ошибок автоматически заменяются кодом |
||
|
|
следующей ошибки, но никогда автоматически не |
||
|
|
сбрасываются в 0. |
||
|
LastErrorMessage |
Возвращает строку, представляющую текст |
||
|
|
сообщения об ошибке, соответствующей значению |
||
|
|
LastErrorCode. |
||
|
|
|
|
|
Методы объекта Application |
||||
|
Имя метода |
Функциональность |
|
Do(string)
Eval(string)
Интерпретирует строку string как оператор языка MapBasic, затем выполняет этот оператор.
Интерпретирует строку string как MapBasic-выражение, вычисляет выражение и возвращает его значение. Если
231
Глава 12: Интегрированная Картография
|
выражение логическое, то возвращает “T” или “F”. |
|
RunCommand(string) |
Интерпретирует строку string как оператор языка |
|
|
MapBasic; является синонимом “Do”. |
|
RunMenuCommand |
Исполняет команду меню, указанную аргументом |
|
(menuid) |
menuid типа Integer. Пример смотрите ниже. |
|
DataObject(windowID) |
По целочисленному ID-номеру окна windowID |
|
возвращает интерфейс IUnknown, представляющий это |
||
|
||
|
окно. Для получения графического представления окна |
|
|
в виде метафайла используйте QueryInterface для |
|
|
интерфейса IDataObject. Только значения Idata и |
|
|
ObjectIUnknown разрешены для этого объекта. |
|
|
Замечание: Это “продвинутая” возможность для |
|
|
программистов, использующих язык |
|
|
программирования C. Смотрите далее в этой главе |
|
|
“Уведомления вызывающего приложения“. |
|
SetCallBack(IDispatch) |
Регистрирует объект механизма управления объектами |
|
OLE (OLE Automation) как получатель уведомлений, |
||
|
||
|
генерируемых программой MapInfo. Только одна |
|
|
функция уведомления может быть зарегистрирована в |
|
|
каждый данный момент. |
|
|
Замечание: Это “продвинутая” возможность для |
|
|
программистов, использующих язык |
|
|
программирования C. Смотрите далее в этой главе |
|
|
“Уведомления вызывающего приложения". |
|
|
|
Например, следующая VB-инструкция использует метод Do для передачи программе MapInfo оператора Map, открывающего окно Карта:
mapinfo.Do ”Map From World”
Следующая инструкция использует метод RunMenuCommand для выполнения команды меню MapInfo, имеющей значение кода 1702, которая выбирает MapInfo-инструмент Ладошка. (Для определения конкретного значения кода интересующей Вас команды меню смотрите файл MENU.DEF; 1702 является значением кода M_TOOLS_RECENTER.)
mapinfo.RunMenuCommand 1702
Свойства семейства MBApplications
Семейство MBApplications включает в себя все MapBasic-приложения, работающие в среде MapInfo в данный момент. Все свойства, перечисленные в следующей таблице, разрешены только для чтения.
Имя свойства |
Функциональность |
Item |
Возвращает значение IDispatch конкретного объекта |
|
programobject. Аргумент имеет тип VARIANT, который |
|
может приводиться к целочисленному индексу в диапазоне |
232
|
Глава 12: Интегрированная Картография |
|
|
(1..Count) или строковому значению (имя программы). |
|
|
Является стандартным свойством для семейства |
|
|
MBApplications. |
|
Count |
Возвращает длинное целое число объектов в семействе (т.е. |
|
|
число работающих приложений). |
|
Application |
Возвращает значение IDispatch приложения MapInfo. |
|
|
||
|
Стандартное свойство OLE. |
|
Parent |
Возвращает значение IDispatch порождающего объекта; |
|
для семейства MBApplications это приложение MapInfo. |
||
|
||
|
Стандартное свойство OLE. |
|
|
|
Свойства объекта в семействе MBApplications
Каждый объект в семействе MBApplications является работающим MapBasic-приложением. Для все свойств, перечисленных в следующей таблице, разрешено только чтение.
Имя свойства |
Функциональность |
Name |
Возвращает имя приложения (например, “FOO.MBX”). |
|
Стандартное свойство OLE для объекта MBApplication. |
FullName |
Возвращает полный DOS-маршрут к исполняемому .MBX |
|
файлу MapBasic-приложения. |
|
Стандартное свойство OLE. |
Application |
Возвращает значение IDispatch MapBasic-приложения. |
|
Стандартное свойство OLE. |
Parent |
Возвращает значение IDispatch порождающего объекта; |
|
äëÿ programobject это приложение MapInfo. |
|
Стандартное свойство OLE. |
Например, следующий оператор определяет имя работающей MapBasic-программы:
Dim appsList As Object
Dim firstname As String
Set appsList = mapinfo.MBApplications If appsList.Count > 0 Then
firstname = appsList(1).Name End If
Методы объекта в семействе MBApplications
Имя метода |
Функциональность |
Do(string) |
Строка string пересылается в процедуру |
|
RemoteMsgHandler MapBasic-приложения. |
Eval(string) |
Строка string передается как аргумент в функцию |
|
RemoteQueryHandler( ) MapBasic-приложения; |
|
возвращается значение этой функции. Замечание: |
233
Глава 12: Интегрированная Картография
Если выражение имеет значение типа Logical, MapInfo возвращает односимвольную строку, “T” или “F”.
Свойства семейства MBGlobals
Семейство MBGlobals включает в себя все глобальные переменные в среде MapBasic, объявленные конкретным работающим MapBasic-приложением. Все свойства, перечисленные в следующей таблице, разрешены только для чтения.
Имя свойства |
Функциональность |
Item |
Возвращает значение IDispatch конкретного |
|
объекта mbglobal. Аргумент имеет тип VARIANT, |
|
который может приводиться к целочисленному |
|
индексу в диапазоне (1...Count) или строковому |
|
значению (имя глобальной переменной). Является |
|
стандартным свойством для семейства MBGlobals. |
Count |
Возвращает длинное целое число объектов в |
|
семействе (т.е. число глобальных переменных). |
Application |
Возвращает значение IDispatch приложения |
|
MapInfo. Стандартное свойство OLE. |
Parent |
Возвращает значение IDispatch порождающего |
|
объекта; для семейства MBGlobals это объект |
|
programobject. Стандартное свойство OLE. |
|
|
Свойства объекта в семействе MBGlobals
Каждый объект семейства MBGlobals является глобальной переменной в среде MapBasic. Все свойства, перечисленные в следующей таблице, разрешены только для чтения, за исключением свойства Value.
Имя свойства |
Функциональность |
|
Value |
Разрешена для записи. Считывание свойства |
|
возвращает строку, представляющую значение |
||
|
||
|
глобальной переменной; присваивание значения |
|
|
свойству изменяет значение глобальной |
|
|
переменной. |
|
|
Свойство по умолчанию для объекта MBGlobal. |
|
Name |
Возвращает имя переменной. |
|
Стандартное свойство OLE. |
||
|
||
Type |
Возвращает текстовую строку, представляющую |
|
|
тип переменной как один из стандартных типов |
|
|
MapInfo (“Integer”, “Date” è ò.ä.). |
234