开发者

Register custom form in delphi 2010 with ToolsApi

开发者 https://www.devze.com 2023-01-04 14:15 出处:网络
I have custom form which is descendant from TForm. I used ToolApi to register custom module and add it to repository. So far so good. But when I click on File->NewI can see my category with icon for m

I have custom form which is descendant from TForm. I used ToolApi to register custom module and add it to repository. So far so good. But when I click on File->New I can see my category with icon for my custom form but it is disabled. Icon is grayed and I cannot select it to create my custom form from menu and add it to project.

Do you have any suggestions and tips what is wrong and what should I try?

Click here to transfer my source code...

Thanks in advance.

Edit:

There is also listing of code for which I think it is important:

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, Anc开发者_StackOverflowestorIdent);
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.


A complete Repository Wizard (with custom form) is demonstrated in Bruno Fierens' whitepaper, which you can get from here: http://forms.embarcadero.com/forms/AMUSCA1104BrunoFierensOTAPIWhitepaper through Embarcadero.

The reason I'm giving you the link as opposed to just the answer is that I've noticed more than one issue with your code, you will benefit from reading through the whitepaper! It won't take you long, the demo applications come with it, and it will not only solve this one problem, but most issues you may face when playing with the OTAPI.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号