18
votes

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?

2
Can you give an example of a non-visual component (one that is provided with Delphi, preferably) that it won't allow? I've never seen this problem.Ken White
Like a TImageList or TMainMenu or TActionManager - When I try to paste one, it says the component class is not found, and the palette only shows database related components.Jerry Dodge
Could it be my specific edition of RAD Studio? But then I have Enterprise, should have about everything.Jerry Dodge
I can confirm this with File->New->VCL Forms Application, and then File->New->Other->Delphi Files->Datamodule, which leaves only the database, Intraweb, FastReports, and Indy components available in the component palette. (TImageList and TActionList are not there.) Using the Pro SKU, so it's not that causing the problem.Ken White
@Ken In fact it wasn't broken in XE2. And XE3 didn't fix anything. What XE3 did was move actions out of the VCL and into a lower level and so be available to all frameworks.David Heffernan

2 Answers

21
votes

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.)
11
votes

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)