首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RegisterClass X扩展的TForm/EFilerError‘一个名为TForm的类已经存在’‏‘

RegisterClass X扩展的TForm/EFilerError‘一个名为TForm的类已经存在’‏‘
EN

Stack Overflow用户
提问于 2013-06-05 12:06:55
回答 1查看 1.9K关注 0票数 1

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

代码语言:javascript
复制
TForm = class(Forms.TForm)
protected
{ convenient extensions }
public
{ more extensions }
end;

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

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

代码语言:javascript
复制
Initialization
  RegisterClass(TFormN);

Finalization
  UnRegisterClass(TFormN);

但是这样我就可以得到消息EFilerError‘一个名为TForm的类已经存在’

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

有没有人经历过.?或者能解释为什么这个问题.?

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

刚才,在第三个项目中,调用表单类时不需要实例化.我不能将扩展类表单更改为:

TForm =类(Forms.TForm)

至:

TStyleForm =类(Forms.TForm)

..。

我需要的是:

代码语言:javascript
复制
TFormStyle = class(Forms.TForm)
public
  constructor Create(AOwner: TComponent); override;
end;

TForm = ^TFormStyle;

但在单位里,我不能做这样的声明:

代码语言:javascript
复制
TMyForm = class(TForm)
  { something... } 
end;

因为现在是个指针..。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-05 12:13:08

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

一些可能的前进途径:

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

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16939532

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档