2013-06-05 41 views
1

我已经在一个单独的单元扩展TForm的...的RegisterClass X扩展TForm的/ EFilerError“命名TForm的一类已经存在”

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

而这个单元(与扩展TForm的)中的所有声明窗体的单位,我想申请但这些扩展...

,在一些单位有下面的代码片段:

Initialization 
    RegisterClass(TFormN); 

Finalization 
    UnRegisterClass(TFormN); 

可是这样我得到的消息[EFilerEr ROR]“命名的TForm的一类已经存在”

我花了几天的寻找一种方式来解决/工作解决此冲突,但没有成功......

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


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

刚才,在第三个项目,表单类被称为而不实例化...我不能扩展的类形式从改变:

TForm的=类(Forms.TForm)

到:

TStyleForm = A类(Forms.TForm)

...


什么我需要的是这样的:

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

TForm = ^TFormStyle; 

但在单位我不能这样做:

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

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

回答

0

您现在可以在你的程序两种截然不同的类型,这两种名为TForm。 VCL中声明的名称是TForm。由于您试图将您的TForm注册到全局注册表中,使用与VCL版本相同的名称,注册自然会失败。

一些可能的前进方向:

  1. 重新命名方式,以避免冲突。
  2. 根本不要注册你的课程。你不需要注册表单,因为它们没有被流式框架实例化。你通过提供一个元类来实例化它们。可以是Application.CreateForm,也可以是标准构造函数TForm.Create。您需要确保您始终在Forms之后的任何使用条款中列出声明您的TForm的设备。或者使用完全范围的类型,如MyForms.TForm
  3. 如果您使用了Delphi的更高版本,则可以使用类助手来添加您的扩展。

就我个人而言,我倾向于做上面的1和2。

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