使用ToolsApi在delphi 2010中注册自定义表单

时间:2010-06-22 16:12:58

标签: delphi delphi-2009 delphi-2010 delphi-2007 delphi-2006

我有来自TForm的后代的自定义表单。我使用ToolApi注册自定义模块并将其添加到存储库。到现在为止还挺好。但是当我点击File-> New时,我可以看到我的自定义表单的图标类别,但它被禁用了。图标是灰色的,我无法从菜单中选择它来创建自定义表单并将其添加到项目中。

您有什么建议和提示有什么不对吗?我应该尝试什么?

Click here to transfer my source code...

提前致谢。

修改

还有我认为重要的代码列表:

unit CustomFormFrame_Design;    

interface

{$Include jvcl.inc}

uses Windows, Classes, ToolsAPI;

type
    TPoCustomFormWizard = class(TNotifierObject, IOTAWizard, IOTARepositoryWizard,    
    IOTAFormWizard, IOTACreator, IOTAModuleCreator,    
    IOTARepositoryWizard60   
    {$IFDEF COMPILER8_UP}, IOTARepositoryWizard80 {$ENDIF COMPILER8_UP}   
    {$IFDEF COMPILER10_UP}, IOTAProjectWizard100 {$ENDIF COMPILER10_UP})   
  private
     FUnitIdent: string;
     FClassName: string;
     FFileName: string;
  protected
    // IOTAWizard methods
    function GetIDString: string;
    function GetName: string;
    function GetState: TWizardState;
    procedure Execute;
    // IOTARepositoryWizard / IOTAFormWizard methods
    function GetAuthor: string;
    function GetComment: string;
    function GetPage: string;
    function GetGlyph: Cardinal;
    // IOTACreator methods
    function GetCreatorType: string;
    function GetExisting: Boolean;
    function GetFileSystem: string;
    function GetOwner: IOTAModule;
    function GetUnnamed: Boolean;
    // IOTAModuleCreator methods
    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);

    { IOTARepositoryWizard60 }
    function GetDesigner: string;

    {$IFDEF COMPILER8_UP}
    { IOTARepositoryWizard80 }
    function GetGalleryCategory: IOTAGalleryCategory; virtual;
    function GetPersonality: string; virtual;
    {$ENDIF COMPILER8_UP}

    {$IFDEF COMPILER10_UP}
    { IOTAProjectWizard100 }
    function IsVisible(Project: IOTAProject): Boolean;
    {$ENDIF COMPILER10_UP}

    {$IFDEF COMPILER8_UP}
    property Personality: string read GetPersonality;
    {$ENDIF}


    end;

    procedure Register;    

implementation

  uses Forms, PoCustomForm,  SysUtils, DesignIntf, DesignEditors;

  {$R *.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;

 procedure Register;
 begin
   RegisterCustomModule(TPoCustomForm, TCustomModule);
   RegisterPackageWizard(TPoCustomFormWizard.Create);
 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;
const FormText = '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 TPoCustomFormWizard.GetIDString: string;
begin
  Result := 'XFORM.PoCustomForm';
end;

function TPoCustomFormWizard.GetName: string;
begin
  Result := 'XFORM PoCustom Form Wizard';
end;

function TPoCustomFormWizard.GetState: TWizardState;
begin
  Result := [wsEnabled];
end;

procedure TPoCustomFormWizard.Execute;
begin
  (BorlandIDEServices as IOTAModuleServices).GetNewModuleAndClassName(
  'PoCustomForm', FUnitIdent, FClassName, FFileName);
  (BorlandIDEServices as IOTAModuleServices).CreateModule(Self);
end;

{ TPoCustomFormWizard.IOTARepositoryWizard / TPoCustomFormWizard.IOTAFormWizard }
function TPoCustomFormWizard.GetGlyph: Cardinal;
begin
  Result := 0; // use standard icon
end;


function TPoCustomFormWizard.GetPage: string;
begin
  Result := 'XFORM';
end;

function TPoCustomFormWizard.GetAuthor: string;
begin
  Result := 'XFORM';
end;

function TPoCustomFormWizard.GetComment: string;
begin
  Result := 'Creates a new PoCustom form.'
end;

{ TPoCustomFormWizard.IOTACreator }
function TPoCustomFormWizard.GetCreatorType: string;
begin
  Result := '';
end;

function TPoCustomFormWizard.GetDesigner: string;
begin
  Result := dVCL;
end;

{$IFDEF COMPILER8_UP}
function TPoCustomFormWizard.GetGalleryCategory: IOTAGalleryCategory;
begin
  Result := (BorlandIDEServices as IOTAGalleryCategoryManager).FindCategory('Borland.Delphi.New.Expert');
end;

function TPoCustomFormWizard.GetPersonality: string;
begin
  Result := sDelphiPersonality;
end;
{$ENDIF COMPILER8_UP}

{$IFDEF COMPILER10_UP}
function TPoCustomFormWizard.IsVisible(Project: IOTAProject): Boolean;
begin
  Result := True;
end;
{$ENDIF COMPILER10_UP}

function TPoCustomFormWizard.GetExisting: Boolean;
begin
  Result := False;
end;

function TPoCustomFormWizard.GetFileSystem: string;
begin
  Result := '';
end;

function TPoCustomFormWizard.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];
    // find current project group
    if CompareText(ExtractFileExt(Module.FileName), '.bpg') = 0 then
    if Module.QueryInterface(IOTAProjectGroup, ProjGrp) = S_OK then
    begin
      // return active project of group
     Result := ProjGrp.GetActiveProject;
     Exit;
   end;
  end;
end;

function TPoCustomFormWizard.GetUnnamed: Boolean;
begin
  Result := True;
end;

{ TPoCustomFormWizard.IOTAModuleCreator }
function TPoCustomFormWizard.GetAncestorName: string;
begin
  Result := 'TPoCustomForm';
end;

function TPoCustomFormWizard.GetImplFileName: string;
var
CurrDir: array[0..MAX_PATH] of Char;
begin
  // Note: full path name required!
  GetCurrentDirectory(SizeOf(CurrDir), CurrDir);
  Result := Format('%s\%s.pas', [CurrDir, FUnitIdent, '.pas']);
end;

function TPoCustomFormWizard.GetIntfFileName: string;
begin
  Result := '';
end;

function TPoCustomFormWizard.GetFormName: string;
begin
  Result := FClassName;
end;

function TPoCustomFormWizard.GetMainForm: Boolean;
begin
  Result := False;
end;

function TPoCustomFormWizard.GetShowForm: Boolean;
begin
  Result := True;
end;

function TPoCustomFormWizard.GetShowSource: Boolean;
begin
  Result := True;
end;

function TPoCustomFormWizard.NewFormFile(const FormIdent,
AncestorIdent: string): IOTAFile;
begin
  Result := TFormFile.Create('', FormIdent, AncestorIdent);
end;

function TPoCustomFormWizard.NewImplSource(const ModuleIdent, FormIdent,
AncestorIdent: string): IOTAFile;
begin
  Result := TUnitFile.Create(ModuleIdent, FormIdent, AncestorIdent);
end;

function TPoCustomFormWizard.NewIntfSource(const ModuleIdent, FormIdent,
AncestorIdent: string): IOTAFile;
begin
  Result := nil;
end;

procedure TPoCustomFormWizard.FormCreated(const FormEditor: IOTAFormEditor);
begin
// do nothing
end;

end.

1 个答案:

答案 0 :(得分:2)

完整的存储库向导(带有自定义表单)在Bruno Fierens的白皮书中进行了演示,您可以从此处获取:http://forms.embarcadero.com/forms/AMUSCA1104BrunoFierensOTAPIWhitepaper通过Embarcadero。

我给你链接而不仅仅是答案的原因是我注意到你的代码不止一个问题,你将从阅读白皮书中受益!它不会花费你很长时间,演示应用程序随之而来,它不仅解决了这个问题,而且在玩OTAPI时可能遇到的大多数问题。