18

在以前的 Delphi 版本中,我使用数据模块 ( TDataModule) 作为保存非可视组件的地方,以避免使主窗体混乱。在 Delphi XE2 中,当我创建一个新的数据模块时,它只允许我在其中放置与数据库相关的组件(例如TADOConnectionTDataSource)。为什么会这样,我怎样才能将其他组件放入其中?有替代方案吗?

4

2 回答 2

21

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

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

在您的情况下,您可能希望接受 VCL 组件,因此您需要指定一个ClassGroup.Vcl.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。)
于 2012-12-31T10:16:18.097 回答
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'}

切换到DesignView 后,您将看到所有组件,如您所愿。

(德尔福 XE2 16.0.4504.48759)

于 2012-12-31T07:52:48.420 回答