サブコンポーネントのプロパティの作成
プロパティの作成:インデックス への移動
プロパティの値が別のコンポーネントである場合に、そのプロパティに値を代入するには、通常、別のコンポーネントのインスタンスをフォームまたはデータ モジュールに追加し、そのコンポーネントをプロパティの値として代入します。ただし、プロパティ値を実装するオブジェクトのインスタンスをコンポーネントが独自に作成することも可能です。そのような専用のコンポーネントをサブコンポーネントと呼びます。
サブコンポーネントは、永続オブジェクト(TPersistent の下位オブジェクト)であれば何でもかまいません。別のコンポーネントをたまたまプロパティの値として代入する場合とは異なり、サブコンポーネントの published プロパティはそのサブコンポーネントを作成したコンポーネントと一緒に保存されます。ただし、これを正しく機能させるには、以下の条件を満たさなければなりません。
- サブコンポーネントの所有者は、そのサブコンポーネントを作成し、published プロパティの値として使用するコンポーネントでなければなりません。サブコンポーネントが TComponent の下位オブジェクトである場合には、サブコンポーネントの Owner プロパティによって所有者を設定します。それ以外のサブコンポーネントの場合には、永続オブジェクトの GetOwner メソッドをオーバーライドして、作成元のコンポーネントを返すようにしなければなりません。
- サブコンポーネントが TComponent の下位オブジェクトである場合には、それがサブコンポーネントであることを示すために SetSubComponent メソッドを呼び出す必要があります。通常、この呼び出しは、サブコンポーネントの作成時に所有者側が行うか、サブコンポーネントのコンストラクタで行います。
メモ: サブコンポーネントを持つコンポーネントのストリーミングを行うと、サブコンポーネントの csLoading フラグが設定され、Loaded メソッドが呼び出されます。その結果、サブコンポーネントの書き込み可能なプロパティに混乱が生じる可能性があります。サブコンポーネントのプロパティを外部コンポーネント参照に代入できるようにしている場合には、所有者の Loaded メソッドが呼び出されるまでサブコンポーネントを解放できません。そうでなければ、サブコンポーネントを解放した後で、ストリーミング システムによってサブコンポーネントの Loaded メソッドが呼び出されてしまいます。
通常、値がサブコンポーネントであるプロパティは読み取り専用です。値がサブコンポーネントであるプロパティの変更を許可する場合には、別のコンポーネントがプロパティ値として代入されたときに、プロパティの設定アクセサで元のサブコンポーネントを解放しなければなりません。さらに、プロパティが nil に設定されると、コンポーネントがサブコンポーネントをインスタンス化し直すこともよくあります。そうでなければ、プロパティが別のコンポーネントに変更されると、設計時にサブコンポーネントを復元できません。
上記のプロパティ設定アクセサで、プロパティ値として設定されるコンポーネントの FreeNotification メソッドが呼び出されることに注意してください。この呼び出しにより、プロパティの値となるコンポーネントは破棄される直前に通知を送信するようになります。この通知は、Notification メソッドを呼び出すことで送信されます。この呼び出しは、Notification メソッドをオーバーライドして処理します。