Delphi XE2数据模块只需要数据库组件吗?

Jer*_*dge 18 delphi datamodule delphi-xe2

在Delphi的早期版本中,我使用数据模块(TDataModule)作为保留非可视组件的地方,以避免使主表单混乱.在Delphi XE2中,当我创建一个新的数据模块时,它只允许我在其中放置与数据库相关的组件(例如TADOConnectionTDataSource).这是为什么以及如何将其他组件放入其中?还有其他选择吗?

Dav*_*nan 21

数据模块随XE2版本而变化.请记住,除了长期存在的VCL之外,XE2还引入了一个新的组件框架FireMonkey.名为的新伪属性ClassGroup已添加到数据模块中.它控制可以在IDE设计器中将哪些组件添加到数据模块.

ClassGroup数据模块的默认值是System.Classes.TPersistent.这指定数据模块是框架中性的,因此既不接受VCL组件也不接受FMX组件.

在你的情况,你可能想,所以你需要指定一个接受VCL组件ClassGroupVcl.Controls.TControl.

阅读所有关于ClassGroup的文档.

System.Classes.TDataModule及其后代类(如Web.HTTPApp.TWebModule)具有名为ClassGroup的伪属性,该属性执行以下操作:

  • 确定数据模块的框架关联.也就是说,ClassGroup指定数据模块是框架中立的,或者是与特定框架(即VCL或FMX)一起工作.
  • 在工具选项板中启用特定于框架的非可视组件.您需要在Object Inspector中为ClassGroup设置特定于框架的值,以便启用特定于框架的非可视组件,如下所示:
    • TActionList仅为VCL,因此要在Tool Palette中启用TActionList,必须将ClassGroup设置为VCL设置.
    • TTimer存在于FMX和VCL中.要为正确的框架启用TTimer,必须将ClassGroup设置为FMX或VCL,以匹配父应用程序的框架.(TTimer和TActionList将在本主题后面进一步讨论.)

  • +1并感谢包括解释. (3认同)

Sir*_*ufo 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.
Run Code Online (Sandbox Code Playgroud)

是由线引起的

{%CLASSGROUP 'System.Classes.TPersistent'}
Run Code Online (Sandbox Code Playgroud)

摆脱只是删除或修改行

{.%CLASSGROUP 'System.Classes.TPersistent'}
Run Code Online (Sandbox Code Playgroud)

切换到DesignView 后,您将看到所需的所有组件.

(德尔福XE2 16.0.4504.48759)

  • 另见http://stackoverflow.com/questions/11250019/what-does-tdatamodule-classgroup-pseudo-property-in-delphi-xe2-really-do (2认同)