Глава 2. Разработка модуля для поиска информации в MapInfo с помощью Delphi
2.1. Интеграция MapInfo и Delphi
Пакетом MapInfo можно управлять, используя языки программирования, отличные от языка MapBasic (встроенного в MapInfo языка программирования). Написать интегрированное приложения можно на нескольких языках программирования, среди которых наиболее часто используются C/C++, Visual Basic, Borland Delphi. Такой способ разработки приложений известен как интегрированная картография, так как при этом происходит интеграция элементов MapInfo в своё приложение.
При желании можно создать интерфейс пользователя, радикально отличающийся от интерфейса MapInfo (рис.7.). Внешний вид на экране приложения с интегрированной картой определяется разработчиком. При интегрировании окна Карта MapInfo в разрабатываемую программу пользователь видит на экране оригинальное полнофункциональное окно MapInfo, а не растр, метафайл или графическое представления какого-либо другого типа. Пользователю может интерактивно взаимодействовать с картой (используя, например, инструменты Лупа для увеличения Карты). Интегрированное окно карты имеет все возможности, присущие окну Карта в среде MapInfo.
Для интеграции в программе должна присутствовать инструкция, запускающая MapInfo в фоновом режиме. Например, в программе на языке Borland Delphi можно запустить MapInfo вызовом функции CreateObject()/CreateOLEObject(). На примере будет выглядеть так:
OleMapInfo:= CreateOLEObject('MapInfo.Application');
Программа MapInfo запускается в фоновом режиме незаметно для пользователя, не выводя заставку на дисплей.
Разрабатываемое приложение осуществляет управление программой MapInfo, конструируя строки, представляющие операторы языка MapBasic, которые затем передаются в MapInfo посредством механизма управления объектами OLE (OLE Automation) или динамического обмена данных (DDE). MapInfo выполняет эти операторы точно так же, как если бы пользователь вводил их с клавиатуры в окно MapBasic.
Если необходимо открыть окно Карта, нужно использовать оператор Map языка MapBasic точно таким же образом, как в обычной MapBasic-программе. Однако в приложении с интегрированной картой должны также использовать дополнительные операторы (например, Set Next DocumentParent), чтобы окно Карта могло стать подчиненным (порожденным) окном Вашего приложения. Этот процесс известен как «переподчинение» окна. Можно переподчинить окна Карты, Списка, Графика, Отчета и Легенды.
Рис.7. Интерфейс пользователя разработанный в Borland Delphi
Для отображения карты в приложении необходимо использовать оператор Set Application Window. Этот оператор объявляет, какое окно будет окном приложения. Для всех последующих окон диалогов MapInfo будет считаться, что они порождены этим другим окном. Этот пример используется в интегрированной картографии, когда окна MapInfo показываются из других приложений.
Обычно программа, написанная на Borland Delphi, сначала создаёт объект MapInfo Object и затем посылает MapInfo оператор Set Application Window, после чего приложение на Borland Delphi становиться порождающим окном для диалогов MapInfo. Если оператор Set Application Window не был прописан, то становиться очень трудно координировать передачу фокуса между MapInfo и Borland Delphi.
Пересылка команд в программу MapInfo
После запуска программы MapInfo необходимо сконструировать текстовые строки, представляющие операторы языка Map Basic. Если установлена связь с MapInfo, используя механизм управления объектами OLE (OLE Automation), командная строка передаётся программе MapInfo методом Do.
Например:
OleMapInfo.Do ('здесь команда MapBasic');
В компоненте это реализовано процедурой ExecuteCommandMapBasic, но, в сущности, вызывается OleMapInfo.Do.
При использовании метода Do программа MapInfo исполняет командную строку точно, так как если б ее ввели в окне команд MapBasic. Возможно передать оператор в программу MapInfo, если этот оператор допустим окне MapBasic. Не возможно переслать MapBasic-оператор Dialog, поскольку его использование не разрешено в окне MapBasic.
Технические аспекты интегрированной картографии
Системные требования
- Интегрированная картография возможна только в операционной среде Windows. Можно использовать 16-битовую среду (Windows 3.1, Windows for Workgroups) или 32-битовую среду (Windows 95, Windows NT 3.51 или более поздние версии).
- Интегрированная картография требует наличия программы MapInfo 4.0 или более поздней версии. Можно использовать полную копию MapInfo или исполнительный (runtime) модуль MapInfo (специальная «усеченная» версия MapInfo, поставляемая только в качестве основы для специализированных приложений).
- Компьютер пользователя должен иметь достаточно свободной памяти для одновременной работы Вашей программы-клиента и программы MapInfo.
- Программа-клиент должна быть способна действовать в качестве контроллера механизма управления объектами OLE (OLE Automation controller) или клиента динамического обмена данных (DDE-клиента). Рекомендуется применение механизма управления объектами OLE как более быстрого и надежного метода по сравнению с динамическим обменом данных.
- Программа-клиент должна быть способна создать интерфейсные элементы (окна, формы и т.п.), в которые можно поместить окно Карты и определять Windows HWND окна
Другие технические замечания
- Для разработки приложения с интегрированной картой необходимо написать программу на языке, отличном от MapBasic, называемую в дальнейшем программа-клиент. Можно написать программу-клиент, используя различные популярные среды программирования, такие как Visual Basic (версия 3.0 или более поздняя), C, PowerBuilder или Delphi.
- Интегрированная Картография использует механизм управления объектами OLE (OLE Automation), но не использует Внедрение OLE. Когда Вы хотите поместить окно Карта MapInfo в приложение, не осуществляется его внедрение (embedding); напротив, происходит переподчинение окна посредством пересылки программе MapInfo серии командных строк. В результате окна MapInfo отображаются на дисплее как порожденные окна приложения.
- Интегрированная Картография не использует специализированные элементы управления VBX (Visual Basic Custom Control) или OCX. MapInfo Corporation не предоставляет какие-либо заголовочные файлы или библиотеки. (Программное обеспечение MapInfo включает в себя несколько динамически подключаемых библиотек (файлы .DLL), но к ним не обращаются непосредственно; эти библиотеки предназначены для внутреннего использования программой MapInfo).
Объектная модель механизма управления объектами OLE
На следующей диаграмме приведена схема объектной модели MapInfo (Рис. 8.).
Рис.8. Схема объектной модели MapInfo.
- Объект Application (Приложение) представляет работающий экземпляр MapInfo.
- Семейство MBApplications (MapBasic-Приложения) представляет список MapBasic-приложений, работающих в данный момент.
- Семейство MBGlobals (Глобальные переменные в среде MapBasic) представляет список глобальных переменных, декларированных одним из работающих MapBasic-приложений.
Пример простейшей программы
Следующая программа на Borland Delphi даст представление о том, как легко встроить окно MapInfo в другую программу.
Сначала, создадим новый проект Delphi. В процедуре FormCreate добавим следующие строки:
Const
SW_SHOWNORMAL = 1;
var
OleMapInfo: Variant;
MsgString : String;
sWinHand : String;
begin
OleMapInfo := CreateOLEObject('MapInfo.Application');// запуск MapInfo.
Str(pnlMap.Handle, sWinHand);// Указываем место где будет отображаться карта.
MsgString := 'Set Next Document Parent ' + sWinHand + ' Style 1';// переподчинение окна.
OleMapInfo. Do(MsgString); //Пересылка команд в программу MapInfo
MsgString := 'Set Application Window ' + sWinHand; // становление порождающего окна для диалогов MapInfo.
OleMapInfo.Do(MsgString); //Пересылка команд в программу MapInfo
OleMapInfo.Do('Set Window Info Parent '+IntToStr(frmGis_Spravka.handle)); // Подключение окна диалога Информация.
OleMapInfo.Do('Set Window Ruler Parent '+IntToStr(frmGis_Spravka.Handle)); // Подключение окна диалога Рулетка
end;
Как только запустили программу на Delphi, она запускает MapInfo, которая создает окно Карты. При этом MapInfo действует как «скрытый» сервер, а окно Карты ведет себя, как порожденное программой Delphi. [3]
2.2. Разработка ГИС
Для разработки интегрированной среды будем использовать язык программирования Borland Delphi 7 и геоинформационную систему MapInfo.
Delphi является среди широкого круга пользователей популярной системой объектно-ориентированного программирования, основу которой составляет язык Object Pascal.
Delphi – это система объектно-ориентированного визуального программирования. Приложения (прикладные программы) Delphi являются интерактивными системами, в которых для организации взаимодействия между пользователем и программой используются методы (подпрограммы), управляемые событиями.
MapInfo Professional – географическая информационная система (ГИС), предназначенная для сбора, хранения, отображения, редактирования и анализа пространственных данных.
Разрабатываемая ГИС на основе MapInfo будет решать следующие задачи:
- находить улицы;
- находить дома;
- подписывать дома и улицы;
- выдавать список улиц и список домов принадлежащей улице.
Главным достоинством разрабатываемой программы является, то, что она может производить поиск, подписывать, выдавать список из любых слоёв, т.е. является универсальной.
Для интеграции MapInfo и Delphi создадим новый проект Delphi. В процедуре FormCreate добавим следующие строки:
Const
SW_SHOWNORMAL = 1;
var
OleMapInfo: Variant;
MsgString : String;
sWinHand : String;
begin
OleMapInfo := CreateOLEObject('MapInfo.Application');// запуск MapInfo.
Str(pnlMap.Handle, sWinHand);// Указываем место где будет отображаться карта.
MsgString := 'Set Next Document Parent ' + sWinHand + ' Style 1';// переподчинение окна.