Delphi XE2 Data Module expects only database compo

2020-02-10 12:23发布

问题:

In prior versions of Delphi, I have used the data module (TDataModule) as a place to keep non-visual components to avoid cluttering up the main form. In Delphi XE2, when I create a new data module, it only allows me to place database related components in it (such as TADOConnection and TDataSource). Why is this and how can I put other components in it? Is there an alternative?

回答1:

Data modules changed with the XE2 release. Remember that XE2 introduced a new component framework, FireMonkey, in addition to the long-standing VCL. A new pseudo-property, named ClassGroup was added to data modules. This controls what components can be added to the data module in the IDE designer.

The default ClassGroup for a data module is System.Classes.TPersistent. This specifies that the data module is framework neutral and so accepts neither VCL components nor FMX components.

In your case you probably want to accept VCL components so you need to specify a ClassGroup of Vcl.Controls.TControl.

Read all about ClassGroup in the documentation.

System.Classes.TDataModule and its descendant classes, such as Web.HTTPApp.TWebModule, have a pseudo-property named ClassGroup that does the following:

  • Determines the framework affinity for the data module. That is, ClassGroup specifies that the data module is either framework-neutral or is to work with a specific framework (namely, VCL or FMX).
  • Enables framework-specific nonvisual components in the Tool Palette. You need to set a framework-specific value for ClassGroup in the Object Inspector in order to enable framework-specific nonvisual components such as the following:
    • TActionList is VCL-only, and so to enable TActionList in the Tool Palette, you must set ClassGroup to the VCL setting.
    • TTimer exists in both FMX and VCL. To enable TTimer for the correct framework, you must set ClassGroup to either FMX or VCL, to match the framework of the parent application. (TTimer and TActionList are further discussed later in this topic.)


回答2:

This (buggy) behavior in

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.

is caused by the line

{%CLASSGROUP 'System.Classes.TPersistent'}

To get rid of just delete or modify the line into

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

After switch to Design View you will see all the components as you expect.

(Delphi XE2 16.0.4504.48759)