1

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

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

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

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

Initialization
  RegisterClass(TFormN);

Finalization
  UnRegisterClass(TFormN);

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

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

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


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

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

TForm = 类(Forms.TForm)

到:

TStyleForm = 类(Forms.TForm)

...


我需要的是这样的:

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

TForm = ^TFormStyle;

但是在单位中我不能做这样的声明:

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

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

4

1 回答 1

0

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

一些可能的前进方式:

  1. 重命名表单以避免冲突。
  2. 根本不要注册你的课程。您不需要注册表单,因为它们不是由流框架实例化的。您通过提供元类来实例化它们。要么Application.CreateForm通过标准构造函数,要么通过标准构造函数TForm.Create。您需要确保始终在任何使用条款中列出声明您的TForm单位Forms。或者使用完全作用域的类型,例如MyForms.TForm.
  3. 如果您使用较新版本的 Delphi,您可以使用类助手添加您的扩展。

就个人而言,我倾向于同时执行上述 1 和 2。

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

于 2013-06-05T12:13:08.780 回答