Cette section étudie la définition, la syntaxe, les spécifications et la sérialisation des propriétés (Property)
Qu’est-ce qu’une Property
property est un sucre syntaxique du langage Pascal. Visuellement il se comporte comme un champ, mais en coulisse il appelle réellement un getter pour la lecture / un setter pour l’écriture. Il sert à encapsuler les champs privés, unifier la logique de lecture et d’écriture et ajouter des effets secondaires.
- Propriété lecture-écriture contrôlable : une logique supplémentaire s’exécute automatiquement lors de l’affectation ou de la lecture de la valeur (rafraîchissement de l’interface, synchronisation des composants, validation des valeurs) ;
- Propriété en lecture seule : accessible en lecture depuis l’extérieur, interdiction d’affectation directe ; les données sont modifiées en interne via des procédures dédiées.
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'; // Erreur de compilation, URL est en lecture seule
finally
Page.Free;
end;
Readln;
end.Langage du code : HTML, XML (xml)
Dans TWebPage, la propriété URL est uniquement lisible ; pour la modifier, il faut utiliser la procédure Load.
La propriété FColorRGB est lisible, son écriture/modification passe par la procédure SetColorRGB.
Par ailleurs, PrintStatus est une procédure ordinaire destinée à afficher les informations internes de TWebPage.

Résultat d’exécution
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
==================Langage du code : JavaScript (javascript)
2. Règles de déclaration des trois éléments d’une property
La déclaration d’une propriété doit spécifier une méthode de lecture ; une méthode d’écriture est facultative :
read source de lecture : deux choix possibles
- Liaison directe avec un champ privé (la plus rapide, sans surcharge de fonction supplémentaire)
- Fonction getter sans paramètre, dont le type de retour correspond parfaitement au type de la propriété
write source d’écriture (facultatif ; omis, la propriété est en lecture seule) : deux choix possibles
- Liaison directe avec un champ privé
- Fonction setter à un seul paramètre, dont le type du paramètre correspond parfaitement au type de la propriété
Modificateurs complémentaires réservés à la sérialisation : default, stored
Le compilateur impose une vérification stricte de correspondance des types :
- Propriété Integer : le getter doit retourner un Integer sans paramètre / read lié à un champ privé de type Integer
- Propriété String : le setter doit accepter un paramètre const string
Propriétés Published et sérialisation
1. Qu’est-ce que la sérialisation
Écrire l’intégralité des données d’un objet dans un flux (fichier/mémoire/JSON), afin de reconstruire l’objet à partir de ce flux par la suite ;
Les fichiers de formulaire Lazarus .lfm et Delphi .dfm reposent entièrement sur ce mécanisme en arrière-plan.
- Prérequis essentiel : la propriété doit être placée dans la section
publishedpour être reconnue par les informations de type à l’exécution RTTI - Unités utilitaires associées :
LResources: lecture et écriture des fichiers lfm de formulaireFpJsonRtti/CastleComponentSerialize: sérialisation JSON des objets
2. Modificateurs dédiés à la sérialisation
default <constante> : indiquer la valeur par défaut de la propriété
- Utilisé uniquement pour le traitement de sérialisation : si la valeur de la propriété est égale à default après instanciation de l’objet, on omet son stockage lors de la sérialisation pour réduire la taille du fichier
- Pas d’initialisation automatique : le constructeur doit affecter manuellement la valeur correspondant à default au champ
stored <booléen/méthode> : contrôler si la propriété est enregistrée lors de la sérialisation
stored True: valeur par défaut, la propriété est écrite dans le fichier à la sérialisationstored False: cette propriété n’est jamais enregistréestored IsNeedSave: appeler une méthode booléenne pour déterminer dynamiquement le stockage
Exemple de sérialisation
type
TWebPage = class
private
FColor: TColor;
function SetColor(const Value: TColor): TColor;
published
// default clBlack signifie noir par défaut ; le constructeur doit écrire manuellement FColor := clBlack
property Color: TColor read FColor write SetColor default clBlack;
// stored False ne sauvegarde pas dans lfm/json
property TempCache: string read FTemp write FTemp stored False;
end;