Версия для печати
Разработка эксперта IDE Delphi 2007 с созданием группы проектов
http://www.delphikingdom.com/asp/viewitem.asp?catalogID=1424Сергей Деев
дата публикации 17-04-2010 22:04Разработка эксперта IDE Delphi 2007 с созданием группы проектов Постановка задачи
При построении системы на основе PlugIn используются пакеты исполнения. Довольно часто в таких пакетах можно встретить наследование форм и классов из какого-либо основного пакета. Однако, при разработке таких пакетов приходиться создавать группу проектов, в которую необходимо добавить как сам разрабатываемый пакет, так и основной. Попробуем автоматизировать эту задачу путем разработки эксперта IDE Delphi 2007 с созданием группы проектов и регистрации его IDE.
Начало работы
Начнем работу с создания нового пакета. Зайдем в его опции и установим тип пакета как "DesignTime only" и сохраним данный пакет под именем dt_ ProjectGroupWizard. Вставим в пакет пустой модуль и сохраним его под именем UProjectGroupWizardReg.
Основной класс-эксперт и класс-креатор
type TDKProjectGroupWizard = class(TNotifierObject, IOTAWIzard, IOTARepositoryWizard, IOTARepositoryWizard60, IOTARepositoryWizard80, IOTAProjectWizard) private { IOTANotifier } procedure AfterSave; procedure BeforeSave; procedure Destroyed; procedure Modified; { IOTAWizard } function GetIDString: string; function GetState: TWizardState; function GetName: string; { IOTARepositoryWizard } function GetAuthor: string; function GetComment: string; function GetPage: string; function GetGlyph: Cardinal; {IOTARepositoryWizard60} function GetDesigner: string; {IOTARepositoryWizard80} function GetGalleryCategory: IOTAGalleryCategory; function GetPersonality: string; protected function BaseProjectGroup: String; virtual; { IOTAWizard } procedure Execute; virtual; end; TDKProjectGroupCreator = class(TInterfacedObject, IOTACreator, IOTAProjectGroupCreator) private FBaseProjectGroup: String; { IOTACreator } function GetCreatorType: string; function GetExisting: Boolean; function GetFileSystem: string; function GetOwner: IOTAModule; virtual; function GetUnnamed: Boolean; {IOTAProjectGroupCreator} function GetFileName: string; function GetShowSource: Boolean; function NewProjectGroupSource(const ProjectGroupName: string): IOTAFile; public constructor Create(ABaseProjectGroup: string); virtual; end;На большинство методов классов я подробно останавливаться не буду, их описание можно прочесть в моей статье Разработка эксперта IDE Delphi 2007 с визуальным наследованием форм и размещением их в репозитории.
А вот методы Execute класса-эксперта и конструктор класса-креатора рассмотрим поподробнее.
Реализация метода Execute класса-эксперта
… procedure TDKProjectGroupWizard.Execute; var AModuleServices: IOTAModuleServices; AProject: IOTAProject; AModule: IOTAProjectGroup; begin AModuleServices := BorlandIDEServices as IOTAModuleServices; Assert(Assigned(AModuleServices)); AModule := IOTAProjectGroup(AModuleServices.CreateModule( TDKProjectGroupCreator.Create( BaseProjectGroup))); Assert(Assigned(AModule)); AModule.AddNewProject; AProject := AModule.ActiveProject; AProject.AddFile('rt_ dk.dcp', False); AProject.AddFile('rt_ dk _Com.dcp', False); AProject.ProjectOptions.Values['RunTimeOnly'] := 1; AProject.FileName := 'dk_fish'; AModule.AddExistingProject; AModule.SetActiveProject(AProject); end; …Как видим, сначала мы вызываем конструктор класса-креатора, передавая туда имя группы проектов.
Затем добавляем в группу новый проект, вызывая метод AddNewProject, который в свою очередь вызывает стандартный диалог добавления проекта в группу.
Затем с помощью вызовов методов AddFile(const AFileName: string; IsUnitOrForm: Boolean) мы добавляем в секцию "Requires" необходимые нам пакеты.
С помощью назначения свойства ProjectOptions.Values['RunTimeOnly'] устанавливаем тип пакета как "RunTime only". Затем просто меняем имя пакета, а затем с помощью вызова метода AddExistingProject вызываем стандартный диалог добавления в группу существующих пакетов и устанавливаем наш пакет как активный.
Реализация конструктора класса-креатора
… constructor TDKCProjectGroupCreator.Create(ABaseProjectGroup: string); begin FBaseProjectGroup := ProjectGroupName; end; …Как видим, мы просто устанавливаем значение поля FBaseProjectGroup, которое потом нам будет возвращать метод function GetFileName: string; класса-креатора.
Заключение
Необходимо заметить, что описание процедуры регистрации нашего эксперта я опустил.
Конечно, для успешной компиляции нашего пакета необходимо в раздел "Requires" добавить designide.dcp.
Сохраняем наши изменения, компилируем и устанавливаем пакет.
После установки пакета мы можем, выбрав в репозитории пункт "dk_fish_pg" и два раза щелкнув по нему создать группу проектов, в которой будет находиться наш разрабатываемый проект "dk_fish" и другие уже существующие проекты. Нам останется только сохранить группу и проект под необходимыми именами и можно будет приступать к реализации PlugIn.