我有来自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.
答案 0 :(得分:2)
完整的存储库向导(带有自定义表单)在Bruno Fierens的白皮书中进行了演示,您可以从此处获取:http://forms.embarcadero.com/forms/AMUSCA1104BrunoFierensOTAPIWhitepaper通过Embarcadero。
我给你链接而不仅仅是答案的原因是我注意到你的代码不止一个问题,你将从阅读白皮书中受益!它不会花费你很长时间,演示应用程序随之而来,它不仅解决了这个问题,而且在玩OTAPI时可能遇到的大多数问题。