コンストラクタのオーバーライド
コンポーネント クラスの変更 への移動
設計時にコンポーネントをフォームに配置した場合や、実行時にアプリケーションでコンポーネントのインスタンスを作成した場合は、コンポーネントのコンストラクタにより、プロパティの値が設定されます。コンポーネントがフォーム ファイルから読み込まれると、アプリケーションでは、設計時に変更されたプロパティをすべて設定します。
メモ: コンストラクタをオーバーライドする場合、新しいコンストラクタでは、独自の処理を行う前に、継承したコンストラクタを呼び出す必要があります。詳細については、「メソッドのオーバーライド」を参照してください。
この例の場合、新しいコンポーネントでは、WordWrap プロパティを False に設定するように、TMemo から継承したコンストラクタをオーバーライドする必要があります。それには、次のように、前方宣言にコンストラクタのオーバーライドを追加したあと、ユニットの implementation セクションで新しいコンストラクタを記述します。
type TWrapMemo = class(TMemo) public { constructors are always public } constructor Create(AOwner: TComponent); override; { this syntax is always the same } end; . . . constructor TWrapMemo.Create(AOwner: TComponent); { this goes after implementation } begin inherited Create(AOwner); { ALWAYS do this first! } WordWrap := False; { set the new desired value } end;
class PACKAGE TYellowMemo : public TMemo { public: virtual __fastcall TYellowMemo(TComponent* Owner); // the constructor declaration __published: __property Color; }; __fastcall TYellowMemo::TYellowMemo(TComponent* Owner) : TMemo(Owner) // the constructor implementation first... // ...calls the constructor for TMemo { Color = clYellow; // colors the component yellow }
これで、この新しいコンポーネントを[ツール パレット]にインストールでき、フォームにも追加できます。WordWrap プロパティが False に初期化されるようになったことに注意してください。
プロパティの初期値を変更する場合は、その値をデフォルト値として指定する必要もあります。コンストラクタで設定される値と指定されたデフォルト値が一致しない場合、Delphi ではプロパティ値の保存と復元を行えません。