Property/de

From Lazarus wiki
Jump to navigationJump to search

Deutsch (de) English (en) suomi (fi) français (fr)


Zurück zu den reservierten Wörtern.


Übersicht

Das reservierte Wort property gehört zur objektorientierten Programmierung.

Das reservierte Wort property bestimmt wie über öffentliche Methoden auf eine als privat deklarierte Variable (Datenfeld) zugegriffen wird.


Beispiel:

type
  TAuto = class
  private
    fFarbe: string;
    procedure SetFarbe(AFarbe: string);
  public
    property Farbe: string read fFarbe write SetFarbe; // Liest das Feld AFarbe direkt aus und
	                                               // schreibt in das Datenfeld fFarbe über die Prozedur SetFarbe.
  end;

procedure TAuto.SetFarbe(AFarbe: string);
begin
  fFarbe := AFarbe;
end;


Anwendungs-Beispiel:

var
  Auto: TAuto;

begin
  Auto := TAuto.Create;     // Erstellt das Objekt

  // Zwei unterschiedliche Schreibweisen für das gleiche Problem
  Auto.Farbe := 'Grün';     // Setzt die Farbe
  Auto.SetFarbe('Grün');    // Setzt die Farbe wie oben, nur über eine andere Methode, aber dies sollte man vermeiden,
                            // da normalerweise der Setter und Getter privat ist. 

  ShowMessage(Auto.Farbe);  // Gibt die Farbe wieder aus

  Auto.Free;                // Zerstört das Objekt
end;

Es ist auch möglich eine Getter-Funktion für das Lesen zu bauen:

...
  private
    function GetFarbe: String;
    procedure SetFarbe(AFarbe: string);
  public
    property Farbe: string read GetFarbe write SetFarbe;
...
function TAuto.GetFarbe: String;
begin
  Result := fFarbe;
end;

Es ist auch möglich ohne Getter- und Setter-Funktion eine property zu definieren:

...
  public
    property Farbe: string read fFarbe write fFarbe;
...


Einsatz von keyword "default"

Wenn eine eigene Komponente geschrieben wird, erscheinen die properties im Objekt-Inspektor! Nun kann über das Anhängen von default ein Standardwert festgelegt werden. String-, Floating-Point- und Pointer-properties haben schon Standardwerte: '', 0 oder Nil. Immer, wenn die property diesen Wert hat, wird sie nicht in der LFM abgespeichert. Außerdem läßt sich im Objekt-Inspektor über das Kontextmenu der property ihr Wert wieder auf diesen Standard zurücksetzen.

...
  public
    property Farbe: string read fFarbe write fFarbe default 'rot';
...

Dies ist nur eine Information für das Streaming-System; daher muß im constructor der Komponente der Wert trotzdem gesetzt werden:

constructor TMyControl.Create (TheOwner: TComponent);
begin
  inherited Create(TheOwner);
  ...
  fFarbe := 'rot';
  ...
end;

Wenn SetFarbe definiert ist, kann es auch sinnvoll sein, den property-Namen zu verwenden, um die Befehle des Setters auszuführen.

procedure TAuto.SetFarbe(AFarbe: string);
begin
  fFarbe := AFarbe;
  if fFarbe = 'rot' then fColor := clRed; 
end;

...
  Farbe := 'rot';
...

Einsatz von keyword "stored"

Dies braucht einen booleschen Wert, der über eine Konstante, ein Feld der Klasse oder eine parameterlose boolesche Funktion gesetzt wird. Sollte dieser Wert False sein, wird die property nicht gestreamt. Wird stored nicht verwendet, dann ist das das Gleiche wie stored True.

In diesem Beispiel wird Farbe nicht gespeichert, wenn sie die leere Zeichenkette enthält:

...
  private
    function IsFarbeStored: Boolean;
...
  public
    property Farbe: string read fFarbe write fFarbe stored IsFarbeStored;
...
function TMyControl.IsFarbeStored: Boolean;
begin
  Result := fFarbe <> '';
end;