Home » Tutorials » VCL » Komponenten entwicklen

Komponenten entwicklen

Read und Write

In diesem Kapitel möchte ich die Programmierung von Eigenschaften noch ein bisschen näher erläutern und verfeinern. Als Grundlage dient das Beispiel aus dem vorhergehenden Kapitel.

private
  FZahl1: Integer;
  FZahl2: Integer;
 { Private-Deklarationen }

published
  property Zahl1: Integer read FZahl1 write FZahl1;
  property Zahl2: Integer read FZahl2 write FZahl2;
  { Published-Deklarationen }

Üblicherweise wird vor dem Setzen (Write) des Wertes überprüft, ob sich der neue Wert vom aktuellen Wert unterscheidet.
Dazu muss der Quellcode so modifiziert werden:

private
  FZahl1: Integer;
  FZahl2: Integer;
  procedure SetZahl1(Value: Integer);
  procedure SetZahl2(Value: Integer);
  { Private-Deklarationen }

published
  property Zahl1: Integer read FZahl1 write SetZahl1;
  property Zahl2: Integer read FZahl2 write SetZahl2;
  { Published-Deklarationen }

Im Implementation-Abschnitt musst Du nun die Proceduren SetZahl1 und SetZahl2 implementieren:

procedure TBeispielComp.SetZahl1(Value: Integer);
begin
  if Value <> FZahl1 then
    FZahl1 := Value;
end;

procedure TBeispielComp.SetZahl2(Value: Integer);
begin
  if Value <> FZahl2 then
    FZahl2 := Value;
end;

Erläuterungen:
Bevor der neue Wert gesetzt wird, prüft diese Procedure ob sich der neue Wert vom alten unterscheidet. Vereinbarungsgemäß setzt man vor solche „Prüfproceduren“ ein „Set“. Im Parameter „Value“ steht automatisch der Wert drin, der geprüft werden soll. Die Procedure (und auch die Variablen „FZahl1“ und „FZahl2“) wurden aus Sicherheitsgründen im „Private-Abschnitt“ deklariert, damit der Anwender diese Methoden nicht versehentlich von außerhalb aufrufen kann.
Es gibt auch Eigenschaften (Properties), die nur zur Laufzeit „sichtbar“ sind. Diese Eigenschaften werden dann im dann im „Public-Abschnitt“ der Unit deklariert, z.B.

private
  FDatum: TDate;
  function GetDatum: TDate;
 { Private-Deklarationen }
public
  property Datum: TDate read GetDatum;
 { Public-Deklarationen }

Zusätzlich muss jetzt noch die Funktion GetDatum implementiert werden:

function TBeispielComp.GetDatum: TDate;
begin
  Result := Date(Now);
end;

Ohh, jetzt gibt es viel zu erklären. Die Eigenschaft „Datum“ soll ja nur zur Laufzeit zur Verfügung stehen, deswegen steht diese im „Public-Abschnitt“, die Variable für diese Eigenschaft wird aber immer noch im „Private-Block“ deklariert. Da wir das Datum haben wollen, muss sie vom Typ „TDate“ sein.
Du wirst jetzt fragen, warum da nur „Read“ und nicht auch noch „Write“ steht. Die Erklärung ist simpel. Also Du kannst nur aus dieser Eigenschaft lesen, aber nicht schreiben. Dazu ein kleines Beispiel:

procedure TForm1.Button1Click(Sender: TObject);
begin
  Label1.Caption := DateToStr(BeispielComp1.Datum);  //Das funktioniert (Lesen);
  BespielComp1.Datum := StrToDate('12.02.2000');  //Funzt nicht (Schreiben);
end;

Kommen wir jetzt zu der Funktion „GetDatum“. Wir möchten das aktuelle Datum abfragen, deshalb benötigen wir eine neue Funktion. Vereinbarungsgemäß stellt man vor diese Funktionen ein „Get“.

Noch ein Hinweis: Schreibgeschütze Eigenschaften, wie hier das Property „Datum“ haben im „Published-Block“ nichts zu suchen, da sie ja eh nicht verändert werden können.
Fassen wir noch mal zusammen:

  • Vor dem Setzen (Write) eine Eigenschaft den Wert, per SetXXX(Value: XXX);-Procedure prüfen.
  • Möchte man einen Wert auslesen (Read) wird dies per GetXXX: XXX-Funktion gemacht.
  • Nur-Lesen Eigenschaften, werden im „Public-Abschnitt“ deklariert und besitzen keine „Write-Methode“.