Delphi 注册表类X扩展TForm/eFileError';名为TForm的类已存在'‏;

Delphi 注册表类X扩展TForm/eFileError';名为TForm的类已存在'‏;,delphi,delphi-7,tform,Delphi,Delphi 7,Tform,我在一个单独的单元中扩展了TForm TForm = class(Forms.TForm) protected { convenient extensions } public { more extensions } end; 这个单元(带有扩展的TForm)在我想要应用这些扩展的所有表单单元中声明 但是,在其中一些单元中,有以下代码段: Initialization RegisterClass(TFormN); Finalization UnRegisterClass(TFormN

我在一个单独的单元中扩展了TForm

TForm = class(Forms.TForm)
protected
{ convenient extensions }
public
{ more extensions }
end;
这个单元(带有扩展的TForm)在我想要应用这些扩展的所有表单单元中声明

但是,在其中一些单元中,有以下代码段:

Initialization
  RegisterClass(TFormN);

Finalization
  UnRegisterClass(TFormN);
但通过这种方式,我得到消息[EFilerError]“名为TForm的类已经存在”

过去几天我一直在寻找解决这场冲突的方法,但没有成功

有没有人经历过这个。。。?或者可以解释为什么这个问题


问题是我已经在两个项目中用扩展的形式实现了这个单元-成功地

刚才,在第三个项目中,表单类在没有实例化的情况下被调用。。。我不能从以下位置更改扩展类表单:

TForm=class(Forms.TForm)

致:

TStyleForm=class(Forms.TForm)


我需要的是:

TFormStyle = class(Forms.TForm)
public
  constructor Create(AOwner: TComponent); override;
end;

TForm = ^TFormStyle;
但在单位里我不能做这样的声明:

TMyForm = class(TForm)
  { something... } 
end;

因为现在它是一个指针…

您的程序中现在有两种不同的类型,它们的名称都是
TForm
。VCL中声明的名称注册为
TForm
。由于您试图使用与VCL版本相同的名称向全局注册表注册
TForm
,因此注册自然会失败

一些可能的前进方式:

  • 重命名表单以避免冲突
  • 不要注册你的班级。您不需要注册表单,因为它们不是由流框架实例化的。您可以通过提供一个元类来实例化它们。可以通过
    Application.CreateForm
    ,也可以通过标准构造函数
    TForm.Create
    。您需要确保在任何uses子句中,始终在
    Forms
    之后列出声明您的
    TForm
    的单元。或者使用全范围类型,如
    MyForms.TForm
  • 如果您使用的是更高版本的Delphi,则可以使用类帮助器添加扩展
  • 就我个人而言,我倾向于做上面的1和2

    请注意,我假设您的意图是将
    TForm
    用于所有表单,而不是
    forms.TForm