TDataModule の ClassGroup 疑似プロパティ
標準データ モジュールの作成と編集 への移動
目次
ClassGroup 疑似プロパティの効果
System.Classes.TDataModule とその下位クラス(たとえば Web.HTTPApp.TWebModule など)には、以下の役割を果たす ClassGroup という疑似プロパティがあります。
- データ モジュールがフレームワークと密接な関係にあるかどうかを決定します。つまり、ClassGroup は、データ モジュールがフレームワークに依存しないか、それとも特定のフレームワーク(つまり、VCL か FMX)で機能するかを指定します。
- [ツール パレット]でフレームワーク固有の非ビジュアル コンポーネントを有効にします。
- フレームワーク固有の非ビジュアル コンポーネント(たとえば以下など)を有効にするには、[オブジェクト インスペクタ]で ClassGroup にフレームワーク固有の値を設定する必要があります。
- TActionList は VCL 専用なので、[ツール パレット]で TActionList を有効にするには、ClassGroup を VCL 用の値に設定する必要があります。
- TTimer は FMX と VCL の両方に存在しています。TTimer を適切なフレームワークに有効にするには、親アプリケーションのフレームワークに一致するように ClassGroup を FMX か VCL のどちらかに設定する必要があります。
-
- (TTimer と TActionList については後でさらに議論します。)
ClassGroup 疑似プロパティは IDE でのみ使用され、コンパイラで生成されるプロパティではない(そのため "疑似プロパティ" と呼ばれます)ので、ClassGroup については、コンパイラで生成される ライブラリ リファレンスでは説明されていません。お読みになっているページは ClassGroup のドキュメントです。
ClassGroup の値
以下は、[オブジェクト インスペクタ]で選択できる ClassGroup 値で、フレームワークや、フレームワーク固有の各選択肢で使用できる RTL 要素が含まれています。
ClassGroup | 関連フレームワーク | ランタイム ライブラリ |
---|---|---|
|
なし(フレームワークに依存しない) |
Delphi RTL (サポートされていないフレームワーク固有の要素を除く) |
|
VCL フレームワーク |
Delphi RTL (サポートされていないフレームワーク固有の要素を除く) |
|
FMX フレームワーク |
Delphi RTL (サポートされていないフレームワーク固有の要素を除く) |
TDataModule は最初はフレームワークに依存しない(ClassGroup でフレームワークとの関係を設定)
データ モジュールを作成すると、ユニット ファイルには、最初は以下のように、ClassGroup 疑似プロパティをフレームワークに依存しないベース値(System.Classes.TPersistent)に設定する指令が記述されます。
Delphi の場合:
{%CLASSGROUP 'System.Classes.TPersistent'}
C++ の場合:
#pragma classgroup "System.Classes.TPersistent"
ClassGroup 値を変更すると、コード内の指令は自動的に変更されます。
TDataModule は最初はフレームワークに依存しないので、VCL フレームワークでも FireMonkey フレームワークでもデータ モジュールを使用できます。 これはまた、フレームワークに依存しないデータ モジュールの場合は、フレームワーク固有のクラスやメンバ(たとえば、Vcl.ActnList.TActionList や FMX.Types.TTimer など)を[ツール パレット]で使用できないということでもあります。[オブジェクト インスペクタ]にアクセスして、データ モジュールの ClassGroup プロパティを設定して適切なフレームワークを(以下のいずれか 1 つとして)指定することで、フレームワーク固有の適切なクラスやメンバを組み込むことができます。
- Vcl.Controls.TControl
- FMX.Controls.TControl(macOS)
フレームワーク固有の非ビジュアル コンポーネントの例
- TActionList は VCL の非ビジュアル コンポーネントであるため、ClassGroup 疑似プロパティが Vcl.Controls.TControl(フレームワーク固有)ではなく System.Classes.TPersistent(フレームワーク非依存)になっているデータ モジュールの場合は、[ツール パレット]に表示されません。同様に、ClassGroup が FMX.Controls.TControl に設定されている場合、TActionList は使用できません。
- TTimer には、以下のように、フレームワーク固有の実装が 2 つあります。
- どちらの場合も、TTimer は、ClassGroup 疑似プロパティがフレームワーク非依存の System.Classes.TPersistent ではなくフレームワーク固有の値に設定されている場合にのみ[ツール パレット]で使用できます。しかし、TTimer には VCL による実装も FMX による実装もあるので、必ず、データ モジュールに合った ClassGroup 値を選択してアプリケーション フレームワークに一致させる必要があります。そうでなければ、エラーが発生するおそれがあります。
- ClassGroup 値によって影響を受けるフレームワーク固有のコンポーネントの例としては、他に以下のものがあります。
- TMainMenu: Vcl.Menus.TMainMenu および FMX.Menus.TMainMenu
- TPopupMenu: Vcl.Menus.TPopupMenu および FMX.Menus.TPopupMenu
- TOpenDialog: Vcl.Dialogs.TOpenDialog および FMX.Dialogs.TOpenDialog
必要な ClassGroup 値を選択したあと、[ツール パレット]を更新して ClassGroup 値の選択を反映させるには、場合によっては、いったんコード エディタに切り替えてから[デザイン]タブに戻る必要があります。
エラー状況のトラブルシューティング
VCL フォーム アプリケーション内にデータ モジュールを作成し、その ClassGroup 疑似プロパティに FMX 値を設定した場合は、データ モジュールに FMX コンポーネントをドロップしようとすると、以下のメッセージが表示されます。
- Class <classname> is not applicable to this module.(クラス <クラス名> はこのモジュールには適用できません。)
このメッセージは、データ モジュールの ClassGroup 値がアプリケーションのフレームワークに一致しない場合に出力されます。
FireMonkey アプリケーションを作成して、データ モジュールを追加し、ClassGroup 値として Vcl.Controls.TControl を選択したあと、データ モジュールに TTimer をドロップしようとした場合にも、同様のメッセージが表示されます。非ビジュアル コンポーネント Vcl.ExtCtrls.TTimer が FireMonkey フレームワークと互換性がないからです。
IDE では、以下のメッセージも表示される可能性があります。
- 以下のコンポーネントは指定されたクラス グループで使用できません。
- おそらくコンパイル エラーまたは実行時エラーが発生します。
- FMX.Types.TTimer
アプリケーション フレームワークと互換性のない ClassGroup 値を持つプロジェクトをコンパイルしようとすると、現在のフレームワークでサポートされていない要素のコンパイル エラーが表示される可能性があります。表示される可能性のあるエラーには、以下のものがあります。
- X1026 ファイルが '%s' に見つかりません(Delphi)
- E2109 許可されていない型です(C++)
- E2209 インクルード ファイル '<ファイル名>' を開けません(C++)
- 未解決の外部シンボル 'シンボル' が 'モジュール' から参照されています(C++ リンカ)