4

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

其他人也有同样的问题,并在质量中心报告为 106369,同样的错误消息将我引导到这个神秘的 DocWiki 条目。

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

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

因此,我什至第一次知道它的存在是当它阻止我从一组现有的设计时构建块中复制和粘贴组件到我的数据模块中时,我不想从头开始重建。

一旦我更改了数据模块的关联性,我就可以将内容粘贴到数据模块中而不会打扰我。谢天谢地,谷歌那个错误,否则我会被卡住。

如果它旨在帮助我们编写跨平台数据模块,但它只影响 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 的数据模块中。我预计其他人会偶然发现这个奇怪的功能,感觉他们踩到了恐龙粪便之类的东西,并想知道这个功能是怎么回事。

在这一点上,我最好的答案是数据模块对 TPersistent 的亲和性,这意味着,用 XE2 术语来说,这个数据模块不希望其中包含 VCL 特定的非可视控件。在 Delphi 的未来版本中,也许一个类似的标记也可以让我们将表单标记为“对 VCL 或 Windows 的依赖项”?

更新 1:数据模块的 .PAS 源代码以一种看起来有点像编译器指令的方式存储此伪属性,如下所示:

implementation

{%CLASSGROUP 'Vcl.Controls.TControl'}
4

1 回答 1

8

我认为这很明显是它的预期用途,并且您链接到的文档对此目的非常广泛。

它旨在防止仅 VCL 的组件被放置在 FireMonkey 可访问的 DataModule 上,反之亦然。

由于 TDataModule 最初是框架中立的,因此只能在其上放置框架中立的组件。

很明显,您的源 DataModule 与您的新 DataModule 具有不同的亲和性,这就是为什么在您更改新 DataModule 的亲和性以匹配源 DataModule 的亲和性之前复制/粘贴不起作用的原因。

于 2012-06-28T21:10:28.237 回答