Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Delphi XE2 Data Module expects only database components?

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?

like image 771
Jerry Dodge Avatar asked Dec 31 '12 03:12

Jerry Dodge


2 Answers

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)

like image 38
Sir Rufo Avatar answered Nov 15 '22 17:11

Sir Rufo


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.)
like image 130
David Heffernan Avatar answered Nov 15 '22 19:11

David Heffernan