base_tools

advertisement
Схема подключения модулей расширения функциональности
MapCad.
Общие сведения
Дополнительные возможности для выполнения отдельных завершенных задач при работе с
картой реализуются в виде дополнительных библиотек (DLL).
Библиотеки располагаются в подкаталоге \Tools основного каталога редактора карт (где находится
файл Map_cad.exe).
Изначально, по умолчанию, все библиотеки отключены. Включение требуемых для работы
библиотек выполняется индивидуально каждым пользователем.
Организация совместной разработки Map_Cad
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Внесение изменений в Map_Cad каждым разработчиком может занимать довольно
продолжительное время. При этом вносимые изменения одного разработчика в некоторый PAS файл с
учетом отладки могут вызвать затруднения для его использования другими разработчиками (даже без
внесения изменений).
Для того, чтобы новый код одного разработчика не мешал работе другим, предлагается:
На машинах разработчиков в одинаковых каталогах, например, C:\Project создать файл DEFINE.INC,
который будет содержать DEFINE константы для исключения кода из компиляции.
В изменяемый PAS-файл проекта добавляется строка {$I c:\project\define.inc} после строки interface.
Разработчик, перед началом внесения изменений для решения новой задачи, в своем файле
DEFINE.INC добавляет строку {$DEFINE NAME_JOB},
NAME_JOB — имя устанавливает сам
разработчик.
Для информации другим разработчикам о возможных {$DEFINE} определениях в PAS-файлах
предлагается в файле «P:\Project\Docs\MAP_Cad define.doc» вводить используемые имена с кратким
комментарием их назначения (какая задача решается). Перед вводом нового определения в свой файл
DEFINE.INC разработчик должен убедиться, что выбранное им наименование уже не используется
другим разработчиком, т.е. просмотреть «P:\Project\Docs\MAP_Cad define.doc».
При добавление нового кода в PAS-файл все изменения вносятся между строками {$IFDEF NAME_JOB}
... {$ENDIF}.
Если требуется не добавить, а изменить некоторый код, то используем следующую конструкцию {$IFDEF
NAME_JOB} новый код {$ELSE} старый код {$ENDIF}.
После того, как задача будет решена полностью и выполнено тестирование, разработчик должен пройти
по всем PAS-файлам, в которых есть его константа NAME_JOB и удалить конструкции {$IFDEF
NAME_JOB}, {$ENDIF}. При этом его код станет доступен для компиляции и остальным разработчикам.
При этом должно быть удалено соответствующее описание и из «P:\Project\Docs\MAP_Cad define.doc».
Для исключения одновременного изменения одного PAS-файла несколькими разработчиками
предлагается в файле «P:\Project\Docs\MAP_Cad используемые pas файлы.doc» вносить login
разработчика, название изменяемого PAS-файла, дату и время начала внесения изменений.
После окончания внесения изменений в конкретный PAS-файл, разработчик должен удалить
информацию по данному файлу из «MAP_Cad используемые pas файлы.doc».
Если второму разработчику требуется изменить уже занятый PAS-файл, то он договаривается об этом с
первым разработчиком. Если первого разработчика нет и однозначно можно определить, что он сейчас
не работает с данным файлом, например, работал вчера, а запись о занятости осталась, то второй
разработчик должен переписать этот файл на себя.
Перед началом работы над проектом каждый раз разработчик должен предварительно открыть файл
«MAP_Cad используемые pas файлы.doc» и убедиться, что нужные ему для изменений PAS-файлы
никем не заняты, даже если он вчера с ними работал и не убрал отметку о занятости.
Общие требования к библиотеке
Каждая библиотека расширения функциональности редактора должна иметь следующий
обязательный набор экспортируемых функций и процедур:
function DLLMapCadInfo(var DLLInfo,WinCall: PChar): Pchar;
//функция возврата описания назначения библиотеки,
//наличие ее - является признаком библиотеки, которая может быть вызвана из MapCad
DLLInfo — строка с описанием выполняемых библиотекой действий для просмотра пользователем;
WinCall — название формы в редакторе (Tform.Name) для поиска окна в программе, из которого должна
вызываться данная библиотека (может быть несколько через «;», при этом библиотека может
вызываться из нескольких окон);
Result — возвращает название библиотеки, которое выбирается пользователем для ее вызова из
динамически формируемых меню соответствующих окон.
procedure FormShow;
//процедура открытия (передачи фокуса в основное окно) библиотеки
procedure DLLClose;
//процедура закрытия библиотеки для освобождения выделенных в ней ресурсов, удаления форм
динамически созданных форм и т.д.
При вызове FreeLibrary для выгрузки библиотек, почему-то, не всегда вызываются обработчики
FormDestroy, в которые вставляется освобождение выделенных ресурсов. В DLLClose удаление формы
делается принудительно и ресурсы освобождаются.
Формирование списка библиотек в редакторе
Каждая библиотека в модуле редактора описывается следующей структурой:
Type
//описание библиотеки
TDllInfo = record
HMod: HMODULE;
//Handle библиотеки
FileName: String; //имя файла
Name: String;
Info: String;
WinCall: String;
//имя библиотеки (выводимое для ее вызова)
//описание библиотеки, ее назначение
//название формы (Tform.Name), в которой добавляется пункт меню для вызова
FormShow: procedure (ZUType: Integer);//указатель на функцию вызова главного окна библиотеки (если
оно есть)
DLLClose: procedure;//указатель на функцию закрытия окон библиотеки (если они есть), освобождение
ресурсов
fLoad: Boolean;
//признак загрузки для пользователя
end;
//массив описаний используемых библиотек
TDLLArray = array of TDllInfo;
Var
DllList: TDLLArray=nil; //список доступных библиотек
После регистрации пользователя в программе формируется список библиотек каталога Tools —
переменная DllList. При этом из каждой библиотеки считываются поля Name, Info, WinCall.
К меню основного окна редактора добавляется новый пункт «Модули расширения». При выборе
данного пункта открывается окно с списком доступных библиотек в виде списка (TcheckListBox).
Пользователь включает флажки напротив каждой необходимой ему для работы библиотеки. При выходе
из окна этот список сохраняется. При входе пользователя в редактор и выходе из данного окна
перечитывается список включенных пользователем библиотек.
Вызов библиотек из редактора
1. В каждом окне редактора, из которого предполагается возможность вызова библиотек, к основному меню
в коде программы добавляется пункт «Программы» с именем элемента меню «TMI_Dll».
2. При загрузке очередной формы проверяется наличие в ее основном меню данного пункта. Если его нет,
то на этом все, если есть, то см. следующие пункты.
3. Проверяется список доступных для использования библиотек.
4. Если для очередной библиотеки имя текущей формы есть в WinCall и установлен признак ее
использования для текущего пользователя, то имя этой библиотеки добавляется в подменю TMI_Dll.
5. При выборе данного пункта меню вызывается требуемая библиотека (если она уже загружена, то
переход в ее форму).
Передача данных в библиотеки
Для передачи данных, текущего состояния карты из редактора в библиотеку в Map_Cad
добавляются экспортируемые функции и процедуры, список которых может в дальнейшем дополняться
при разработке новых модулей расширения.
Описание и реализация экспортируемых из редактора функций и процедур находится в файле
COMMON_MAP_EXT.PAS, который входит в проект MAP_CAD.DPR. Имя каждой функции (процедуры)
заканчивается на «Ext» для выделения экспортируемых из редактора имен.
Описание типов экспортируемых из редактора функций и процедур находится в файле
COMMON_MAP_TYPE_EXT.PAS. Этот файл подключается в библиотеках.
Описание структур данных, которые могут передаваться из редактора в библиотеку и обратно
находится в файле
COMMON_MAP_OBJ_EXT.PAS. Этот файл подключается как к проекту
MAP_CAD.DPR, так и к каждому проекту с модулем расширения.
Download