Часть 2. Создание собственных инструментов, строка состояния - вывод координат.
Доброе время суток, уважаемые коллеги. Этой статьей я продолжаю цикл изучения ActiveX компонента MapX предназначенного для встраивания в свои приложения элементов картографии. В данной статье мы научимся создавать собственные инструменты (tool), собственные (не предопределенные) указатели мыши для собственных инструментов, создадим статус строку с выводом координат. Итак, в прошлом проекте мы создали простое картографическое приложение, теперь мы хотим его приукрасить, это не сложно.
1. Для начала мы сделаем статусную строку где будем выводить координаты мыши преобразованные в координаты на карте.
Итак, в обработчик MouseOver пропишем следующий код, предварительно положив StatusBar на форму.
| procedure TForm1.MapXMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); var ScreenX,ScreenY : Single; MX,MY : Double; begin //Конвертируем координаты экрана в координаты карты ScreenX := X; ScreenY := Y; MapX.ConvertCoord(ScreenX,ScreenY,MX,MY,miScreenToMap); StatusBar.Panels[0].Text := 'X:' + FloatToStr(MX) + ' Y:' + FloatToStr(MY); end; |
Итак что мы сделали - в обработчике мы вызвали метод ConvertCoord, который служит для конвертации координат карты в экранные и наоборот, в зависимости от параметра (miScreenToMap - экранные в картографические, miMapToScreen - картографические в экранные), при этом хочу обратить внимание я специально перевел экранные координаты в тип Single, т.к. процедура требует именно тип Single для экранных координат, ну а далее координаты выведем в строку состояния.
Согласитесь ничего сложного.
2. Все это конечно хорошо но внимательный читатель может задать вопрос а как преобразовывать координаты например в градусы , на что я отвечу к сожалению в MapX нет команд непосредственно изменяющих единицы измерения координат, так как MapX берет координаты непосредственно с карты, если вы хотите настроить вывод координат в градусах при определенной проекции карты вы должны, предварительно щелкнув правой клавишей на объекте Tmap, вызвать окно свойств и там загрузив слои, настроить проекцию.

Так как координаты на карте зависят от системы координат и проекции. Более подробно об этом вы можете узнать, прочитав соответствующею литературу по картографии и геодезии. В данной статье на этом я останавливаться не буду.
3. После того как мы научились определять координаты на карте, рассмотрим вопрос создания собственных инструментов (что очень неудобно было в интегрированной картографии) в MapX делается очень просто - для этого существует команда
CreateCustomTool;
Вот ее синтаксис :
| CreateCustomTool (ToolNumber, Type, Cursor, [ShiftCursor],[CtrlCursor], [InfoTips]) |
Создает пользовательский инструмент, затем, когда он используется, посылает событие
ToolUsed.
Небольшое отступление. Если Вы создаете
CustomTool типа "окружность" и в событии
Tool_Used среды
МарХ определяется
SelectByRadius с величиной, передаваемой в событие, результаты получаются не такими, как если Вы выбираете объекты в
Radius Select Tool. Метод
SelectByRadius не будет точно выбирать, поскольку такой круг не учитывает проекцию карты. Выборки сделанные
Radius Select Tool точно выбирают все объекты в заданной окружности.
| ToolNumber | Количество инструментов, используемое в дальнейшем. Это целое между 1 и 999 |
| Type | Тип описывает поведение инструмента. Берется значениеToolTypeConstants, Которое имеет следующие значения :ToolTypeConstants - miToolTypePoint =0 - Точка, указатель
- miToolTypeLine = 1 - инструмент рисует линию
- miToolTypeCircle = 2 - инструмент рисует окружность
- miToolTypeMarquee = 3
- miToolTypePoly = 4 - инструмент рисует полилинию
- miToolTypePolygon = 5 - инструмент рисует полигон.
Термин рисует не совсем верный инструмент ведет себя так, как бы рисуя линию, полигон, после окончания рисования данная область,линия,полигон и т.д затирается и вызывается обработчик Tool_Used |
| Cursor | Курсор в случае когда инструмент создан в и курсор в CurrentTool окне карты. Значение выбирается из коллекции CursorConstants. Которая имеет вид :CursorConstants - miDef aultCursor = 0
- miArrowCursor = 1
- miCrossCursor = 2
- milBeamCursor = 3
- milconCursor = 4
- miSizeCursor = 5
- miSizeNESWCursor = 6
- miSizeNSCursor = 7
- miSizeNWSECursor = 8
- miSizeEWCursor = 9
- miUpArrowCursor =10
- miHourglassCursor =11
- miNoDropCursor = 12
- miArrowHourglassCursor =13
- miArrowQuestionCursor = 14
- miSizeAllCursor = 15
- miArrowToolCursor = 16
- miPanCursor =17
- miCenter Cursor =18
- miZoomlnCursor = 19
- miZoomOutCursor = 20
- miSymbol Cursor = 21
- miTextCursor = 22
- miSelectCursor = 23
- miRadiusSelectCursor = 24
- miRectSelectCursor = 25
- miRegionSelectCursor = 26
- milnfoCursor = 27
- miSelectPlusCursor = 28
- miSelectRadiusPlusCursor = 29
- miSelectRectPlusCursor = 30
- miSelectRegionPlusCursor = 31
- miSelectMinusCursor = 32
- miSelectRadiusMinusCursor = 33
- miSelectRectMinusCursor = 34
- miSelectRegionMinusCursor = 35
- miLabel Cursor = 36
- miDrillDownExpandCursor = 37
- miDrillDownContractCursor = 38
- miCustomCursor = 39
|
| ShiftCursor | Значение CursorConstants, указывающее, что курсордолжен появиться, пока нажата клавиша SHIFT. Heобязательный параметр. Если он пропущен, клавиша SHIFT недействует на курсор. |
| CtrlCursor | Значение CursorConstants, указывет, что курсордолжен появиться, пока нажата клавиша CTRL. Heобязательный параметр. Если он пропущен, клавиша CTRL недействует на курсор. |
Итак я создал 2 собственных инструмента в FormCreate - это инструмент стрелка (указатель) и инструмент окружность (круг).
Вот они :
| MapX.CreateCustomTool(ToolCustomArrow,miToolTypePoint,miDefaultCursor); MapX.CreateCustomTool(ToolCustomCircle,miToolTypeCircle, miDefaultCursor); |
Константы ID инструментов я определил так :
| Const ToolCustomArrow = 1; ToolCustomCircle = 2; |
Обработчики выбора инструментов так :
| MapX.MousePointer := miDefaultCursor; MapX.CurrentTool := miArrowTool; |
И обратите внимание так
| MapX.MousePointer := miCustomCursor; MapX.MouseIcon := 'Icon2.ico'; MapX.CurrentTool := ToolCustomCircle; |
Т. е при выборе инструмента окружность стандартный курсор на карте заменяется собственным выбранным из иконки 'Icon2.ico' т.е сразу ответ и на вопрос как создать собственный указатель в MapX. Видите, ничего сложного тоже нет.
Ну и наконец в обработчике инструментов пользователя MapXToolUsed я прописал следующий демо-код.
| procedure TForm1.MapXToolUsed(Sender: TObject; ToolNum: Smallint; X1, Y1, X2, Y2, Distance: Double; Shift, Ctrl: WordBool; var EnableDefault: WordBool); begin IF ToolNum = ToolCustomArrow Then ShowMessage('Использован собственный инструмент - стрелка'); IF ToolNum = ToolCustomCircle Then ShowMessage('Использован собственный инструмент - Круг'); end; |
Вот в принципе и все на сегодня, в следующих частях мы более подробно разберем, собственные обработчики и научимся работать с данными таблиц
С уважением к коллегам,
.
Скачать проект:
(11 K)