Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Подземелье Магов
  
 

Фильтр по датам

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  07:35[Войти] | [Зарегистрироваться]

Просто и ясно о MapInfo и Delphi III

Дмитрий Кузан
дата публикации 09-04-2002 13:23

Просто и ясно о MapInfo и Delphi III

Доброе время суток !

Этой статьей я заканчиваю введение в интегрированную картографию MapInfo.Надеюсь, что данный цикл статей открыл вам возможность применять MapInfo в ваших программах. Перед началом я хочу дать вам ссылку на сайт пользователй MapInfo , где вы найдете исчерпывающеюся информацию по MapInfo и MapBasic в частности на русском языке. Многое что я дал вам по MapBasic в этих частях взято оттуда.

1. Интеграция инструментальных панелей Maplnfo краткий вводный курс.

Вы не можете переподчинить стандартные инструментальные панели MapInfo. Если Вы хотите, чтобы Ваша клиентская программа имела такие панели вы должны сами создать панели и кнопки на Delphi (например используя Tpanel и Tbutton) и их обработчике посылать специальные команды MapInfo для того что-бы MapInfo включало или переключала режимы работы (например с выбора объекта на перемещения окна карты (ладошка)).

Если Вы хотите, чтобы кнопка панели эмулировала стандартную кнопку MapInfo, используйте метод MapInfo Run Menu Command.
Например в обработчике OnClick пропишите следующею команду
KDMapInfoServer1.ExecuteCommandMapBasic('Run Menu Command 1702',[]);
Когда пользователь нажмет на эту кнопку, программа вызывовет метод MapInfo - Run Menu Command, который активизирует инструмент под номером 1702 (инструмент перемещение карты "рука" ).

"Магический" номер 1702 ссылается на инструмент "рука" служащий для перемещения (сдвига) карты.

Вместо того, чтобы использовать такие числа. Вы можете использовать идентификаторы, более понятные в тексте программы. MapBasic определяет стандартный идентификатор M_TOOLS_RECENTER который имеет значение 1702. Таким образом, этот пример можно записать так:
KDMapInfoServer1.ExecuteCommandMapBasic('Run Menu Command %S', [M_TOOLS_RECENTER]);
Использование идентификаторов (типа M_TOOLS_RECENTER) делает Вашу программу более читательной, но перед использование вы должны включить в программу (в Uses) соответствующий заголовочный файл MapBasic. Для Delphi я положил файл Global.pas (содержимое файла опубликовано в приложении 1).

В следующей таблице приведены кратко идентификаторы основных инструментальных кнопок MapInfo (для более побробной информации смотрите документацию по MapBasic).

Кнопки панели Операции НомерИдентификаторПрим.
Выбор1701М_TOOLS_SELECTORПанель ОПЕРАЦИИ
Выбор в прямоугольнике1722M_TOOLS_SEARCH_RECTПанель ОПЕРАЦИИ
Выбор в круге 1703M_TOOLS_SEARCH_RADIUSПанель ОПЕРАЦИИ
Выбор в области1704M_TOOLS_SEARCH_BOUNDARYПанель ОПЕРАЦИИ
Увеличивающая лупа1705M_TOOLS_EXPANDПанель ОПЕРАЦИИ
Уменьшающая лупа1706M_TOOLS_SHRINKПанель ОПЕРАЦИИ
Ладошка (рука)1702M_TOOLS_RECENTERПанель ОПЕРАЦИИ
Информация1707M_TOOLS_PNT_QUERYПанель ОПЕРАЦИИ
Подпись1708M_TOOLS_LABELERПанель ОПЕРАЦИИ
Линейка1710M_TOOLS_RULERПанель ОПЕРАЦИИ
Переноска1734M_TOOLS_DRAGWINDOWПанель ОПЕРАЦИИ
Символ1711M_TOOLS_POINTПанель ПЕНАЛ
Линия1712M_TOOLS_LINEПанель ПЕНАЛ
Полилиния1713M_TOOLS_POLYLINEПанель ПЕНАЛ
Дуга1716M_TOOLS_ARCПанель ПЕНАЛ
Полигон1714M_TOOLS_POLYGONПанель ПЕНАЛ
Эллипс1715M_TOOLS_ELLIPSEПанель ПЕНАЛ
Прямоугольник1717M_TOOLS_RECTANGLEПанель ПЕНАЛ
Прямоугольник скругленный1718M_TOOLS_ROUNDEDRECTПанель ПЕНАЛ
Текст|1709M_TOOLS_TEXTПанель ПЕНАЛ
Рамка1719M_TOOLS_FRAMEПанель ПЕНАЛ

2.Настройка "быстрых" меню Maplnfo

MapInfo вызывает "быстрые" меню, если пользователь нажимает правую кнопку мышки в окне MapInfo. Эти меню появляются даже во внедренных приложениях. В зависимости от характера Вашего приложения Вы можете захотеть модифицировать или даже удалить такое меню. Например, Вы, возможно, захотите удалить команду ДУБЛИРОВАТЬ ОКНО, так как эта команда не работает в OLE-приложении.

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

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

Чтобы удалить "быстрое" меню полностью, используйте оператор MapBasic Create Menu и управляющий код "(-" как новое определение меню. Например, следующий оператор разрушает "быстрое" меню для окон Карты:
KDMapInfoServer1.ExecuteCommandMapBasic(' "Create Menu ""MapperShortcut""  ID 17 As  ""(-""  "  ', []);

3. Создание собственных уведомляющих вызовов (Callbacks).

Во второй части мы рассмотрели возможность перехвата двух стандартных вызовов MapInfo - это дало нам возможность подключить к своей программе статус бар MapInfo и узнавать об изменениях окон MapInfo.Все это очень неплохо, но сразу возник вопрос, а как создавать и обрабатывать сообщения собственные, не входящие в MapInfo.

Если Вы хотите, чтобы MapInfo сообщало Вашей клиентской программе, когда пользователь применяет инструментальную кнопку, создайте такую кнопку оператором Alter ButtonPad... Add. Определите кнопку в соответствии с именем метода для обработки (прим. Этот метод определен мной как MyEnvent в OLE объекте)
Пример :
KDMapInfoServer1.ExecuteCommandMapBasic('Alter ButtonPad ID 1 Add ToolButton calling ole
                                        "MyEvent" ID 1 Icon 0 Cursor 0 DrawMode 34 uncheck',[]);
Заметьте, что инструментальные панели MapInfo скрыты, подобно остальной части интерфейса пользователя MapInfo. Пользователь не будет видеть новую кнопку. Вы можете добавить иконку, кнопку или другой видимый элемент управления к интерфейсу пользователя Вашей клиентской программы. Когда пользователь укажет на него мышкой, пошлите MapInfo оператор Run Menu Command ID , c индентификатором созданной кнопки чтобы активизировать этот инструмент.
KDMapInfoServer1.ExecuteCommandMapBasic('Run Menu Command ID 1',[]);

Примечание:
Информацию по Alter Button Pad смотрите в документации.

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

Внутри метода (в данном случае в обработчике компонента MyEventChange) обработайте аргументы (Info), посланные MapInfo.

4.Обработка переданных данных

Когда пользователь использует команды или кнопки, MapInfo посылает Вашему OLE-методу строку, содержащую восемь элементов, разделенных запятыми. Например, строка, посланная MapInfo, может выглядеть так:
"MI:-73.5548,42.122,F,F,-72.867702,43.025,202,"
Содержание такой строки проще понять, если Вы уже знакомы с функцией MapBasic CommandInfo(). Когда Вы пишете приложения, Вы можете создать новые команды меню и кнопки, вызывающие MapBasic-процедуры. Внутри процедуры-обработчика вызовите функцию CommandInfo(), чтобы получить информацию. Например, следующее обращение к функции определяет, координату Х и У места на карте где пользователи применил инструмент.
var  
X,Y : String;
begin
 KDMapInfoServer1.ExecuteCommandMapBasic('Set CoordSys Layout Units "mm"',[]);
 X := KDMapInfoServer1.Eval('CommandInfo(%S)',[CMD_INFO_X]).AsString;
 Y := KDMapInfoServer1.Eval('CommandInfo(%S)',[ CMD_INFO_Y]).AsString;
 ShowMessage('X= ' + X + '  Y = ' + Y);
ЗначениеКод для событий, связанных с меню Код для событий, связанных с кнопкой
1 CMD_INFO_X
2 CMD_INFO_Y
3 CMD_INFO_SHIFT
4 CMD_INFO_CTRL
5 CMD_INFO_X2
6 CMD_INFO_Y2
7 CMD_INFO_TOOLBTN
8CMD_INFO_MENUITEM 

Когда Вы создаете команду меню или кнопку, которая использует синтаксис вызова OLE, MapInfo создает строку, содержащую разделенные запятой все восемь возвращаемых CommandInfo() значений. Строка начинается с префикса "MI:", чтобы Ваш OLE-сервер мог определять, что обращение метода было сделано MapInfo.

Строка, которую MapInfo посылает Вашему методу, выглядит следующим образом:
"MI:"  + 
CommandInfo(l)	+ ","  + CommandInfo (2)  + ","	+
CommandInfo(3)   + ","  + CommandInfo (4) + ","	+
CommandInfo(5)    + ","  + CommandInfo (6)   + ","	+
CommandInfo (7)   +  ","  + CommandInfo (8)
Предположим, что Ваше приложение добавляет команду меню к локальному меню OLE-методу строку. Если команда меню имеет номер 101 , строка будут выглядеть следующим образом:
"Ml :,,,,,,, 101"
В этом случае большинство элементов строки пусто, потому что функция CommandInfo( ) может возвращать только эту одну часть информации.

Теперь предположим что вы создаете кнопку которая позволяет пользователю выбирать линии на карте.Строка теперь примет вид -
"MI:-73.5548,42.122,F,F,-72.867702,43.025,202,"
Теперь строка включает несколько элементов.

Первые два элемента содержат х- и у координаты точки на которые пользователь указал мышкой
Следующие два элемента сообщают, была ли нажата клавиша SHIFT или CTRL
Предпоследнии два элемента содержат координаты точки где пользователь отпустил кнопку мышки.
И последний - указывает номер идентификатора кнопки.

Совет:
Если Вы приписываете уникальный идентификатор каждой из Ваших кнопок, Вы можете сделать так, что все кнопки будут вызывать один и тот же метод. Ваш метод может определять, какая из кнопка вызвала его, используя седьмой аргумент в переданной строке.

5.Примечание 1: Описание констант MapInfo (Global.pas)

Примечание - данный файл был взят мной с Интернета. Хочу сразу сделать предупреждение - разработчики MapInfo заявляют что набор констант может быть подвергнут изменениям в следующих редакциях MapInfo.Данный набор констант адаптирован под пятую версию. К сожалению шестой версии у меня нет (может кто поделиться ;-) ) и соответственно нет возможности проверить изменился ли набор констант или нет.

Вот в принципе и все что нужно для работы с MapInfo в Delphi, дерзайте

Скачать компонент TKDMapInfoServer3.zip (527 К)

Дмитрий Кузан 2002 год.
Специально для Королевства Delphi




Смотрите также материалы по темам:
[MapInfo]

 Обсуждение материала [ 01-04-2008 04:06 ] 6 сообщений
  
Время на сайте: GMT минус 5 часов

Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
Функция может не работать в некоторых версиях броузеров.

Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

 
© При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
Все используемые на сайте торговые марки являются собственностью их производителей.

Яндекс цитирования