RegisterClass X Extended TForm / EFilerError'一个名为TForm的类已经存在'

时间:2013-06-05 12:06:55

标签: delphi delphi-7 tform

我已将TForm扩展到一个单独的单元......

TForm = class(Forms.TForm)
protected
{ convenient extensions }
public
{ more extensions }
end;

此单元(带有扩展的TForm)在我想要应用这些扩展的表格的所有单元中声明...

但是,在某些单元中有以下代码片段:

Initialization
  RegisterClass(TFormN);

Finalization
  UnRegisterClass(TFormN);

但是这样我收到消息[EFilerError]'一个名为TForm的类已经存在'

我花了最后几天寻找解决/解决这场冲突的方法,但没有成功......

有没有人经历过这个......?或者可以阐明为什么会出现这个问题......?


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

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

  

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;

因为现在它是一个指针......

1 个答案:

答案 0 :(得分:0)

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

一些可能的前进方式:

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

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

相关问题