Статьи Королевства Дельфи

Часть 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)


Содержание раздела