Delphi XE2数据模块只支持数据库组件吗?

18

在以前的Delphi版本中,我曾经使用数据模块 (TDataModule) 存储非可视化组件,以避免主窗体混乱。但在 Delphi XE2 中,新建数据模块时只能放置与数据库相关的组件(如 TADOConnectionTDataSource)。这是为什么?如何将其他组件放入其中?是否有替代方案?


你能举一个非可视化组件的例子吗(最好是Delphi提供的)它不允许这样做?我从未遇到过这个问题。 - Ken White
就像 TImageListTMainMenuTActionManager - 当我尝试粘贴其中一个时,它会显示组件类未找到,并且工具箱只显示与数据库相关的组件。 - Jerry Dodge
可能是我的RAD Studio版本有问题吗?但是我用的是企业版,应该包含了所有功能。 - Jerry Dodge
3
实际上,在XE2中它并没有损坏。而XE3也没有修复任何问题。XE3所做的是将操作从VCL中移出到较低级别,并使其可用于所有框架。 - David Heffernan
@David:谢谢。我显然错了。 :-) - Ken White
显示剩余3条评论
2个回答

21
以下是翻译的结果:

XE2发布后,数据模块发生了变化。请记住,XE2不仅引入了长期存在的VCL,还引入了一个新的组件框架FireMonkey。数据模块添加了一个名为ClassGroup的新伪属性。这控制了可以在IDE设计器中向数据模块添加哪些组件。

数据模块的默认ClassGroupSystem.Classes.TPersistent。这指定数据模块是框架中立的,因此不接受VCL组件或FMX组件。

在您的情况下,您可能希望接受VCL组件,因此需要指定ClassGroupVcl.Controls.TControl

请阅读documentation以了解有关ClassGroup的所有信息。

System.Classes.TDataModule及其派生类,例如Web.HTTPApp.TWebModule,拥有一个伪属性名为ClassGroup,它具有以下功能:
- 确定数据模块的框架亲和性。也就是说,ClassGroup指定数据模块是框架中立的还是要与特定框架(即VCL或FMX)一起使用。 - 在工具箱中启用框架特定的非可视组件。您需要在对象检查器中设置ClassGroup的框架特定值,以便启用框架特定的非可视组件,例如以下内容: - TActionList仅适用于VCL,因此要在工具箱中启用TActionList,必须将ClassGroup设置为VCL设置。 - TTimer存在于FMX和VCL中。要为正确的框架启用TTimer,您必须将ClassGroup设置为FMX或VCL,以匹配父应用程序的框架。(TTimer和TActionList将在本主题后面进一步讨论。)

11

这 (有缺陷的) 行为在

unit Unit2;

interface

uses
  System.SysUtils, System.Classes;

type
  TDataModule2 = class(TDataModule)
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  DataModule2: TDataModule2;

implementation

{%CLASSGROUP 'System.Classes.TPersistent'}

{$R *.dfm}

end.

由于线路引起

{%CLASSGROUP 'System.Classes.TPersistent'}

要去除它,只需删除或修改该行为:

{.%CLASSGROUP 'System.Classes.TPersistent'}

切换到Design视图后,您将看到所有组件,正如您所期望的那样。

(Delphi XE2 16.0.4504.48759)


太完美了!我知道它一定是某些简单的东西,就像往常一样。 - Jerry Dodge
PS - 最困难的部分是找出如何创建数据模块,以便在整个应用程序中使用常见组件 - 我最终在项目的主dpr文件中使用try..finally块来创建/销毁它,包装表单创建和Run - Jerry Dodge
2
请参阅https://dev59.com/3WXWa4cB1Zd3GeqPNob-。 - Jan Doggen
1
你可以直接在对象检查器中完成这个操作:选择数据模块并相应地设置其 ClassGroup 属性。然后关闭并重新打开数据模块单元。 - Uwe Raabe
既然问题已经解决,我在思考为什么TPersistent会使数据模块只允许数据库相关组件?这是如何实现的?TComponentTPersistent - Jerry Dodge
显示剩余3条评论

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