En esta sección estudiamos la definición, sintaxis, normas y serialización de propiedades (Property)
¿Qué es una Property
property es azúcar sintáctico de Pascal. Por fuera se comporta como un campo, pero internamente invoca realmente un getter para lectura / setter para escritura. Sirve para encapsular campos privados, unificar lógica de lectura y escritura y añadir efectos secundarios.
- Propiedad de lectura y escritura controlable: Se ejecuta lógica extra automáticamente al asignar o leer valores (redibujado de interfaz, sincronización de componentes, validación numérica) ;
- Propiedad solo lectura: Solo se puede leer desde el exterior, prohibida la asignación directa; los datos se modifican internamente mediante procedimientos dedicados.
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'; // Error de compilación, URL es solo lectura
finally
Page.Free;
end;
Readln;
end.Lenguaje del código: HTML, XML (xml)
En TWebPage la propiedad URL es solo lectura; para modificarla se usa el procedimiento Load.
La propiedad FColorRGB admite lectura, su escritura o modificación depende del procedimiento SetColorRGB.
Además PrintStatus es un procedimiento común que sirve para imprimir la información interna de TWebPage.

Resultado de ejecución
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
==================Lenguaje del código: JavaScript (javascript)
2. Reglas de declaración de los tres elementos de una propiedad
Al declarar una propiedad es obligatorio especificar el modo de lectura; el modo de escritura es opcional:
read origen de lectura: elegir una de dos opciones
- Enlace directo a un campo privado (máxima velocidad, sin gasto extra de funciones)
- Función getter sin parámetros, cuyo tipo de retorno coincide totalmente con el tipo de la propiedad
write origen de escritura (opcional, si se omite es solo lectura): elegir una de dos opciones
- Enlace directo a un campo privado
- Función setter con un único parámetro, tipo del parámetro idéntico al de la propiedad
Modificadores adicionales exclusivos para serialización: default, stored
El compilador fuerza la comprobación de coincidencia de tipos:
- Propiedad Integer: el getter debe devolver Integer sin parámetros / read enlazado a campo privado Integer
- Propiedad String: el setter debe recibir un parámetro const string
Propiedades Published y serialización
1. ¿Qué es la serialización
Escribir todos los datos de un objeto en un flujo (archivo/memoria/JSON) para restaurar el objeto desde ese flujo después ;
Los archivos de formulario Lazarus .lfm y Delphi .dfm dependen totalmente de este mecanismo interno.
- Requisito fundamental: la propiedad debe estar en la sección
publishedpara que la información de tipo en tiempo de ejecución RTTI la reconozca - Unidades de utilidad asociadas:
LResources: leer y escribir archivos lfm de formulariosFpJsonRtti/CastleComponentSerialize: serialización JSON de objetos
2. Modificadores exclusivos para serialización
default <constante>: marca el valor por defecto de la propiedad
- Solo para evaluación de herramientas de serialización: si el valor de la propiedad coincide con default tras crear el objeto, se omite su almacenamiento en serialización para reducir tamaño de archivo
- No hay inicialización automática: el constructor debe asignar manualmente al campo el valor correspondiente a default
stored <booleano/método>: controla si la propiedad se guarda durante la serialización
stored True: valor por defecto, se escribe la propiedad en el archivo al serializarstored False: nunca se guarda esta propiedadstored IsNeedSave: llama a un método booleano para decidir dinámicamente el almacenamiento
Ejemplo de serialización
type
TWebPage = class
private
FColor: TColor;
function SetColor(const Value: TColor): TColor;
published
// default clBlack representa negro por defecto; el constructor debe asignar manualmente FColor := clBlack
property Color: TColor read FColor write SetColor default clBlack;
// stored False no guarda en lfm/json
property TempCache: string read FTemp write FTemp stored False;
end;