Declaring the Access Properties

From RAD Studio
Jump to: navigation, search

Go Up to Publishing the Pen and Brush


You can provide access to the owned objects of a component by declaring properties of the type of the objects. That gives developers a way to access the objects at design time or runtime. Usually, the read part of the property just references the class field, but the write part calls a method that enables the component to react to changes in the owned object.

To the shape control, add properties that provide access to the pen and brush fields. You will also declare methods for reacting to changes to the pen or brush.

 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};
 };

Then, write the SetBrush and SetPen methods in the implementation part of the unit:

 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);
 }

To directly assign the contents of Value to FBrush-

   FBrush := Value;
   FBrush = Value;

- would overwrite the internal pointer for FBrush, lose memory, and create a number of ownership problems.

See Also