Интеграция приложений и данных в MapInfo

Метод интегрированной картографии как способ разработки приложений. Запуск и пересылка команд. Запрос данных от программы MapInfo. Интеграция инструментальных панелей. Схема использования уведомлений в OLE. Обнаружение ошибок времени исполнения.

Рубрика Программирование, компьютеры и кибернетика
Вид реферат
Язык русский
Дата добавления 28.10.2010
Размер файла 34,3 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

ФЕДЕРАЛЬНОЕ АГЕНСТВО ПО ОБРАЗОВАНИЮ

КЕМЕРОВСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ

Математический факультет

Реферат

На тему: «Интеграция приложений и данных в MapInfo»

студента 3 курса, группы М-064

Ткаченко Ивана Сергеевича

Кемерово 2008

Что такое Интегрированная Картография?

Интегрированная картография позволяет управлять пакетом MapInfo, используя языки программирования отличные от MapBasic. Например, если Вам хорошо знакомо программирование на языке Visual Basic, можно включить (интегрировать) окно Карты Maplnfo в Ваше приложение, написанное на языке Visual Basic, выполняя при этом основную часть или даже всю работу по программированию в среде Visual Basic. Такой способ разработки приложений известен как Интегрированная Картография, так как при этом интегрируются элементы Maplnfo в другое приложение.

Причем основную работу по поддержанию векторных карт берет на себя MapInfo (MapBasic) а вы можете создавать назначать обработчики и механизмы взаимодействия не свойственные MapBasic а также те механизмы которые MapBasic не поддерживает напрямую (например обновление карты по интернету, съем информации с датчиков на территории.

Метод Интегрированной Картографии обеспечивает простейший способ включения окон Maplnfo в приложения, разработанные в других средах программирования, не использующих MapBasic.

Вид на экране компьютера приложения с Интегрированной Картой определяется разработчиком. При желании можно создать интерфейс пользователя, радикально отличающийся от интерфейса Maplnfo. Например, на следующем рисунке показано окно Карты Maplnfo, интегрированное в форму окна диалога Visual Basic.

При интегрировании окна Карты Maplnfo в программу пользователь видит на экране оригинальное полнофункциональное окно Maplnfo, а не растр, метафайл или графическое представление какого-либо другого типа. Можно разрешить пользователю интерактивно взаимодействовать с Картой (используя, например, инструменты Лупа для увеличения Карты). Интегрированное окно Карты имеет все возможности, присущие окну Карты в среде Maplnfo.

Когда пользователь запускает приложение с встроенной Картой, заставка Maplnfo не демонстрируется.

Для создания приложения с Интегрированной Картой нужно написать программу -- но не программу на языке MapBasic. Приложения с Интегрированной Картой могут быть написаны на нескольких языках программирования, среди которых наиболее часто используются С и Visual Basic.

В программе должна присутствовать инструкция, запускающая Maplnfo в фоновом режиме. Например, в программе на языке Visual Basic Можно запустить Maplnfo вызовом функции CreateObject( ). Программа Maplnfo запускается в фоновом режиме незаметно для пользователя, не выводя заставку на дисплей.

Программа осуществляет управление программой Maplnfo, конструируя строки, представляющие операторы языка MapBasic, которые затем передаются в Maplnfo посредством механизма управления объектами OLE (OLE Automation) или динамического обмена данных (DDE). Maplnfo выполняет эти операторы точно так же, как если бы пользователь вводил их с клавиатуры в окно MapBasic.

Если нужно открыть окно Карта, используется оператор Map From языка MapBasic точно таким же образом, как в обычной MapBasic-программе. Однако в приложении с Интегрированной Картой Нужно также использовать дополнительные операторы (например, Set Next Document Parent), чтобы окно Карты могло стать подчиненным (порожденным) окном Вашего приложения. Этот процесс известен как "переподчинение" (reparenting) окна. Можно переподчинить окна Карты, Списка, Графика, Отчета и Легенды.

Переподчинение окон Maplnfo другому приложению не дает программе Maplnfo автоматического доступа к данным этого приложения. Для отображения данных приложения в окне Maplnfo Нужно предварительно записать эти данные в таблицу Maplnfo. Простейший пример на Visual Basic.

Следующая программа на Visual Basic дает представление о том, как легко встроить окно Maplnfo в другую программу.

Сначала создадим новый проект Visual Basic. В процедуре General Declarations (общие определения) объявим переменную типа Object. (В этом примере она будет называться mi) - Dim mi As Object.

Затем добавим в процедуру Form_Load следующие строки: Sub Form_Load( ):

- Set mi = CreateObject("Maplnfo.application");

- mi.do "Set Application Window " & Forml.hWnd;

- mi.do "Set Next Document Parent " & Forml.hWnd & " Style 1";

- mi.do "Open Table ""World"" Interactive Map From World";

- mi.RunMenuCommand 1702;

- mi.do "Create Menu ""MapperShortcut"" ID 17 As ""(-"" ";

- End Sub.

Если запустить программу на Visual Basic, она запускает Maplnfo, которая создает окно Карты. При этом Maplnfo действует как "скрытый" сервер, а окно Карты ведет себя как порожденное программой Visual Basic.

Подробное обсуждение интегрирования MapInfo в приложения, написанные на VB.

Последующее обсуждение показывает, как интегрировать элементы Maplnfo в приложение, написанное на языке Visual Basic (в дальнейшем VB-приложение или VB-программа).

Запуск Maplnfo. Запуск уникального экземпляра программы Maplnfo осуществляется вызовом функции CreateObject( ) языка Visual Basic с присваиванием возвращаемого значения объектной переменной. (Можно декларировать объектную переменную как глобальную; в противном случае объект Maplnfo освобождается после выхода из локальной процедуры.) Например:

- Set mapinfo = CreateObject("Maplnfo.Application").

Для подключения к ранее исполнявшемуся экземпляру Maplnfo, который не был запущен вызовом функции CreateObject(), используется функция GetObject():

- Set mapinfo = GetObject( , "Maplnfo.Application").

Функции CreateObject( ) и GetObject( ) используют механизм управления объектами OLE (OLE Automation) для связи с Maplnfo. Если необходимо применить DDE-связь вместо OLE-связи, используется функция Shell( ) языка Visual Basic для запуска программы Maplnfo, а затем используется свойство (property) LinkMode для установления DDE-связи.

В 32-разрядной версии Windows (Windows95 или Windows NT) можно запускать несколько экземпляров Maplnfo. Если запустить Maplnfo и вслед за этим программу, использующую Интегрированную Картографию и вызывающую CreateObject( ), то будут работать два независимых экземпляра Maplnfo. Однако в 16-разрядной версии может работать только один экземпляр Maplnfo; если запустить Maplnfo и вслед за этим программу, использующую Интегрированную Картографию и вызывающую CreateObject( ), то она не сможет запустить второй экземпляр Maplnfo.

Пересылка команд в программу Maplnfo. После запуска программы Maplnfo необходимо сконструировать текстовые строки, представляющие операторы языка MapBasic. Например, для исполнения программой Maplnfo MapBasic-оператора Open Table Можно задать в VB-программе следующую строку:

- msg = "Open Table ""RUSSIA.TAB""Interactive".

Если установить связь с Maplnfo, используя механизм управления объектами OLE (OLE Automation), нужно передавать командную строку программе Maplnfo методом Do. Например:

- mapinfo.Do msg.

При использовании метода Do программа Maplnfo исполняет командную строку точно так же, как если бы пользователь ввел команду с клавиатуры в окно MapBasic.

Если установиль связь с Maplnfo, используя динамический обмен данных (DDE), передаётся командная строка программе Maplnfo DDE-методом LinkExecute.

Замечание: Можно передать оператор в программу Maplnfo, если этот оператор допустим в окне MapBasic. Например, нельзя переслать MapBasic-оператор Dialog, поскольку его использование не разрешено в окне MapBasic.

Запрос данных от программы Maplnfo. Для выполнения запроса из программы-клиента значения MapBasic-выражения задайте в VB-программе строку, представляющую выражение. Например, если нужно определить значение, возвращаемое MapBasic-функцией WindowID(O), задается следующая строка (в среде Visual Basic):

- msg = "WindowID(0)".

Если установлена связь с Maplnfo, используя механизм управления объектами OLE (OLE Automation), передайте строку выражения программе Maplnfo OLE-методом Eval. Например:

- Dim result As String;

- result = mapinfо.Eval "WindowID(0)".

При использовании метода Eval программа Maplnfo интерпретирует строку как выражение языка MapBasic, определяет значение выражения и возвращает это значение в виде строки. Замечание: Если выражение приводится к логическому значению (тип Logical), Maplnfo возвращает односимвольную строку, "Т" или "Г" соответственно.

Если установлена связь с Maplnfo, используя динамический обмен данными (DDE), запросите значение выражения DDE-методом LinkRequest.

Переподчинение окон Maplnfo. После запуска Maplnfo используется оператор Set Application Window языка MapBasic для обеспечения перехвата управления программой-клиентом диалоговых окон и сообщений об ошибках программы Maplnfo. (В следующем примере "FormName" является именем формы в среде Visual Basic):

- msg = "Set Application Window " & FormName.hWnd mapinfo.Do msg.

Затем, в желаемой точке включения окна Maplnfo в Ваше VB-приложение передается Maplnfo оператор Set Next Document, за которым следует MapBasic-оператор, создающий окно. Например, следующий фрагмент кода создает окно Карта Maplnfo как подчиненное окно программы-клиента. (В этом примере "MapFrame" является именем элемента управления Picture Box (Поле Иллюстрации) в среде Visual Basic):

- msg = "Set Next Document Parent " & MapFrame.hWnd & " Style 1" mapinfo.Do msg;

- msg = "Map From States" mapinfo.Do msg.

Оператор Set Next Document позволяет "переподчинять" окна документов. Синтаксис этого оператора требует указания уникального номера HWND элемента управления в VB-программе. При последующем создании окна документа Maplnfo (с использованием операторов Map, Graph, Browse, Layout или Create Legend) создаваемое окно переподчиняется таким образом, что элемент управления программы-клиента с этим значением HWND становится для окна порождающим объектом.

Для каждого переподчиняемого окна необходимо передать программе Maplnfo из Вашей программы пару операторов -- оператор Set Next Document Parent, а затем оператор, создающий окно. После создания окна Вам может понадобиться запросить из Maplnfo значение функции WindowID(O) -- целочисленный ID-номер окна (Window ID) в Maplnfo, так как многие операторы языка MapBasic требуют задания этого номера. Этот запрос выполняется следующим образом:

- mapid = Val(mapinfо.eval("WindowID(0)")).

Нужно заметить, что даже после переподчинения окна Карты, Maplnfo продолжает управлять им. Если часть окна нужно перерисовать, Maplnfo автоматически обновляет его. Поэтому клиентская программа может не обращать внимания на сообщения о перерисовке, адресованные подчиненному окну.

Если программировать на С, то просто так игнорировать сообщения о перерисовке на удастся. В этом случае нужно добавить в описание порождающего окна стиль WS_CLIPCHILDREN.

Переподчинение окон Легенд, растровых диалогов и других окон Maplnfo. Maplnfo имеет несколько немодальных окон, включая окно Информации, окно Сообщений, диалогов, относящихся к растрам и окно Статистики. Чтобы изменить порождающее окно для одного из этих специальных "плавающих" окон, используется оператор MapBasic Set Window ... Parent. Например, программа-пример FindZip использует следующее предложение:

- mapinfо.do "Set Window Info Parent " & FindZipForm.hWnd.

Нужно заметить, что способ переподчинения окна Информации другой, чем для окна Карты. В последнем случае не используется предложение Set Next Document. Дело в том, что может существовать несколько окон Карты.

Окна Легенды -- особый случай. Обычно существует только одно окно Легенды, так же, как и одно окно Информации. Однако при помощи оператора MapBasic Create Legend Можно создавать дополнительные окна Легенды.

Для одного окна Легенды используется оператор MapBasic Window Legend Parent.

Чтобы создать дополнительное окно Легенды, используется оператор MapBasic Set Next Document и оператор Create Legend. Нужно заметить, что в этом случае Вы создаете Легенду, которая привязана к одному определенному окну Карты или окну Графика. Такое окно Легенды не изменяется, когда другое окно становится активным.

Можно создать "плавающее" окно Легенды внутри окна Карты. Для этого в операторе Set Next Document указать окно Карты как порождающее.

Интеграция инструментальных панелей Maplnfo. Нельзя переподчинить инструментальные панели Maplnfo. Если требуется, чтобы клиентская программа имела такие панели, нужно создать кнопки на языке, который используется. Например, если используется Visual Basic, то нужно создать кнопки при помощи Visual Basic.

Если требуется, чтобы кнопка панели Visual Basic эмулировала стандартную кнопку Maplnfo, используется метод RunMenuCommand. (Этот метод действует так же, как оператор MapBasic Run Menu Command). Например, программа может содержать процедуру Inf oTool_Click с оператором mapinfо.RunMenuCommand 1707.

Когда пользователь нажимает на соответствующую кнопку, программа вызывает метод Maplnfo RunMenuCommand, который активизирует инструмент под номером 1707 (инструмент Информация Maplnfo).

"Магический" номер 1707 ссылается на инструмент Информация. Вместо того, чтобы использовать такие числа, можно использовать идентификаторы, более понятные в тексте программы. MapBasic определяет идентификатор M_TOOLS_PNT_QUERY, который имеет значение 1707.

Таким образом, этот пример можно записать так:

- mapinfо.RunMenuCommand M_TOOLS_PNT_QUERY.

Использование идентификаторов (типа M_TOOLS_PNT_QUERY) делает программу более легкой для чтения. Однако, если планируется использовать идентификаторы в коде, то нужно включить соответствующий заголовочный файл MapBasic. Если используется Visual Basic, используется файл MAPBASIC.BAS. Для С используется файлМАРВА81С.Н.

В следующей таблице приведены идентификаторы инструментальных кнопок Maplnfo. Они содержатся в файлах MAPBASIC.BAS (для Visual Basic), MAPBASIC.H (для С), и MENUS.DEF (для MapBasic).

Таблица 1 - Идентификаторы инструментальных кнопок Maplnfo

Кнопки панели Операции

Номер

Идентификатор

Стрелка

1701

M_TOOLS_SELECTOR

Выбор в рамке

1722

M_TOOLS_SEARCH_RECT

Выбор в круге

1703

M_TOOLS_SEARCH_RADIUS

Выбор в области

1704

M_TOOLS_SEARCH_BOUNDARY

Увеличивающая лупа

1705

M_TOOLS_EXPAND

Уменьшающая лупа

1706

M_TOOLS_SHRINK

Ладошка

1702

M_TOOLS_RECENTER

Информация

1707

M_TOOLS_PNT_QUERY

Подпись

1708

M_TOOLS_LABELER

Линейка

1710

M_TOOLS_RULER

Переноска

1734

M_TOOLS_DRAGWINDOW

Символ

1711

M_TOOLS_POINT

Линия

1712

M_TOOLS_LINE

Полилиния

1713

M_TOOLS_POLYLINE

Дуга

1716

M_TOOLS_ARC

Полигон

1714

M_TOOLS_POLYGON

Эллипс

1715

M_TOOLS_ELLIPSE

Прямоугольник

1717

M_TOOLS_RECTANGLE

Скругленный прямоугольник

1718

M_TOOLS_ROUNDEDRECT

Текст

1709

M_TOOLS_TEXT

Рамка

1719

M_TOOLS_FRAME

Также можно создавать пользовательские кнопки, которые вызывают определенные процедуры при нажатии на них.

Настройка "быстрых" меню Maplnfo. Maplnfo вызывает "быстрые" меню, если пользователь нажимает правую кнопку мышки в окне Maplnfo. Эти меню появляются даже во внедренных приложениях. В зависимости от характера приложения можно модифицировать или даже удалить такое меню.

Чтобы удалить одну или несколько команд из локального меню, используется оператор MapBasic Alter Menu ... Remove или переопределяется меню целиком, используя оператор Create Menu.

Чтобы добавить команду к локальному меню, используется оператор MapBasic Alter Menu ... Add и синтаксис предложений Calling OLE или Calling DDE.

Чтобы удалить "быстрое" меню полностью, используется оператор MapBasic Create Menu и управляющий код " (- " как новое определение меню. Например, следующий оператор разрушает "быстрое" меню для окон Карты:

- mapinfo.do "Create Menu ""MapperShortcut"" ID 17 As ""(-"" ".

Вывод на печать интегрированного окна Maplnfo. Можно использовать оператор Print Win языка MapBasic для вывода окна Maplnfo на печать даже в том случае, когда оно переподчинено:

- Private Sub Menu_PrintMap_Click( );

- mapinfo.do "PrintWin" End Sub.

Нужно заметить, что оператор PrintWin печатает Карту на отдельной странице.

Также можно использовать оператор MapBasic Save Window для сохранения содержимого окна Карты в формате Windows metafile (WMF). Если пользователь выбирает PrintForm, программа создает метафайл с содержимым окна Карты, присоединяет его к форме и затем использует метод Visual Basic PrintForm.

Обнаружение ошибок времени исполнения. Когда клиентская программа посылает в Maplnfo командную строку, возможно возникновение ошибок. Например, команда Map From World потерпит неудачу, если таблица World не открыта. Maplnfo в этом случае сгенерирует код ошибки.

Чтобы обработать ошибку Maplnfo, установите обработчик. В Visual Basic, например, используется оператор On Error.

Распечатка кодов ошибок приведена в текстовом файле ERRORS.DOC.Нужно заметить, что свойство LastErrorCode возвращает значения, которые на 1000 больше, чем коды в ERRORS.DOC. Другими словами, если возникла ошибка с кодом 311, то LastError Code=1311.

Завершение программы Maplnfo. Если запущен новый экземпляр Maplnfo вызовом функции CreateObject( ), то этот экземпляр Maplnfo завершается автоматически при освобождении соответствующей объектной переменной. Если объектная переменная является локальной, она автоматически освобождается при выходе из локальной процедуры. Для освобождения глобальной объектной переменной необходимо явно присвоить этой переменной значение "Nothing":

- Set mapinfo = Nothing.

Если используется для связи с Maplnfo динамический обмен данных (DDE), можно завершить исполнение Maplnfo, используя DDE-метод LinkExecute для пересылки командной строки "End Maplnfo" из Вашей программы в программу Maplnfo.

Замечание о командных строках MapBasic. Как показано ранее, можно в VB-программе создавать строки, представляющие операторы языка MapBasic, и затем пересылать эти строки в программу Maplnfo посредством OLE-метода Do. Нужно заметить, что можно объединить два и более оператора в одну командную строку, как показано ниже (в языке Visual Basic символ & выполняет конкатенацию строк):

- Dim msg As String;

- msg="Open Table ""States""Interactive";

- msg=msg & "Set Next Document Parent " & Frm.hWnd & " Style 1";

- msg=msg & "Map From States";

- mapinfo.do msg.

При обработке командной строки в процессе исполнения Maplnfo автоматически определяет, что данная строка содержит три отдельных MapBasic-оператора -- оператор Open Table, оператор Set Next Document, и оператор Map From. Программа Maplnfo способна различать в строке отдельные операторы, так как слова Open, Set и Map являются зарезервированными ключевыми словами языка MapBasic.

Нужно отметить наличие пробела после ключевого слова Interactive. Его присутствие необходимо, так как без этого пробела командная строка содержала бы подстроку "InteractiveSet", не имеющую смысла в синтаксисе языка MapBasic. Поскольку каждая командная строка оканчивается пробелом, Maplnfo может определить, что подстроки Interactive и Set являются отдельными ключевыми словами.

Использование уведомляющих вызовов (Callbacks) для получения информации из Maplnfo.

Можно построить приложение так, чтобы Maplnfo автоматически посылало информацию клиентской программе. Например, можно сделать так, чтобы всякий раз, когда изменяется активное окно Карты, Maplnfo вызывало клиентскую программу, чтобы сообщить ID-номер окна. Такой тип уведомления известен как обратный вызов или уведомление (callback).

Обратные вызовы позволяют, чтобы Maplnfo посылало информацию клиентской программе в следующих случаях:

Пользователь применяет инструмент в окне. Например, если пользователь производит перемещение объекта мышкой в окне Карты, Maplnfo может вызвать клиентскую программу, чтобы сообщить х-- и у--координаты.

Пользователь выбирает команду меню. Например, предположим, что приложение настраивает "быстрое" меню Maplnfo (меню, возникающее при нажатии правой кнопки мышки). Когда пользователь выбирает команду из этого меню, Maplnfo может вызвать клиентскую программу, чтобы сообщить ей о выборе.

Изменяется окно Карты. Если пользователь изменяет содержание окна Карты (например, добавляя или передвигая слои), Maplnfo может послать клиентской программе идентификатор этого окна. (Это аналогично процедуре обработчика MapBasic WinChangedHandler.)

Изменяется текст в строке сообщений Maplnfo. Строка состояния Maplnfo не появляется автоматически в приложениях Интегрированной Картографии. Если требуется, чтобы клиентская программа эмулировала строку состояния Maplnfo, то нужно построить приложение так, чтобы Maplnfo сообщало вашей клиентской программе об изменениях текста в строке состояния.

Требования к функциям уведомления. Если планируется использовать обратные вызовы, клиентская программа должна быть способна функционировать, как DDE-сервер или как сервер Автоматизации OLE. Visual Basic 4.0 Professional Edition и C++ могут создавать такие приложения. Однако приложения Visual Basic 3.0 не могут являться серверами Автоматизации OLE, поэтому они должны использовать DDE.

Схема использования уведомлений в OLE. Краткая схема использования повторных вызовов посредством OLE:

1. Используя Visual Basic 4.0, C++, или другой язык, позволяющий создать OLE-сервер, пишется определение класса, включающее один или большее количество методов OLE.

Если требуется имитировать строку состояния Maplnfo, создается метод, называемый. SetStatusText. Определяется этот метод так, чтобы у него был один аргумент: строка.

Если нужго, чтобы Maplnfo сообщало клиентской программе о выборе команды меню или кнопки, пишется один или несколько дополнительных методов с произвольными именами. Каждый из этих методов должен иметь один аргумент: строку.

Создаётся объект, используя класс. Например, если название класса "CMyClass", следующий оператор Visual Basic создает объект этого класса:

- Public myObject As New CMyClass.

5. После того, как программа запустит Maplnfo, вызывается метод Maplnfo SetCallback и точно указывается название объекта:

- mapinfo.SetCallback myObject.

6. Если нужно, чтобы Maplnfo сообщало клиентской программе, когда пользователь применяет инструментальную кнопку, создаётся такая кнопка оператором Alter ButtonPad ... Add. Определяется кнопка в соответствии с именем метода (см. шаг 4).

Если нужно, чтобы Maplnfo сообщала клиентской программе, когда пользователь выбирает команду меню, определите такую кнопку оператором Alter Menu ... Add с указанием имени метода (см. шаг 4).

Синтаксис C/C++ для функций уведомления. Если используется метод Maplnfo SetCallback, Maplnfo может автоматически генерировать обратные вызовы для объекта IDispatch. Обратные вызовы стандарта Maplnfo имеют следующий синтаксис:

- SCODE SetStatusText(LPCTSTR IpszMessage).

Maplnfo вызывает метод SetStatusText всякий раз, когда изменяется содержание строки сообщений в Maplnfo. Единственный аргумент -- текст сообщения в строке состояний:

- SCODE WindowContentsChanged(Unsigned Long windowID).

Maplnfo вызывает метод WindowContentsChanged всякий раз, когда изменяется содержание окна Карты. Единственный аргумент представляет собой идентификатор этого окна. Этот повторный вызов аналогичен процедуре MapBasic WinChangedHandler.

Другие способы использования уведомлений. Как говорилось ранее, Maplnfo может использовать обратные вызовы OLE, чтобы послать информацию клиентской программе. В некоторых случаях, однако, нужно применять повторные вызовы, которые не используют OLE. Например, если вы пишете программы в Visual Basic 3.0, нельзя использовать OLE, потому что Visual Basic 3.0 не позволяет создавать собственные серверы Автоматизации OLE.

Maplnfo поддерживает два типа уведомлений, которые не используют механизм OLE: использующие DDE, и использующие приложения MapBasic (файлы МВХ).

Обратные вызовы DDE. Когда вы создаете кнопки на инструментальной панели или команды меню, вы указываете предложение Calling. Чтобы пользоваться обратным вызовом посредством DDE, используется синтаксис вызова DDE-сервера. Всякий раз, когда пользователь использует кнопку или команду меню, Maplnfo открывает DDE-связь с DDE-сервером, и затем посылает строку Вашему объекту. Строка использует формат, обсужденный в предыдущей секции (например, " Ml:,,,,,, 101 ").

Процедура Form Load посылает Maplnfo оператор Alter ButtonPad ... Add с предложением Calling DDE "FindZip", "MainForm".

Всякий раз, когда пользователь применяет инструмент, Maplnfo открывает DDE- связь с программой и посылает строку "MainForm" объекту. ("MainForm" -- значение свойства формы LinkTopic).

Обратные вызовы МВХ. Если вы создаете приложение MapBasic (файл МВХ), Можно сконструировать Ваши кнопки и команды меню так, чтобы они вызвали MapBasic процедуры в МВХ. В предложении вызова используется синтаксис вызова процедуры MapBasic-программы.

После того, как Приложение на языке Visual Basic запустит Maplnfo, запустите МВХ, послав Maplnfo строку вида:

- mapinfo.do "Run Application ""C:\MB\MYAPP.MBX"" ".

Картография с поддержкой Visual C++ и MFC.

Создание нового проекта:

1. Запустить Visual C++ 2.x (32-битную) или 1.5х (16-битную).

2. Выполнить команду FILE > NEW для создания нового проекта или (PROJECT > APPWlZARD... в версии 1.5).

3. Запустить ассистирующую процедуру MFC App Wizard. Для первого раза выберите режим о дно документного окна (SDI), а не многодокументного интерфейса (MDI). Помните, что не обязательно сразу подключать стандартную поддержку OLE. Если нужно использовать уведомления из приложения в Maplnfo, то заказать поддержку OLE Automation на шаге 3 из 6 процедуры MFC App Wizard.

4. Собрать программу и запустить ее, чтобы убедиться в том, что она работает.

Добавление клиентской поддержки OLE Automation. Если Вы не заказали поддержку OLE в процедуре App Wizard, можно добавить клиентскую поддержку OLE Automation следующим образом:

1. Откройте файл STDAFX.H и добавьте строки:

- ttinclude <afxole.h>ttinclude <afxdisp.h>.

2. Откройте главный файл текста программы (т.е. имя проекта СРР) и добавьте следующие строки в начало Cu^#n^oeK7?iaApp::InitInstance:

- if ( !AfxOleInit( )) {AfxMessageBox(IDP_OLE_INIT_FAILED) ; return FALSE.

3. Добавьте строчку в файл строчных ресурсов (с названием имяпроекта.НС). Для этого откройте ресурс "String Table", выполните команду Resource > New String (в версии 1.5 для этого используется AppStudio). Присвойте значение ID: "IDP_OLE_INIT_F AILED" и значение Caption: "He удалось инициализировать OLE. Проверьте правильность версии OLE-библиотек." Закройте и сохраните файл ресурсов.

Создание класса поддержки Maplnfo. В диалоге PROJECT > CLASS WIZARD (BROWSE > CLASSWlZARD в версии 1.5) откройте раздел OLE Automation и нажмите на кнопку "Read Type Library". Найдите в Вашем каталоге Maplnfo файл MAPINFOW.TLB. Нажмите ОК, и будет создан класс, с помощью которого Можно обращаться к Maplnfo через механизм управления объектами OLE (OLE Automation).

Откройте главный файл с текстом программы (с названием .СРР) и добавьте в него следующие строки.

* После всех директив # includes:

- ttinclude "Maplnfow.h".

* Сразу за объявлением "СимяпроектаАрр theApp" добавьте объявление переменной:

- DMapInfo mapinfo.

* Ближе к концу Cu.w#npoeK7?iaApp::InitInstance, но перед вызовом OnFileNew(): mapinfо.CreateDispatch("Maplnfо.Application").

Откройте файл MAPINFOW.H и добавьте в конец файла следующие строки: extern DMapInfo mapinfо; ttinclude "маршрут-к-каталогу\mapbasiс.h".

Если Вы работаете в Visual C++ 1.5, Нужно еще вручную добавить названия OLE-библиотек в командную строку сборки (link command line); Visual C++ 2.x делает это самостоятельно. Для этого нужно выполнить команду Options > Project... и нажать на кнопку Linker -- Выберите переключатель "Common to both" в окошко "Libraries:" слова:

- compobj, storage, ole2, ole2disp, ole2nls, mfcoleui.

Тестирование. Добавьте еще одну строчку в конец функции Cu^#n^oeK7?iaApp::InitInstance, сразу после вызова CreateDispatch (его добавление описано выше):

- MessageBox(0, mapinfо.GetFullName( ), mapinfо.GetName( ), МВ_ОК).

Соберите снова Вашу программу. При ее запуске Нужно увидеть сообщение с заголовком "Mapinf о Professional" и полным DOS-маршрутом к Mapinf о. Это означает, что Maplnfo успешно запустилась через механизм OLE Automation. Позже тестирующую строку "::MessageBox..." можно закомментировать или удалить.

Переопределение "быстрых" меню. Встраивая Карту в Ваше приложение, Можно украсить ее всеми сервисными средствами Maplnfo. Иногда этот сервис не нужен и мешает; например, стандартное быстрое меню для окна Карты включает в себя команду дублирования окна. Ее нужно удалить из быстрого меню, чтобы она не вводила в заблуждение пользователей Вашего приложения.

Для этого ближе к концу текста СимяпроектаАрр::1пШпв1апсе сразу после вызова CreateDispatch добавьте следующие строки:

// удалить вызов Справочной системы:

- mapinfо.Do("Set Window Help Off");

// Удаление команды дублирования из "быстрого меню":

- mapinfо.Do("Create Menu \"MapperShortcut\" ID 17 as \"(-\"").

Здесь же можно добавить другие инструкции, сокращающие объем сервиса, идущего от Maplnfo.

Переподчинение диалогов Maplnfo. Очень важно научиться переподчинять диалоги Maplnfo, появляющиеся из окна Вашего приложения, особенно, если они предназначаются для заполнения пользователем. Этот прием дает уверенность в том, что диалог будет появляться над окном приложения и что окно приложения будет неактивным все время, пока пользователь заполняет диалог Maplnfo. В следующем примере показано, как переподчинить два диалога Maplnfo (например, используя RunMenuCommand с заданным аргументом) и сообщения об ошибках, которые Maplnfo показывает, обнаруживая непонятные события.

В тексте MainFrm.CPP, для функции CMainFrame::OnCreate надо добавить:

* после всех директив #includes:

- ttinclude "Maplnfow.h".

* В конце текста CMainFrame::OnCreate:

- char str[256];

- sprintf(str, "Set Application Window %lu", (long)(UINT)m_hWnd);

- mapinfo.Do(str).

Чтобы убедиться в том, что это сработало, добавьте строку: mapinfo.Do("Note \"Привет от Maplnfo\""); в текст функции CимяпроектаApp::InitInstance сразу после вызова OnFileNew(). Это приведет к тому, что Maplnfo покажет один из своих стандартных диалогов изнутри прикладной программы.

После организации подобного переподчинения рекомендуется провести промежуточное тестирование.

Добавление окна Карты. Теперь, когда MFC-приложение заработало и Вы убедились, что к Maplnfo можно обращаться через OLE Automation, пора сделать то, ради чего все это затевалось -- добавить окно Карты в приложение.

Откройте диалог Project > ClassWizard (или Browse > ClassWizard в версии 1.5). Выберите класс представлений (CuManpoeKmaView) и раздел "Message Maps". В самом левом окошке списка выберите объект "CuM&npoeKmd4i&w".

В списке "Messages" выберите "WM_CREATE", нажмите на "Add Function"; выберите "WM_DESTROY", нажмите на "Add Function"; выберите "WM_SIZE", и нажмите на "Add Function".

В заголовочный файл для представлений (имяпроектаУЧУ.Н) добавьте строки:

- unsigned long m_windowid;

- HWND;

m_windowhwnd.

В текст файла представлений (имя проекта Ч^Н .СРР) добавьте строки:

* после всех директив # includes:

ttinclude "Maplnfow.h".

* В конструкторе (CuM&npoeKma4iew.:CuM&npoeKma4iew) инициализируйте переменные: m_windowid = 0 ; m_windowhwnd = 0.

* В метод OnCreate добавьте следующий отрывок после вызова CView: :OnCreate:

- //стиль для окна Карты должен быть ClipChildren;

- SetWindowLong(m_hWnd, GWL_STYLE;

- GetWindowLong(m_hWnd, GWL_STYLE);

- |WS_CLIPCHILDREN);

- char str [256];

- mapinf о . Do ( "Open Table \"States\" Interactive");

- sprintf ( str;

- "Set Next Document Parent %lu Style 1 Map From States" , (long) (UINT)m_hWnd);

- mapinf o. Do (str);

- m_windowid = atol (mapinf о . Eval ( "WindowID ( 0 ) " ) ) ; sprintf (str, "Windowlnf о ( 0 , %u)", WIN_INFO_WND) ; m_windowhwnd = (HWND) atol (mapinfo. Eval (str) ).

* В текст метода OnDestroy добавьте перед вызовом CView: :OnDestroy:

- if (m_windowhwnd) {: :DestroyWindow(m_windowhwnd) ; m_windowhwnd = NULL; m_windowid = OL.

В текст метода OnSize добавьте после вызова CView: :OnSize: if (m_windowhwnd && ex > 0 && cy > 0) {: :MoveWindow(m_windowhwnd, 0, 0, ex, cy, TRUE).

Добавление команд меню для Карты. Все элементы меню добавляются с помощью описанной ниже процедуры. Пример показывает, как добавить команду Карта > Управление слоями.

1. Откройте файл ресурсов (имяпроекта.'КС), откройте ресурс "Мепи"и выберите IDR_MAINFRAME. (В версии Visual C++ 1.5 нужно воспользоваться AppStudio).

2. Добавьте новое меню "Карта" и команду "Управление слоями" и сохраните КС-файл.

В диалоге Project > ClassWizard (Browse > ClassWizard... в версии 1.5) откройте раздел "Message Map" и выберите CuManpoeKmaView из списка "Class Name". В списке "Object ID" выберите ID-номер для создаваемой команды меню -- по умолчанию это ID_MAP_LAYERCONTROL. Как только Вы это проделаете, появятся сообщения COMMAND и UPDATE_COMMAND_UI в окне "Messages". Добавьте прототипы функций, нажимая для каждого сообщения кнопку "Add Function" и принимая стандартные имена.

В тексте класса CuManpoeKmaView Вы увидите, что добавлены обе функции. Добавьте к текстам функций следующие строки:

- void CuManpoeKmaVievi: : OnMapLayercontrol ( );

- {mapinfо.RunMenuCommand(M_MAP_LAYER_CONTROL); };

- void СимяпроектаЧ±еУ1: :OnUpdateMapLayercontrol(CCmdUI* pCmdUI) {pdndUI->Enable(m_windowid) ; }.

Добавление кнопок и процедур-обработчиков. Все кнопки на инструментальные панели могут быть добавлены описанным ниже способом. Этот пример показывает, как добавить кнопки Mapinf о: Стрелку, Ладошку и обе Лупы. Для удобства мы также добавим их в новое меню "Программы" (или "Tools"); позволяет добавить их в инструментальную панель несколько более простым способом, используя ClassWizard.

Сначала, следуя приведенным выше инструкциям добавления команды меню, создайте новое меню "Программы" с четырьмя новыми элементами ("Выбрать", "Сдвинуть", "Увеличить" и "Уменьшить"). Для каждой команды определите функции UPDATE_COMMAND_UI и COMMAND, используя коды из файла MAPBASIC.H (M_TOOLS_SELECTOR, M_TOOLS_RECENTER, M_TOOLS_EXPAND, и M_TOOLS_SHRINK); эта процедура также описана выше. После этого скомпилируйте и протестируйте программу.

Открыв RC-файл для проекта, выберите растровый ресурс IDR_MAINFRAME и создайте растр на 64 пиксела шире (чтоб поместились 4 кнопки шириной 16-пикселов). На этом растре нужно разместить изображения четырех кнопок справа от кнопки вставки.

Откройте строчный ресурс и добавьте описания для каждой кнопки. При этом нужно следить за тем, чтобы ID-номера строк-описаний совпадали с номерами ранее заданных команд; строки можно задавать также, как и в файле MAPINFOW.MNU, например, номеру ID_TOOLS_SELECTOR соответствует "Выбрать объект на Карте\пСтрелка".

В тексте MAINFRM.CPP найдите массив UINT BASED_CODE buttons[ ] типа static и вставьте ID-константы в этот массив в том порядке, в котором они появляются в растровом ресурсе.

Чтобы корректно работать с кнопками, мы должны следить за тем, какая из них выбрана в данный момент. В текст файла CuManpoeKmaView добавьте объявление целой переменной, которая будет хранить значение выбранной кнопки: int m_eMouseMode;

6. Эту переменную нужно инициализировать в конструкторе классов, чтобы задать начальную нажатую кнопку на экране. Для этого нужно пользоваться заданными в Maplnfo константами:

- m_eMouseMode = M_TOOLS_SELECTOR.

Если Вы сначала задали команды меню, то у Вас уже есть описания функций COMMAND и UPDATE_COMMAND_UI; если нет, то добавим их способом, описанном в предыдущем примере.

Задайте обновление интерфейса, вызывая CCmdUI::SetRadio в каждой OnUpdate-процедуре и задайте переменные m_eMouseMode соответственно процедурам ОпТсхЛзИмяИнструмента. Ваши добавления должны выглядеть примерно так:

- void CuMHnpoeKtndVievi: :OnToolsSelector ( ) {m_eMouseMode = M_TOOLS_SELECTOR; mapinf о. RunMenuCommand (M__TOOLS_SELECTOR) ; };

- void СимяпроектаЧ±етя: :OnToolsGrabber ( ) {m_eMouseMode = M_TOOLS_RECENTER; mapinfо.RunMenuConrmand(M_TOOLS_RECENTER); };

- void СимяпроектаЧ±етя: :OnToolsZoomin( ) {m_eMouseMode = M_TOOLS_EXPAND; mapinfо.RunMenuCommand(M_TOOLS_EXPAND); };

- void СимяпроектаЧ±етя: :OnToolsZoomout ( ) {m_eMouseMode = M_TOOLS_SHRINK; mapinfо.RunMenuCommand(M_TOOLS_SHRINK); };

- void CuMHnpoeKtndVievi: :OnUpdateToolsSelector (CCmdUI* pCmdUI) {pCmdUI->SetRadio(m_eMouseMode == M_TOOLS_SELECTOR); pCmdUI->Enable(m_windowid); };

- void CuMHnpoeKtndVievi: rOnUpdateToolsGrabber (CCmdUI* pCmdUI) {pCmdUI->SetRadio(m_eMouseMode == M_TOOLS_RECENTER); pCmdUI->Enable(m_windowid); };

- void CuMHnpoeKtndVievi: :OnUpdateToolsZoomin(CCmdUI* pCmdUI) {pCmdUI->SetRadio(m_eMouseMode == M_TOOLS_EXPAND); pCmdUI->Enable(m_windowid); };

- void CuManpoeKmaVievi: :OnUpdateToolsZoomout (CCmdUI* pCmdUI) {pCmdUI->SetRadio(m_eMouseMode == M_TOOLS_SHRINK) ; pCmdUI->Enable(m_windowid) ; }.

Обработчики ошибок Maplnfo. Maplnfo пересылает информацию об ошибках в приложение, использующее Интегрированную Картографию, посредством MFC-класса COleDispatchException. Maplnfo возвращает код ошибки в переменной m_wCode класса COleDispatchException и описание ошибки в переменной m_str Description класса COleDispatchException. Обычно ошибки OLE общего характера передаются через класс COleException. Нужно обработать эти ошибки внутри Вашего приложения, иначе ими займется обработчик MFC-ошибок более высокого уровня, а мы получим сообщение "Command failed". Можно добавить обработчик для каждой ошибки в каждый метод DMapInfo. В следующем примере показано, как это делается для метода DMapInfo: :Do.

Оригинальный текст метода DMapInfo::Do, порожденный Class Wizard, выглядит так:

- void DMapInfo: :Do(LPCTSTR command) {Static BYTE BASED_CODE parms[] = VTS_BSTR;

- InvokeHelper ( 0x6 0 0 1 0 0 Ob , DISPATCH_METHOD , VT_EMPTY , NULL, parms , command).

Усовершенствованный метод DMapInfo::Do, включающий обработку исключительных ситуаций, выглядит так:

- void DMapInfo: :Do(LPCTSTR command) {Static BYTE BASED_CODE parms [] = VTS_BSTR; try {InvokeHelper (0x60 0100 Ob, DISPATCH_METHOD, VT_EMPTY, NULL, parms, command); } catch (COleDispatchException *e) {// Обработка исключительной ситуации в Вашем приложении. // Ошибка помещается в e->m_wCode;

- AfxMessageBox(e->m_strDescription);

- e->Delete( ); } catch (COleException *e) {AfxMessageBox("Fatal OLE Exception!");

- e->Delete( ).

Добавление поддержки сервера OLE Automation. В файле СимяпроектаТУос.стртр добавьте настройку диспетчера (Dispatch map) после настройки сообщений (Message map):

- BEGIN_DISPATCHJV[AP(Cu^7yweK7?iaDoc, CDocument) //{{АГХ_В18РАТСН_МАР(СильжгароегетаВос) //ВНИМАНИЕ: здесь ClassWizard добавит или удалит настроечные макросы //Не редактируйте содержимое этих автоматически созданных фрагментов // кода //}}AFX_DISPATCH_MAP END_DISPATCH_MAP( ).

Добавьте в текст файла СимяпроекпгаТ)ос.срр конструктор СимяпроекпгаТ)ос: EnableAutomation( ); Af xOleLockApp ( ).

Добавьте в текст файла СимяпроекпгаТ)ос.срр деструктор СимяпроекпгаТ)ос:

- Af xOleUnlockApp ( ).

Добавьте в текст файла СимяпроектаТ)ос.1с1 раздел "Dispatch" после разметки сообщений: // Автоматически созданные функции OLE-диспетчера //ВНИМАНИЕ: здесь ClassWizard добавит или удалит функции //Не редактируйте содержимое этих автоматически созданных фрагментов // кода //}}AFX_DISPATCH DECLARE_DISPATCH_MAP( ).

В приведенном выше фрагменте кода показано, как добавить поддержку механизма управления OLE-объектами в порожденный CDocument-класс. Используя MFC, можно также просто добавить поддержку механизма управления OLE-объектами любому классу, порожденному CCmdTarget. Так для MDI-приложения Можно добавить интерфейс механизма управления OLE-объектами либо порожденному классу CWinApp, либо порожденному классу CMDIFrameWnd; оба они были порождены классом CCmdTarget. Причиной этого является то, что указатель IDispatch для уведомлений Maplnfo можно устанавливать только раз. В MDI-приложении окна документов уничтожаются при закрытии. Если указатель IDispatch будет установлен для документа, то он исчезнет вместе с окном.

Добавление уведомления (callback) WindowContentsChanged. Если Вы создаете приложение с одним окном (SDI) и добавили в класс Симяпроекта Оос список сообщений для диспетчера, то тогда можно установить указатель на уведомление в конструкторе СимяпроектаТ)ос или в любом другом месте, где он будет вызван только один раз:

- mapinfо.SetCallback(this->GetIDispatch(FALSE)).

В диалоге Project > Class Wizard выберите раздел "OLE Automation" и из списка "Class Name" выберите класс, для которого разрешено использование OLE Automation (в нашем примере это СимяпроектаТУос). Выберите "Add Method" и задайте имя метода "WindowContentsChanged", возвращаемый тип "SCODE" и список аргументов "long IWindowID". После нажатия на ОК и выхода из диалога Class Wizard автоматически обновляет файлы СимяпроектаОос.СРР и файлы заголовков. В СРР-файле заполните тело функции WindowContentsChanged и обеспечьте обработку сообщений. В этой функции удобнее всего обрабатывать легенду.

Интеграция с Delphi. Запуск и связывание с сервером MapInfo. Итак рассмотрим простейший компонент для запуска и управления MapInfo (TKDMapInfoServer):

- unit KDMapInfoServer;

- interface uses ComObj, Controls, Variants, ExtCtrls, Windows, Messages,

- SysUtils, Classes;

- const scMapInfoWindowClass = 'xvt320mditask100';

- icWinMapinfo = 1011;

- icWinInfoWindowid = 13;

- type TEvalResult = record AsVariant: OLEVariant;

- AsString: string;

- AsInteger: Integer;

- AsFloat: Extended;

- AsBoolean: Boolean;

- end;

- TKDMapInfoServer = class(TComponent) private { Private declarations } // Владелец FOwner : TWinControl;


Подобные документы

  • Сущность картографии и обзор возможностей MapInfo Professional. Процедура установки и лицензирование программы. Использование внешних данных. Работа с инструментальными панелями, сохранение, закрытие и экспорт результатов. Внедрение Карт программы.

    учебное пособие [9,1 M], добавлен 24.03.2009

  • Изучение основных принципов разработки приложений баз данных в среде Delphi. Создание таблиц, псевдонима и вычисляемых полей базы данных. Особенности организации поиска и фильтрации. Сортировка данных в таблицах. Построение запросов. Генерация отчетов.

    курсовая работа [1,3 M], добавлен 05.02.2017

  • Администрирование баз данных. Проектирование баз данных, язык запросов к базе данных. Анализ средств разработки приложений. Планирование разработки программы "Электронный каталог" для библиотеки ОГАУ, предварительный проект и практическая реализация.

    дипломная работа [1,2 M], добавлен 02.06.2015

  • Общее понятие геоинформационных систем. Характеристика основных видов приложений, которые имеют отношение к веб-картографии. Стандарты в веб-картографии. Качество публикуемых данных. Авторские права и правовые аспекты распространения и публикации данных.

    реферат [31,1 K], добавлен 24.09.2014

  • Направления развития САПР. Технологии интеграции инструментальных приложений. Схемы взаимодействия КОМПАС-3D и MathCAD на основе механизмов интеграции. Разработка интерфейсных модулей и механизма связывания переменных, апробация программного решения.

    диссертация [6,3 M], добавлен 15.04.2013

  • Рассмотрение концептуального и логического проектирования базы данных, ER-модель. Фильтрация данных при проектирование приложений. Параметризованный запрос на выборку данных и его структура. Сложные формуляры и макеты отчетов, содержащие ФИО сотрудников.

    курсовая работа [826,2 K], добавлен 07.01.2011

  • Запуск из одного приложения других приложений. Технология связывания и внедрения объектов. Понятие межпроцессного взаимодействия. Сценарий использования разделяемой памяти. Библиотеки динамической компоновки. Именованные и анонимные каналы, сокеты.

    курсовая работа [46,5 K], добавлен 26.07.2014

  • Проектирование системы управления базами данных. Особенности реализации в MS SQL. Разработка пользовательского интерфейса. Тестирование и отладка приложения. Руководство пользователя и системного администратора. Анализ и методы разработки приложений.

    курсовая работа [867,9 K], добавлен 16.07.2013

  • Обзор программных средств разработки приложений и обоснование выбора языка программирования. Классификация приложений для работы с базами данных. Функциональная структура базы данных с указанием назначения программных модулей, руководство пользователя.

    дипломная работа [645,3 K], добавлен 21.11.2010

  • Принципы визуального программирования. Создание программы, генерирующей звук через определенные промежутки времени. Visual Basic как средство разработки прототипов программы, для разработки приложений баз данных и компонентного способа создания программ.

    лабораторная работа [1,1 M], добавлен 10.12.2014

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.