delphi - Delphi XE2 中的 TDataModule.ClassGroup 伪属性到底有什么作用?

标签 delphi delphi-xe2 datamodule

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

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

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

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

所以,我第一次知道这个存在是当它阻止我从一组现有的设计时构建 block 中将组件复制并粘贴到我的数据模块中时,我不想从头开始重建这些组件。

一旦我更改了数据模块关联性,我就可以将内容粘贴到数据模块中,而不会打扰我。谢天谢地,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 的数据模块中。我预计其他人会偶然发现这个奇怪的功能,感觉自己踩到了恐龙粪便之类的东西,并想知道这个功能是怎么回事。

此时我最好的答案是数据模块与 TPersistent 的亲和性,用 XE2 行话来说,这意味着该数据模块不需要其中包含 VCL 特定的非可视控件。在 Delphi 的 future 版本中,也许类似的标记也将允许我们将表单标记为“不依赖于 VCL 或 Windows”?

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

implementation

{%CLASSGROUP 'Vcl.Controls.TControl'}

最佳答案

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

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

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

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

关于delphi - Delphi XE2 中的 TDataModule.ClassGroup 伪属性到底有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11250019/

相关文章:

delphi - 如何包含 Jenkins 作业所需的文件 (Delphi)

delphi - Delphi Firemonkey中的鼠标事件动画

德尔福风格: How to structure data modules for unit-testable code?

delphi - 在数据模块上分配组件属性时发生访问冲突

delphi - Delphi 数据模块的单元测试

SQL 查询因空结果而失败

php - 向 COM 对象传递流或从 COM 对象返回流

delphi - 如何在Delphi XE2上调试2个dll?

delphi - 使用 FireMonkey 的 Mac OS 应用程序数据文件夹

delphi - 缺少 SOAP 顶级节点