Difference between revisions of "Property/de"

From Lazarus wiki
Jump to navigationJump to search
m
m (Eingefügt: Inhaltsverzeichnis, 2 Ergänzungen, kleinere Korrekturen)
 
(7 intermediate revisions by 3 users not shown)
Line 1: Line 1:
{{property}}
+
{{Property}}
<br>
+
 
Zurück zu den [[Reserved words/de|reservierten Wörtern]].<br>
+
 
<br>
+
Zurück zu den [[Reserved words/de|reservierten Wörtern]].
Das reservierte Wort <b>property</b> gehört zur objektorientierten Programmierung.<br>
+
 
Das reservierte Wort <b>property</b> bestimmt wie über öffentliche Methoden einer als privat deklarierten Variable (Datenfeld) zugegriffen wird.<br>
+
__FORCETOC__
<br>
+
 
Beispiel:<br>
+
= Übersicht =
<syntaxhighlight>
+
Das reservierte Wort <b>property</b> gehört zur objektorientierten Programmierung.
 +
 
 +
Das reservierte Wort <b>property</b> bestimmt wie über öffentliche Methoden auf eine als privat deklarierte Variable (Datenfeld) zugegriffen wird.
 +
 
 +
 
 +
Beispiel:
 +
 
 +
<syntaxhighlight lang=pascal>
 
type
 
type
 
   TAuto = class
 
   TAuto = class
 
   private
 
   private
     AFarbe: string;
+
     fFarbe: string;
    ABaujahr: integer;
+
     procedure SetFarbe(AFarbe: string);
     procedure SetFarbe(strFarbe: string);
 
 
   public
 
   public
     property Farbe: string read AFarbe write SetFarbe; // Liest das Feld AFarbe direkt aus und
+
     property Farbe: string read fFarbe write SetFarbe; // Liest das Feld AFarbe direkt aus und
                                                  // schreibt in das Datenfeld AFarbe über die Prozedur SetFarbe
+
                                              // schreibt in das Datenfeld fFarbe über die Prozedur SetFarbe.
 
   end;
 
   end;
  
 +
procedure TAuto.SetFarbe(AFarbe: string);
 +
begin
 +
  fFarbe := AFarbe;
 +
end;
 +
</syntaxhighlight>
 +
 +
 +
Anwendungs-Beispiel:
 +
 +
<syntaxhighlight lang=pascal>
 
var
 
var
   objAuto: TAuto;             // Reserviert den Speicher
+
   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;
 +
</syntaxhighlight>
 +
 
 +
Es ist auch möglich eine Getter-Funktion für das Lesen zu bauen:
  
procedure TAuto.SetFarbe(strFarbe: string);
+
<syntaxhighlight lang=pascal>
 +
...
 +
  private
 +
    function GetFarbe: String;
 +
    procedure SetFarbe(AFarbe: string);
 +
  public
 +
    property Farbe: string read GetFarbe write SetFarbe;
 +
...
 +
function TAuto.GetFarbe: String;
 
begin
 
begin
  AFarbe:=strFarbe;
+
  Result := fFarbe;
 
end;
 
end;
 +
</syntaxhighlight>
 +
 +
Es ist auch möglich ohne Getter- und Setter-Funktion eine property zu definieren:
 +
 +
<syntaxhighlight lang=pascal>
 +
...
 +
  public
 +
    property Farbe: string read fFarbe write fFarbe;
 +
...
 +
</syntaxhighlight>
 +
 +
 +
== 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: &apos;&apos;, 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.
 +
<syntaxhighlight lang=pascal>
 +
...
 +
  public
 +
    property Farbe: string read fFarbe write fFarbe default 'rot';
 +
...
 +
</syntaxhighlight>
  
procedure subAuto()
+
Dies ist nur eine Information für das Streaming-System; daher muß im '''constructor''' der Komponente der Wert trotzdem gesetzt werden:
 +
<syntaxhighlight lang=pascal>
 +
constructor TMyControl.Create (TheOwner: TComponent);
 +
begin
 +
  inherited Create(TheOwner);
 +
  ...
 +
  fFarbe := 'rot';
 +
  ...
 +
end;
 +
</syntaxhighlight>
 +
Wenn '''SetFarbe''' definiert ist, kann es auch sinnvoll sein, den '''property'''-Namen zu verwenden, um die Befehle des Setters auszuführen.
 +
<syntaxhighlight lang=pascal>
 +
procedure TAuto.SetFarbe(AFarbe: string);
 
begin
 
begin
   objAuto := TAuto.Create;     // Erstellt das Objekt
+
   fFarbe := AFarbe;
 +
  if fFarbe = 'rot' then fColor := clRed;
 +
end;
  
  // Zwei unterschiedliche Schreibweisen für das gleiche Problem
+
...
   objAuto.Farbe:='Grün';       // Setzt die Farbe
+
   Farbe := 'rot';
  objAuto.setFarbe('Grün');    // Setzt die Farbe wie oben, nur über eine andere Methode
+
...
 +
</syntaxhighlight>
  
  showmessage(objAuto.Farbe);  // Gibt die Farbe wieder aus
+
== 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'''.
  
   objAuto.Destroy;             // Zerstört das Objekt
+
In diesem Beispiel wird '''Farbe''' nicht gespeichert, wenn sie die leere Zeichenkette enthält:
 +
<syntaxhighlight lang=pascal>
 +
...
 +
  private
 +
    function IsFarbeStored: Boolean;
 +
...
 +
   public
 +
    property Farbe: string read fFarbe write fFarbe stored IsFarbeStored;
 +
...
 +
function TMyControl.IsFarbeStored: Boolean;
 +
begin
 +
  Result := fFarbe <> '';
 
end;
 
end;
 
</syntaxhighlight>
 
</syntaxhighlight>
<br>
 
<br>
 
--[[User:Olaf|Olaf]] 09:28, 1 November 2012 (UTC)
 
[[Category:Reserved words/de]]
 

Latest revision as of 12:48, 12 March 2022

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;