Delphi XE2中的TDataModule.ClassGroup伪属性到底是什么?

4
我尝试将一个组件从一个数据模块复制并粘贴到Delphi XE2中的另一个数据模块。该组件是Fast Report数据源链接组件。数据模块是全新的,在XE2中刚刚创建。

其他人遇到了同样的问题,并在quality central as 106369上报告了这个问题,同样的错误消息导致我查看了这个mysterious DocWiki entry.

因此,数据模块现在具有框架亲和性和设计时伪属性,根据文档:

“由于ClassGroup伪属性仅由IDE使用,而不是编译器生成的属性(因此,“伪属性”),因此ClassGroup未在编译器生成的库引用中记录。您正在阅读的页面是ClassGroup的文档。”

所以,当我想要从现有的设计时构建块集中复制和粘贴组件到我的数据模块时,它阻止了我,并且这是我第一次知道它的存在。

一旦我改变数据模块的亲和性,就可以将内容粘贴到数据模块中而不会出现问题。谢天谢地有Google——那个错误,否则我就会卡住了。
如果它旨在帮助我们编写跨平台数据模块,但根据文档,它只影响IDE,这与您在设计时玩弄它时收到的警告不一致,如果更改它,您会收到以下错误:
 EInvalidType : The following component(s) are not available in the specified 
 class group. This is likely to cause compile or runtime errors. 
 frxDBSet.TfrxDBDataset.

我看不出这个错误消息和文档都是正确的。如果设置不正确,警告似乎表明会出现编译、链接和运行时错误。好奇的人想知道这是什么,为什么它被添加到XE2的数据模块中。我预计其他人也会偶然发现这个奇怪的特性,感觉自己像踩在恐龙粪便上,想知道这个特性的情况。我的最佳答案是,在XE2中,数据模块对TPersistent有亲和性,这意味着该数据模块不希望在其中放置非视觉控件,这些控件是特定于VCL的。在Delphi的将来版本中,也许会有一个类似的标记,允许我们将表单标记为“没有依赖于VCL或Windows”?更新1:您的数据模块的.PAS源代码以一种类似于编译指令的方式存储了这个伪属性,如下所示:
implementation

{%CLASSGROUP 'Vcl.Controls.TControl'}

@KenWhite,Remy Lebeau已经完成了。 :) - Francesca
这个问题要么是无法回答的(你的观点),要么是显而易见的(Remy),或者可能有更多我们可以从使用Delphi中找到的信息(我提问的原因)。如果您能回答,请投票关闭或回答此问题。 - Warren P
@François,不是真的。Remy重申了文档,并且Warren所问的重要部分是“在将来的版本中...也许会有类似的标记允许” - 除非我们在EMBT内部并且了解未来计划的信息,否则对“将来的版本”进行推测是不合适的讨论。 :-) Warren,我在7个小时前就已经这样做了 - 你的评论是针对我的吗?请注意,我没有投反对票;问题问得很好,但在这里并不合适。Bug(即使是文档中的)应该在QC上报告,而占卜则应该在通常聚集的地方进行。:D - Ken White
我认为这是一个架构问题;了解Delphi工具集。 - Warren P
我猜正如Remy所说,这确实是显而易见的。 - Warren P
1个回答

9
我认为它的预期使用非常明显,而且你链接的文档对这个目的非常详尽。它旨在防止仅限于VCL的组件被放置在FireMonkey可访问的DataModule上,反之亦然。由于TDataModule最初是框架中立的,因此只有框架中立的组件才能放置在其上。因此,很明显,你的源DataModule与新的DataModule具有不同的关联性,这就是为什么在你将新的DataModule的关联性更改为源DataModule的关联性之前,复制/粘贴无法正常工作的原因。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接