Версия для печати


Разработка эксперта 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.