アクセス プロパティの宣言
ペンとブラシをパブリッシュに設定する への移動
コンポーネントの所有オブジェクトにアクセスできるようにするには、それらのオブジェクトの型のプロパティを宣言します。それにより、開発者は設計時または実行時にそれらのオブジェクトにアクセスできます。通常、プロパティの read 部では、クラス フィールドを参照するだけですが、write 部では、所有オブジェクトの変化にコンポーネントが反応できるようにするメソッドを呼び出します。
ペン フィールドとブラシ フィールドにアクセスできるようにするプロパティを、図形コントロールに追加します。また、ペンやブラシの変更に反応するためのメソッドも宣言します。
type TSampleShape = class(TGraphicControl) . . . private { these methods should be private } procedure SetBrush(Value: TBrush); procedure SetPen(Value: TPen); published { make these available at design time } property Brush: TBrush read FBrush write SetBrush; property Pen: TPen read FPen write SetPen; end;
class PACKAGE TSampleShape : public TGraphicControl { . . . private: TPen *FPen; TBrush *FBrush; void __fastcall SetBrush(TBrush *Value); void __fastcall SetPen(TPen *Value); . . . __published: __property TBrush* Brush = {read=FBrush, write=SetBrush, nodefault}; __property TPen* Pen = {read=FPen, write=SetPen, nodefault}; };
そのあと、次のような SetBrush メソッドと SetPen メソッドをユニットの implementation セクションに記述します。
procedure TSampleShape.SetBrush(Value: TBrush); begin FBrush.Assign(Value); { replace existing brush with parameter } end; procedure TSampleShape.SetPen(Value: TPen); begin FPen.Assign(Value); { replace existing pen with parameter } end;
void __fastcall TSampleShape::SetBrush( TBrush* Value) { FBrush->Assign(Value); } void __fastcall TSampleShape::SetPen( TPen* Value) { FPen->Assign(Value); }
次のように Value の内容を FBrush に直接代入すると、
FBrush := Value;
FBrush = Value;
FBrush の内部ポインタが上書きされてしまい、メモリが失われます。そして、オブジェクトの所有関係に関する問題がいくつも発生することになります。