Зарегистрируйте пользовательскую форму в Delphi 2010 с помощью ToolsApi - PullRequest
1 голос
/ 22 июня 2010

У меня есть пользовательская форма, которая является потомком от TForm.Я использовал ToolApi, чтобы зарегистрировать пользовательский модуль и добавить его в репозиторий.Все идет нормально.Но когда я нажимаю Файл-> Создать, я вижу свою категорию со значком для моей пользовательской формы, но она отключена.Значок отображается серым цветом, и я не могу выбрать его, чтобы создать свою пользовательскую форму из меню и добавить ее в проект.

Есть ли у вас какие-либо предложения и советы, что не так и что я должен попробовать?

Нажмите здесь, чтобы передать мой исходный код ...

Заранее спасибо.

Редактировать:

Также есть список кода, для которого я считаю важным:

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 Ответ

2 голосов
/ 11 апреля 2011

Полный мастер репозитория (с пользовательской формой) демонстрируется в официальном документе Бруно Ференса, который вы можете получить здесь: http://forms.embarcadero.com/forms/AMUSCA1104BrunoFierensOTAPIWhitepaper через Embarcadero.

Причина, по которой я даю вам ссылку, а не просто ответ, заключается в том, что я заметил более одной проблемы с вашим кодом, вам будет полезно прочитать этот документ! Это не займет у вас много времени, демо-приложения поставляются с ним, и это решит не только эту проблему, но и большинство проблем, с которыми вы можете столкнуться при игре с OTAPI.

...