События и методы прикладной задачи |
Для создания объекта Прикладная задача в главной библиотеке приложения должна быть функция следующего вида: extern "C" { HMAPTASK WINAPI __declspec (dllexport) CreatePanTask (HMAPDOC hdoc,TASKPARM * parm,const char * dllname) { // Создать объект Прикладная задача TPanTask * task = new TUserTask(hdoc,parm,dllname); if (task == 0) return 0; if (task->GetTaskIdent () == 0) { delete task; task = 0; return 0; } return task->GetTaskIdent(); } } // extern "C" При программировании на Delphi функция должна выполнить соответствующие действия по созданию экземпляра объекта. Типы переменных и структур HMAPTASK, HMAPDOC, TASKPARM объявлены в файле MAPTYPE.H. Описание класса TPanTask содержится в файле PANTASK.H, реализация - в файле PANTASK.CPP. Файлы расположены в папке \SDK12\PANTASK примеров разработки приложений в ГИС "Панорама" 12. Класс пользовательской задачи должен быть производным от класса TPanTask. Конструктор класса автоматически создает объект Окно электронной карты и устанавливает связь с библиотекой MAPTASK.DLL (MAPTASK64.DLL), которая отвечает за поддержку интерфейса PANAPI. При успешном создании экземпляра объекта его свойство GetTaskIdent возвращает ненулевое значение идентификатора задачи, назначаемого интерфейсом PANAPI. Данное свойство не может быть переопределено. Система Панорама работает в многодокументном (многооконном) режиме. При запуске пользовательской задачи автоматически создается столько экземпляров объектов, сколько документов (электронных карт) открыто. Создание выполняется путем вызова функции CreatePanTask, удаление выполняется путем вызова деструктора задачи. Вызов деструктора, как и других функций классов, выполняется из соответствующих функций (utsDeletePanTask, utsSetFocus, utsGetAction...), реализованных в главной библиотеке приложения. Тексты всех необходимых функций доступа к методам классов из системы Панорама содержаться в файле PANTASK.CPP, и не должны модифицироваться разработчиком приложения. При выборе пользователем окна документа и при открытии нового документа автоматически вызывается метод (генерируется событие) SetFocus. При смене состава данных в документе (добавлена пользовательская карта, построена матрица и т.п.) автоматически вызывается метод (генерируется событие) ChangeData. При изменении языка диалогов и сообщений автоматически вызывается метод (генерируется событие) ChangeLanguage. Прикладная задача может поддерживать несколько режимов работы, смена которых может выполняться пользователем путем нажатия соответствующей кнопки на панели задачи. При нажатии кнопки генерируется сообщение активному документу с идентификатором кнопки. В этом случае в задаче автоматически вызывается метод (генерируется событие) GetAction. Для определения доступности режима задачи автоматически вызывается метод (генерируется событие) EnableAction. При работе нескольких экземпляров объектов Прикладная задача с разными окнами документов одновременно Панорама могут быть активны разные режимы работы. При смене пользователем активного окна документа система Панорама автоматически меняет состояние панелей задач (нажимает и отжимает нужные кнопки). Если задача работает со своими диалогами (таблицы баз данных, диаграммы и прочее), то их активизация может быть выполнена при получении события SetFocus. Для вызова функций обработки электронной карты интерфейса MAPAPI класс TPanTask содержит указатель на класс открытых данных документа карты HMap (типа HMAP). Для посылки сообщений главному окну приложения применяется метод MainMessage, который основан на WINAPI-функции SendMessage. Наиболее важными методами класса TPanTask являются SetFocus, GetAction, EnableAction. Обработка команд, поступающих в метод GetAction, может выполняться двумя способами: вызовом соответствующих методов, добавленных в производном от TPanTask классе, или созданием экземпляра объекта Обработчик команды, который работает в интерактивном режиме. Общий вид реализации метода GetAction может быть следующим : HMAPACTION TUserTask::GetAction(int comid, int run) { // Запросить базовый список команд HMAPACTION action; if ((action = TPanTask::GetAction(comid,run)) != 0) return action; // Выполнение команд, не требующих обработчика // CM_MED_STEPSIZE - идентификатор команды; // void CmStepSize(void) - метод, выполняющий данную команду; // IDN_HLP_STEPSIZE - идентификатор раздела Help, реакция на F1. SeekCommand(comid,run) { CheckCommand (CM_MED_STEPSIZE,CmStepSize,IDN_HLP_STEPSIZE); // ... } // Выполнение команд с помощью обработчика // TMoveObject - класс, производный от TPanAction. SeekAction(comid,run) { CheckAction(CM_MED_MOVEOBJECT,TMoveObject,IDN_HLP_MOVEOBJECT); CheckAction(CM_MED_CREATEOBJECT,TCreateObject,IDN_HLP_CREATEOBJECT); // ... } ReturnAction(); } Реализация метода EnableAction основана на вызове метода GetAction c параметром "run", равным нулю. При этом возвращается признак поддержки запрошенной команды в задаче. Далее проверяются дополнительные условия выполнения команды (наличие данных в таблице базы данных, наличие выбранного объекта, наличие пользовательской карты или матрицы и т.п.). Если команда не доступна - метод должен вернуть ноль. Пример реализации прикладной задачи содержится в папке \SDK12\Ready\Image3D\ примеров разработки приложений в ГИС "Панорама" 12.
|