События и методы обработчика команды

Печать Предыдущая страница Стартовая страница Следующая страница

Создание экземпляра объекта Обработчик команды выполняется автоматически объектом Прикладная задача в методе GetAction при поступлении соответствующей команды.

Объекту Обработчик команды соответствует класс, производный от TPanAction.

Для установления соответствия между идентификатором команды и ее обработчиком, заполняется список обработчиков в методе GetAction задачи. Например :

  // Выполнение команд с помощью обработчика

  // CM_MED_MOVEOBJECT - идентификатор команды;

  // TMoveObject - класс, производный от TPanAction.

  // IDN_HLP_MOVEOBJECT - идентификатор раздела Help, реакция на F1.  

  SeekAction(comid,run)

   {

CheckAction(CM_MED_MOVEOBJECT,TMoveObject,IDN_HLP_MOVEOBJECT);

CheckAction(CM_MED_CREATEOBJECT,TCreateObject,IDN_HLP_CREATEOBJECT);

     // ...

   }

При поступлении команды с идентификатором CM_MED_MOVEOBJECT автоматически будет вызван конструктор класса TMoveObject, производного от класса TPanAction.

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

После создания конструктора класса Обработчик команды система проверяет наличие активного обработчика команды. Если таковой имеется система спрашивает - может ли он быть завершен. Для этого вызывается метод обработчика CanClose.

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

С этого момента обработчик является активным и может выполнять любые действия над электронной картой.

Если обработчик команды предназначен для обработки отдельных объектов карты, то при вызове метода Setup может быть выполнен запрос текущего выбранного объекта. Для этого применяется метод класса TPanWindow - IsObjectSelected. Этот метод возвращает идентификатор (HOBJ) выбранного объекта. Если объект не выбран, то возвращается ноль. Если пользователь системы выберет новый объект, будет сгенерированно событие SelectObject. Обработчик может запретить выбор объектов по их характеристикам или исходя из текущего состояния обработки ранее выбранного объекта. Для этого используются события CanSelectObject (можно ли выбирать объекты на карте) и CanSelectThisObject (можно ли выбрать конкретный объект). Применение данных событий прозрачно для пользователя. Он не должен повторно выбирать объект в точке, если верхний объект на изображении карты отвергнут обработчиком. Система автоматически предложит следующий доступный на карте (или на следующей карте в данной точке) объект.

Для принудительного выбора объекта на карте (например, объекта, соответствующего текущей записи таблицы базы данных) применяется метод класса TPanWindow - SetSelectObject.

Класс TPanWindow доступен обработчику через переменную-указатель MapWindow.

При работе пользователя с мышкой и клавиатурой генерируются следующие события в обработчике команды :

KeyDown              - нажата клавиша клавиатуры;

LeftDown              - нажата левая кнопка мыши;

LeftUp                   - отпущена левая кнопка мыши;

Move                 - перемещение курсора мыши по окну карты;

RightDown            - нажата правая кнопка мыши;        

RightUp                - отпущена правая кнопка мыши;

CallRightMenu     - вызвано всплывающее меню при нажатии правой кнопки мышки,

                              обработчик может добавить пункты меню для текущей операции;

Commit                - выполнение текущей операции    (не обработчика !) завершено,

                              генерируется при двойном нажатии левой кнопки мыши, при

                              нажатии левой и правой кнопки мыши, при наборе комбинации

                              клавиш CTRL-ENTER, при выборе соответствующего пункта

                              меню и т.д.;

Revert                  - выполнение текущей операции (не обработчика !) отменено,

генерируется при нажатии клавиши CTRL и правой кнопки мыши, при выборе соответствующего пункта меню и т.д.;

Paint                    - выполнена перерисовка карты, обработчик может нарисовать

                             на карте;

ResetMessage    - требуется перевывести комментарий к текущей операции в

                            информационной линейке;

ChangeData       - извещение о каком-либо изменении содержания данных       электронной карты (пользовательских карт, растров, матриц), если данные, над которыми выполнялась операция, оказались закрыты - обработчик должен прервать операцию;

При получении события обработчик может использовать любые методы классов TPanTask, TPanWindow и свои собственные для выполнения требуемой операции. Для запроса координат текущей точки могут использоваться следующие методы :

GetPicturePoint       - запросить координаты в системе изображения в пикселах;

GetPlanePoint        - запросить координаты в прямоугольной местной системе в метрах;   GetGeoPoint         - запросить координаты в географической системе в радианах,

                                 допустимо, если карта поддерживает географические координаты;

IsGeoSupported      - проверка поддержки географических координат.

При получении события Revert обработчик должен отменить выделение объекта (метод SetSelectObject(0) класса TPanWindow). Если выбранного объекта нет, то обработчик может вызвать метод, завершающий его выполнение - Close (с запросом на разрешение) или Quit (безусловное завершение).

Как правило, при повторном нажатии на кнопку панели она отжимается и обработчик завершается (методом Close). Но в некоторых задачах удобнее при повторном нажатии перезапустить обработчик заново, предварительно завершив его методом Close. Например, так реализовано создание объектов на карте, когда вид объекта выбирается из соответствующего диалога. Для смены вида объекта достаточно повторно нажать на кнопку панели. Если в диалоге выбора вида объекта нажать "Отказ" или нажать другую кнопку на панели, или набрать комбинацию клавиш CTRL-C и т.п., - то обработчик будет завершен без перезапуска.

Для реализации такой схемы работы необходимо переопределить метод CanRestartByButton, чтобы он возвращал ненулевое значение.

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

Описание класса TPanAction содержится в файле PANACT.H, реализация - в файле PANTASK.CPP. Файлы расположены в поддиректории \SDK\PANTASK той директории, где установлена система Панорама.