Pseudo-Eigenschaft ClassGroup von TDataModule
Nach oben zu Standard-Datenmodule erstellen und bearbeiten
Inhaltsverzeichnis
Wirkungen der Pseudo-Eigenschaft ClassGroup
System.Classes.TDataModule und davon abgeleitete Klassen, wie Web.HTTPApp.TWebModule, verfügen über die Pseudo-Eigenschaft ClassGroup, die Folgendes bewirkt:
- Legt die Framework-Verbindung für das Datenmodul fest. ClassGroup gibt an, dass das Datenmodul entweder Framework-unabhängig oder für ein bestimmtes Framework (nämlich VCL oder FMX) vorgesehen ist.
- Aktiviert Framework-spezifische, nicht-visuelle Komponenten in der Tool-Palette.
- Für ClassGroup müssen Sie im Objektinspektor einen Framework-spezifischen Wert setzen, damit Framework-spezifische, nicht-visuelle Komponenten, wie die folgenden, aktiviert werden:
- TActionList steht nur in der VCL zur Verfügung. Um TActionList in der Tool-Palette zu aktivieren, müssen Sie ClassGroup auf die VCL-Einstellung setzen.
- TTimer ist sowohl in FMX als auch der VCL vorhanden. Um TTimer für das richtige Framework zu aktivieren, müssen Sie ClassGroup entweder auf FMX oder auf VCL (entsprechend dem Framework der übergeordneten Anwendung) setzen.
-
- (TTimer und TActionList werden weiter unten in diesem Thema ausführlicher behandelt).
Da die Pseudo-Eigenschaft ClassGroup nur von der IDE verwendet wird und keine vom Compiler erzeugte Eigenschaft ist (daher "Pseudo-Eigenschaft"), ist sie in der vom Compiler erzeugten Bibliotheksreferenz nicht dokumentiert. Die Seite, die Sie gerade lesen, ist die Dokumentation für ClassGroup.
Werte von ClassGroup
Im Folgenden finden Sie die Werte für ClassGroup, die Sie im Objektinspektor auswählen können, sowie das Framework und die RTL-Elemente, die für das jeweilige Framework verwendet werden können:
ClassGroup | Zugeordnetes Framework | Laufzeitbibliothek |
---|---|---|
|
Keines (Framework-unabhängig) |
Delphi-RTL (außer nicht unterstützte Framework-spezifische Elemente) |
|
VCL-Framework |
Delphi-RTL (außer nicht unterstützte Framework-spezifische Elemente) |
|
FMX-Framework |
Delphi-RTL (außer nicht unterstützte Framework-spezifische Elemente) |
TDataModule ist zunächst Framework-unabhängig; mit ClassGroup wird die Framework-Zuordnung festgelegt
Beim Erstellen eines Datenmoduls enthält die Unit-Datei eine Direktive, die die Pseudo-Eigenschaft ClassGroup folgendermaßen auf einen Framework-unabhängigen Basiswert (System.Classes.TPersistent) setzt:
Delphi:
{%CLASSGROUP 'System.Classes.TPersistent'}
C++:
#pragma classgroup "System.Classes.TPersistent"
Wenn Sie den ClassGroup-Wert ändern, wird die Direktive automatisch im Code geändert.
Weil TDataModule anfänglich Framework-unabhängig ist, können Sie ein Datenmodul mit dem VCL- oder dem FireMonkey-Framework erstellen. Das bedeutet aber auch, dass Framework-spezifische Klassen und Member (wie Vcl.ActnList.TActionList und FMX.Types.TTimer) für ein Framework-unabhängiges Datenmodul in der Tool-Palette nicht verfügbar sind. Die passenden Framework-spezifischen Klassen und Member können Sie im Objektinspektor durch Setzen der Eigenschaft ClassGroup des Datenmoduls zur Angabe des richtigen Frameworks wie folgt einschließen:
- Vcl.Controls.TControl
- FMX.Controls.TControl (macOS)
Beispiele für Framework-spezifische, nicht-visuelle Komponenten
- TActionList ist eine nicht-visuelle VCL-Komponente und erscheint daher nicht in der Tool-Palette für ein Datenmodul, dessen Pseudo-Eigenschaft ClassGroup auf System.Classes.TPersistent (Framework-unabhängig) anstatt auf Vcl.Controls.TControl (Framework-spezifisch) gesetzt ist. Ebenso steht TActionList nicht zur Verfügung, wenn ClassGroup auf FMX.Controls.TControl gesetzt ist.
- Für TTimer sind die folgenden beiden Framework-spezifischen Implementierungen vorhanden:
- In beiden Fällen steht TTimer in der Tool-Palette nur zur Verfügung, wenn die Eigenschaft ClassGroup auf einen Framework-spezifischen Wert und nicht auf das Framework-unabhängige System.Classes.TPersistent gesetzt ist. Da aber für TTimer sowohl eine VCL- als auch eine FMX-Implementierung verfügbar ist, müssen Sie sicherstellen, dass für das Datenmodul der dem Anwendungs-Framework entsprechende ClassGroup-Wert gesetzt ist. Andernfalls könnten Fehler auftreten.
- Beispiele für Framework-spezifische Komponenten, auf die sich der ClassGroup-Wert auswirkt:
- TMainMenu:Vcl.Menus.TMainMenu und FMX.Menus.TMainMenu
- TPopupMenu:Vcl.Menus.TPopupMenu und FMX.Menus.TPopupMenu
- TOpenDialog:Vcl.Dialogs.TOpenDialog und FMX.Dialogs.TOpenDialog
Nach Auswahl der gewünschten ClassGroup müssen Sie ggf. zur Registerkarte Bearbeiten und dann zurück zur Registerkarte Design wechseln, um die Tool-Palette mit der ClassGroup-Auswahl zu aktualisieren.
Fehlerbehebung
Wenn Sie in einer VCL-Formularanwendung ein Datenmodul erstellen und für die Eigenschaft ClassGroup einen FMX-Wert setzen, wird, beim Versuch, eine FMX-Komponente auf dem Datenmodul abzulegen, die folgende Meldung angezeigt:
- Class <classname> is not applicable to this module.
Diese Meldung erscheint, wenn der ClassGroup-Wert des Datenmoduls nicht dem Framework der Anwendung entspricht.
Eine ähnliche Meldung erscheint, wenn Sie eine FireMonkey-Anwendung erstellen, ein Datenmodul hinzufügen, den ClassGroup-Wert auf Vcl.Controls.TControl setzen und versuchen, eine TTimer-Komponente auf dem Datenmodul abzulegen, weil die nicht-visuelle Komponente Vcl.ExtCtrls.TTimer nicht mit dem FireMonkey-Framework kompatibel ist.
Die folgende Meldung könnte ebenfalls von der IDE angezeigt werden:
- The following component(s) are not available in the specified class group.
- This is likely to cause compile or runtime errors.
- FMX.Types.TTimer
Wenn Sie versuchen, ein Projekt zu compilieren, dessen ClassGroup-Wert nicht mit dem Anwendungs-Framework kompatibel ist, werden ggf. Compiler-Fehler für Elemente angezeigt, die im aktuellen Framework nicht unterstützt werden. Unter anderem könnten folgende Fehler angezeigt werden:
- X1026 Datei nicht gefunden: '%s' (Delphi)
- E2109 Kein zulässiger Typ (C++)
- E2209 include-Datei 'dateiname' kann nicht geöffnet werden (C++)
- Nicht auflösbares externes "Symbol" referenziert von "Modul" (C++-Linker)