Главная » Delphi » Мастера форм

0

Интерфейсом API  Open Tools  поддерживается еще  один  тип  мастера —  мастер форм. После  установки мастер  этого  типа  можно  выбрать в диалоговом окне  New Items. С его помощью можно  генерировать новые  формы и модули. В главе 16, “Программирование для оболочки Windows”, данный тип  мастера использовался для создания новых  форм  AppBar. Однако  тогда не был показан код, который, собствен но, и “оживлял”  мастер.

Создать мастер  форм  очень  просто, хотя при этом и требуется реализовать множество методов интерфейсов. Процесс создания мастера форм  можно  разделить на пять  основ ных этапов.

1.  Создайте класс, производный от класса TCustomForm, TDataModule или любо го другого  класса,  производного от класса  TWinControl, —  он будет использо ваться  в качестве базового класса  формы. Обычно такой  класс находится в от дельном   модуле.  В данном  случае  в  качестве базового будет  использоваться класс TAppBar.

2.  Создайте потомок класса  TNotifierObject, реализующий следующие  интер фейсы: IOTAWizard, IOTARepositoryWizard, IOTAFormWizard, IOTACrea- tor и IOTAModuleCreator.

3. Обычно для получения нового имени  модуля и класса мастера в методе  IO- TAWizard.Execute()   необходимо     вызвать     метод      IOTAModuleServ- ices.GetNewModuleAndClassName(). Для того  чтобы  сообщить среде  разра ботки  о необходимости создания нового модуля, вызовите метод IOTAModule- Services.CreateModule().

4.  Реализация  большинства  методов   вышеупомянутых интерфейсов   занимает лишь одну строку.  К менее  тривиальным относятся методы  NewFormFile() и NewImplFile() интерфейса  IOTAModuleCreator,  возвращающие  код   для формы и модуля соответственно. Более  сложной может  оказаться реализация метода  IOTACreator.GetOwner(), однако  следующий  пример является хоро шей иллюстрацией того, как можно добавить модуль в текущий проект.

5.  Наконец процедура Register() мастера регистрирует обработчик класса  но вой формы, что  осуществляется с помощью процедуры RegisterCustomMod- ule() модуля DsgnIntf. Создайте мастер, вызвав  процедуру  RegisterPack- ageWizard() модуля ToolsAPI.

В листинге 17.9 приведен исходный код модуля ABWizard.pas, в котором реали

зован мастер AppBar.

Листинг 17.9. Модуль ABWizard.pas, содержащий реализацию мастера AppBar

unit ABWizard;

interface

uses Windows, Classes, ToolsAPI;type

TAppBarWizard = class(TNotifierObject, IOTAWizard,

IOTARepositoryWizard, IOTAFormWizard,

IOTACreator, IOTAModuleCreator)

private

FUnitIdent: string;

FClassName: string;

FFileName: string;

protected

// Методы класса IOTAWizard

function GetIDString: string;

function GetName: string;

function GetState: TWizardState;

procedure Execute;

// Методы классов IOTARepositoryWizard и IOTAFormWizard

function GetAuthor: string;

function GetComment: string;

function GetPage: string;

function GetGlyph: HICON;

// Методы класса IOTACreator

function GetCreatorType: string;

function GetExisting: Boolean;

function GetFileSystem: string;

function GetOwner: IOTAModule;

function GetUnnamed: Boolean;

// Методы класса IOTAModuleCreator

function GetAncestorName: string;

function GetImplFileName: string;

function GetIntfFileName: string;

function GetFormName: string;

function GetMainForm: Boolean;

function GetShowForm: Boolean;

function GetShowSource: Boolean;

function NewFormFile(const FormIdent,

AncestorIdent: string): IOTAFile;

function NewImplSource(const ModuleIdent, FormIdent,

AncestorIdent: string): IOTAFile;

function NewIntfSource(const ModuleIdent, FormIdent,

AncestorIdent: string): IOTAFile;

procedure FormCreated(const FormEditor: IOTAFormEditor);

end;

implementation

uses Forms, AppBars, SysUtils, DsgnIntf;

{$R CodeGen.res}

type

TBaseFile = class(TInterfacedObject)

private

FModuleName: string;

FFormName: string;FAncestorName: string;

public

constructor Create(const ModuleName, FormName,

AncestorName: string);

end;

TUnitFile = class(TBaseFile, IOTAFile)

protected

function GetSource: string;

function GetAge: TDateTime;

end;

TFormFile = class(TBaseFile, IOTAFile)

protected

function GetSource: string;

function GetAge: TDateTime;

end;

{ TBaseFile }

constructor TBaseFile.Create(const ModuleName, FormName, AncestorName: string);

begin

inherited Create;

FModuleName := ModuleName;

FFormName := FormName;

FAncestorName := AncestorName;

end;

{ TUnitFile }

function TUnitFile.GetSource: string;

var

Text: string;

ResInstance: THandle;

HRes: HRSRC;

begin

ResInstance := FindResourceHInstance(HInstance);

HRes := FindResource(ResInstance, ‘CODEGEN’, RT_RCDATA);

Text := PChar(LockResource(LoadResource(ResInstance, HRes)));

SetLength(Text, SizeOfResource(ResInstance, HRes));

Result := Format(Text, [FModuleName, FFormName, FAncestorName]);

end;

function TUnitFile.GetAge: TDateTime;

begin

Result := -1;

end;

{ TFormFile }

function TFormFile.GetSource: string;

constFormText =

‘object %0:s: T%0:s’#13#10’end';

begin

Result := Format(FormText, [FFormName]);

end;

function TFormFile.GetAge: TDateTime;

begin

Result := -1;

end;

{ TAppBarWizard }

{ TAppBarWizard.IOTAWizard }

function TAppBarWizard.GetIDString: string;

begin

Result := ‘DDG.AppBarWizard';

end;

function TAppBarWizard.GetName: string;

begin

Result := ‘DDG AppBar Wizard';

end;

function TAppBarWizard.GetState: TWizardState;

begin

Result := [wsEnabled];

end;

procedure TAppBarWizard.Execute;

begin

(BorlandIDEServices as

IOTAModuleServices).GetNewModuleAndClassName(

‘AppBar’, FUnitIdent, FClassName, FFileName);

(BorlandIDEServices as IOTAModuleServices).CreateModule(Self);

end;

{ TAppBarWizard.IOTARepositoryWizard/TAppBarWizard.IOTAFormWizard }

function TAppBarWizard.GetGlyph: HICON;

begin

Result := 0;       // Использовать стандартную пиктограмму

end;

function TAppBarWizard.GetPage: string;

begin

Result := ‘DDG';

end;

function TAppBarWizard.GetAuthor: string;

beginResult := ‘Delphi 5 Developer”s Guide';

end;

function TAppBarWizard.GetComment: string;

begin

Result := ‘Creates a new AppBar form.’

end;

{ TAppBarWizard.IOTACreator }

function TAppBarWizard.GetCreatorType: string;

begin

Result := ”;

end;

function TAppBarWizard.GetExisting: Boolean;

begin

Result := False;

end;

function TAppBarWizard.GetFileSystem: string;

begin

Result := ”;

end;

function TAppBarWizard.GetOwner: IOTAModule;

var

I: Integer;

ModServ: IOTAModuleServices;

Module: IOTAModule;

ProjGrp: IOTAProjectGroup;

begin

Result := nil;

ModServ := BorlandIDEServices as IOTAModuleServices;

for I := 0 to ModServ.ModuleCount – 1 do begin

Module := ModSErv.Modules[I];

// Поиск текущей группы проекта

if CompareText(ExtractFileExt(Module.FileName),

‘.bpg’) = 0 then

if Module.QueryInterface(IOTAProjectGroup,

ProjGrp) = S_OK then begin

// Возвратить активный проект группы

Result := ProjGrp.GetActiveProject;

Exit;

end;

end;

end;

function TAppBarWizard.GetUnnamed: Boolean;

begin

Result := True;

end;{ TAppBarWizard.IOTAModuleCreator }

function TAppBarWizard.GetAncestorName: string;

begin

Result := ‘TAppBar';

end;

function TAppBarWizard.GetImplFileName: string;

var

CurrDir: array[0..MAX_PATH] of char;

begin

// Примечание: необходим полный путь!

GetCurrentDirectory(SizeOf(CurrDir), CurrDir);

Result := Format(‘%s\%s.pas’, [CurrDir, FUnitIdent, ‘.pas’]);

end;

function TAppBarWizard.GetIntfFileName: string;

begin

Result := ”;

end;

function TAppBarWizard.GetFormName: string;

begin

Result := FClassName;

end;

function TAppBarWizard.GetMainForm: Boolean;

begin

Result := False;

end;

function TAppBarWizard.GetShowForm: Boolean;

begin

Result := True;

end;

function TAppBarWizard.GetShowSource: Boolean;

begin

Result := True;

end;

function TAppBarWizard.NewFormFile(const FormIdent, AncestorIdent: string): IOTAFile;

begin

Result := TFormFile.Create(”, FormIdent, AncestorIdent);

end;

function TAppBarWizard.NewImplSource(const ModuleIdent, FormIdent, AncestorIdent: string): IOTAFile;

begin

Result := TUnitFile.Create(ModuleIdent, FormIdent,

AncestorIdent);

end;

function TAppBarWizard.NewIntfSource(const ModuleIdent, FormIdent, AncestorIdent: string): IOTAFile;

begin

Result := nil;

end;

procedure TAppBarWizard.FormCreated(const FormEditor: IOTAFormEditor);

begin

// Не делает ничего

end;

end.В данном  модуле для генерации исходного кода используется интересный прием: неформатированный исходный код сохраняется в файле .res, который подключает ся с помощью директивы $R. Это очень  гибкий способ  хранения исходного кода мас тера,  позволяющий легко  его модифицировать. Файл ресурсов (.res) создается при подключении текстового файла  и файла  ресурсов RCDATA в файл  .RC, который затем компилируется с помощью компилятора BRCC32. В листингах 17.10 и 17.11 приведено содержимое файлов CodeGen.txt и CodeGen.rc.

Листинг 17.10. CodeGen.txt — шаблон ресурсов мастера AppBar

unit %0:s;

interface uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,

Dialogs, AppBars;

type

T%1:s = class(%2:s)

private

{ Закрытые объявления }

public

{ Открытые объявления }

end;

var

%1:s: T%1:s;

implementation

{$R *.DFM}

end.Листинг 17.11. CODEGEN.RC

CODEGEN RCDATA CODEGEN.TXTРегистрация пользовательского модуля  и мастера происходит внутри  процедуры Register() в пакете  разработки,  содержащем этот  модуль,  с помощью следующих двух строк:

RegisterCustomModule(TAppBar, TCustomModule); RegisterPackageWizard(TAppBarWizard.Create);

Резюме

Прочитав настоящую главу, можно  гораздо лучше понять принципы работы раз личных модулей  и  интерфейсов,  предоставляемых Delphi   интерфейсом API  Open Tools.  В частности, здесь  изложено, как создавать мастера, встраиваемые в интегри рованную среду разработки. Эта глава завершает часть IV, “Компонент ориентирован ная разработка” данной книги.  В следующей части  V, “Разработка корпоративных приложений” изложены методы  построения приложений корпоративного уровня  на основании технологий COM+ и MTS.

 

Источник: Тейксейра, Стив, Пачеко, Ксавье.   Borland Delphi 6. Руководство разработчика. : Пер.  с англ. — М. : Издательский дом “Вильямс”, 2002. —  1120 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии