In diesem Abschnitt lernen wir die Definition, Syntax, Regeln und Serialisierung von Eigenschaften (Property)
Was ist eine Property
property ist syntaktischer Zucker in Pascal. Nach außen verhält es sich wie ein Feld, intern werden aber tatsächlich Getter zum Lesen / Setter zum Schreiben aufgerufen. Es dient zum Kapseln privater Felder, Vereinheitlichen von Lese-/Schreiblogik und Hinzufügen von Nebeneffekten.
- Steuerbare Lese-Schreib-Eigenschaft: Bei Zuweisung oder Wertabruf wird automatisch zusätzliche Logik ausgeführt (Oberflächenneuzeichnung, Komponentensynchronisation, Wertprüfung) ;
- Schreibgeschützte Eigenschaft: Von außen nur lesbar, direkte Zuweisung unzulässig; Daten werden intern über spezielle Prozeduren geändert.
program Demo;
{$ifdef FPC} {$mode objfpc}{$H+}{$J-} {$endif}
{$ifdef MSWINDOWS} {$apptype CONSOLE} {$endif}
uses
SysUtils;
type
TWebPage = class
private
FURL: string;
FColorRGB: Integer;
procedure SetColorRGB(const Value: Integer);
public
property URL: string read FURL;
property ColorRGB: Integer read FColorRGB write SetColorRGB;
procedure Load(const AnURL: string);
procedure PrintStatus;
end;
procedure TWebPage.Load(const AnURL: string);
begin
FURL := AnURL;
Writeln('Load page: ', AnURL);
end;
procedure TWebPage.SetColorRGB(const Value: Integer);
begin
if FColorRGB <> Value then
begin
FColorRGB := Value;
Writeln('Color updated, value = ', Value);
Writeln('Sync component color to ', Value);
end;
end;
procedure TWebPage.PrintStatus;
begin
Writeln('==== Page Info ====');
Writeln('URL(read-only): ', URL);
Writeln('ColorRGB(rw): ', ColorRGB);
Writeln('==================');
Writeln;
end;
var
Page: TWebPage;
begin
Page := TWebPage.Create;
try
Page.Load('https://www.foxdevelop.com/');
Page.ColorRGB := 255;
Page.PrintStatus;
Page.ColorRGB := 255;
Page.PrintStatus;
Page.ColorRGB := 65535;
Page.PrintStatus;
// Page.URL := 'test'; // Kompilierfehler, URL ist schreibgeschützt
finally
Page.Free;
end;
Readln;
end.Code-Sprache: HTML, XML (xml)
In TWebPage ist die URL-Eigenschaft nur lesbar; zum Ändern wird die Prozedur Load verwendet.
Die Eigenschaft FColorRGB kann gelesen werden, das Schreiben/Ändern läuft über die Prozedur SetColorRGB.
Zusätzlich ist PrintStatus eine gewöhnliche Prozedur zur Ausgabe interner Informationen von TWebPage.

Ausgabeergebnis der Ausführung
Load page: https://www.foxdevelop.com/
Color updated, value = 255
Sync component color to 255
==== Page Info ====
URL(read-only): https://www.foxdevelop.com/
ColorRGB(rw): 255
==================
==== Page Info ====
URL(read-only): https://www.foxdevelop.com/
ColorRGB(rw): 255
==================
Color updated, value = 65535
Sync component color to 65535
==== Page Info ====
URL(read-only): https://www.foxdevelop.com/
ColorRGB(rw): 65535
==================Code-Sprache: JavaScript (javascript)
2. Deklarationsregeln der drei Bestandteile einer Property
Bei der Deklaration einer Eigenschaft muss die Lesemethode angegeben werden, die Schreibmethode ist optional:
read Lesequelle: Zwei Optionen zur Auswahl
- Direkte Bindung an ein privates Feld (schnellste Variante ohne zusätzlichen Funktionsaufwand)
- Parameterlose Getter-Funktion mit passendem Rückgabetyp zur Eigenschaft
write Schreibquelle (optional, weggelassen bedeutet schreibgeschützt): Zwei Optionen zur Auswahl
- Direkte Bindung an ein privates Feld
- Setter-Funktion mit genau einem Parameter, dessen Typ zur Eigenschaft passt
Zusätzliche Modifikatoren nur für Serialisierung: default, stored
Der Compiler erzwingt eine strenge Typübereinstimmungsprüfung:
- Integer-Eigenschaft: Getter muss ohne Parameter Integer zurückgeben / read bindet Integer-privates Feld
- String-Eigenschaft: Setter muss einen const string-Parameter akzeptieren
Published-Eigenschaften und Serialisierung
1. Was ist Serialisierung
Vollständige Objektdaten in einen Stream (Datei/Speicher/JSON) schreiben, um das Objekt später aus dem Stream wiederherzustellen ;
Lazarus Formular-Dateien .lfm und Delphi .dfm basieren vollständig auf diesem Mechanismus im Hintergrund.
- Grundvoraussetzung: Eigenschaften müssen im
published-Bereich stehen, damit RTTI Laufzeittypinformationen sie erkennen - Zugehörige Hilfsunits:
LResources: Lesen und Schreiben von lfm-FormulardateienFpJsonRtti/CastleComponentSerialize: JSON-Serialisierung von Objekten
2. Serialisierungsspezifische Modifikatoren
default <Konstante>: Markiert den Standardwert der Eigenschaft
- Nur zur Auswertung durch Serialisierungswerkzeuge: Stimmt der Eigenschaftswert nach Objekterstellung mit default überein, wird er bei der Serialisierung weggelassen, um die Dateigröße zu verringern
- Keine automatische Initialisierung: Im Konstruktor muss dem Feld manuell der default-Wert zugewiesen werden
stored <Bool/Methode>: Steuert, ob die Eigenschaft bei der Serialisierung gespeichert wird
stored True: Standardwert, die Eigenschaft wird bei Serialisierung in die Datei geschriebenstored False: Diese Eigenschaft wird niemals gespeichertstored IsNeedSave: Ruft eine boolesche Methode auf, um dynamisch über die Speicherung zu entscheiden
Beispiel zur Serialisierung
type
TWebPage = class
private
FColor: TColor;
function SetColor(const Value: TColor): TColor;
published
// default clBlack bedeutet Standardfarbe Schwarz; Konstruktor muss manuell FColor := clBlack setzen
property Color: TColor read FColor write SetColor default clBlack;
// stored False speichert nicht in lfm/json
property TempCache: string read FTemp write FTemp stored False;
end;