Die Zugriffseigenschaften deklarieren

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Stift und Pinsel als published deklarieren

Der Zugriff auf die untergeordneten Objekte einer Komponente wird ermöglicht, indem Sie Eigenschaften vom Typ der Objekte deklarieren. Dadurch können Entwickler sowohl zur Entwurfs- als auch zur Laufzeit auf die Objekte zugreifen. Schreibzugriffe werden dagegen meist in Form von Methodenaufrufen durchgeführt. Die Komponente erhält dadurch die Möglichkeit, auf Änderungen am untergeordneten Objekt zu reagieren.

Fügen Sie der Beispielkomponente nun die Eigenschaften hinzu, über die auf die Felder Pen und Brush zugegriffen werden kann. Deklarieren Sie außerdem die Methoden, die auf Änderungen an diesen Eigenschaften reagieren:

 type
   TSampleShape = class(TGraphicControl)
   .
   .
   .
   private                                              { Diese Methoden sollten als private deklariert werden }
     procedure SetBrush(Value: TBrush);
     procedure SetPen(Value: TPen);
   published                                        { Zur Entwurfszeit verfügbar machen}
     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};
 };

Schreiben Sie im implementation-Abschnitt der Unit die Methoden SetBrush und SetPen:

 procedure TSampleShape.SetBrush(Value: TBrush);
 begin
   FBrush.Assign(Value);                          { Bestehenden Pinsel durch Parameter ersetzen }
 end;
 procedure TSampleShape.SetPen(Value: TPen);
 begin
   FPen.Assign(Value);                              { Bestehenden Stift durch Parameter ersetzen }
 end;
 void __fastcall TSampleShape::SetBrush( TBrush* Value)
 {
   FBrush->Assign(Value);
 }
 void __fastcall TSampleShape::SetPen( TPen* Value)
 {
   FPen->Assign(Value);
 }

Die direkte Zuweisung des Inhalts von Value an FBrush in der folgenden Form:

   FBrush := Value;
   FBrush = Value;

würde den internen Zeiger auf FBrush überschreiben, zu Verlust von Speicher führen und eine Reihe von Verwaltungsproblemen verursachen.

Siehe auch