视觉形式继承问题。 “不能从(父窗体)继承。包含不支持继承的组件”

时间:2011-01-28 03:45:25

标签: delphi delphi-7

我有一个后代的基本表格。基础表单上有一个TElRelDataSource(来自ElPack v4.00)。当我打开后代表单时,我收到一个错误“无法继承(父表单)。包含一个不支持继承的组件”。这是与祖先形式开放(有两个),以避免“祖先形式(父形式)未找到”错误。

Delphi 7不支持(AFAIK)最终类,但这似乎是一个标准的错误消息。这是在“德尔福的Tomes:故障排除”的索引中,但我没有那份副本,我不愿意花费60美元来阅读“这就是为什么你应该避免VFI”这样的条目(对此感到悲观)书的内容)。除此之外,Google或Bing中没有引用。

这是我最近从一个刚离开的人那里继承的代码,我是他们离开后第一个改变它的人。这意味着我无法问他是如何制造违规表格的。

那么,我该如何解决此错误消息?

2 个答案:

答案 0 :(得分:5)

你陷入了一个有趣的问题。首先,您说父表单已经包含违规的DataSource,因此您必须问自己一个问题:原始开发人员如何设置将数据集放在父表单上,然后创建子表单,如果创建子表单被数据源拒绝?

原始代码没有TElRelDataSource

这意味着你试图将自己添加到自己身上。不要添加它,找到一个不依赖于TElRelDataSource的其他解决方案。

原始代码确实拥有它!

原始版本可能是针对不同版本的TElRelDataSource编译的,其中一个版本允许继承。 “Inherability”由“csInheritable”组件样式控制。也就是说,如果组件在ComponentStyle中不包含“csInheritable”,则Delphi IDE将不允许可视继承。您有很多选择:

  • 使用不同版本的TElRelDataSource,也许原始版本是针对TEERRelDataSource的NEWER版本编译的。如果您使用的是最新的TElRelDataSource,作者可能认为它的代码无法处理视觉继承,因此他/她从ComponentStyle中删除了csInheritable标志!
  • 尝试制作自己的派生组件并自行设置该样式。这很容易做到,但如果TElRelDataSource的作者出于某种原因删除了csInheritable标志,你可能会遇到麻烦。
  • 通常,HeartWare的想法会很好用;不幸的是,使用DATA SOURCE组件并不容易:我假设您有链接到该数据源的DB-Aware控件。如果您从代码创建DataSource,您还需要重新创建与数据感知控件的连接,这将需要大量的“if-s”(或巧妙地使用RTTI)。
  • 您可以尝试将DataSource移动到TDataModule。这可能比较麻烦,值得。

答案 1 :(得分:3)

一种选择是从表单中删除有问题的组件,并在FormCreate事件中动态分配它。根据(假定的)非可视数据源组件的属性数量,这可能相当简单。