Nesta seção estudamos a definição, sintaxe, regras e serialização de propriedades (Property)
O que é uma Property
property é um açúcar sintático do Pascal. Externamente se comporta como um campo, mas internamente invoca na verdade um getter para leitura / setter para gravação. Serve para encapsular campos privados, unificar lógica de leitura/gravação e adicionar efeitos colaterais.
- Propriedade de leitura e gravação controlável: lógica extra é executada automaticamente na atribuição ou leitura de valores (redesenho de interface, sincronização de componentes, validação de números) ;
- Propriedade somente leitura: apenas legível por fora, atribuição direta proibida; dados são alterados internamente por procedimentos específicos.
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'; // Erro de compilação, URL é somente leitura
finally
Page.Free;
end;
Readln;
end.Code language: HTML, XML (xml)
Dentro da classe TWebPage a propriedade URL é apenas leitura; para modificá-la é necessário usar o procedimento Load.
A propriedade FColorRGB aceita leitura, gravação e alteração dependem do procedimento SetColorRGB.
Além disso PrintStatus é um procedimento comum para exibir as informações internas de TWebPage.

Resultado da execução
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 language: JavaScript (javascript)
2. Regras de declaração dos três elementos da propriedade
Ao declarar uma propriedade é obrigatório definir a forma de leitura; a forma de gravação é opcional:
read fonte de leitura: escolher uma entre duas opções
- Ligação direta a um campo privado (mais rápido, sem custo extra de função)
- Função getter sem parâmetros, cujo tipo de retorno corresponde exatamente ao tipo da propriedade
write fonte de gravação (opcional; omitido = somente leitura): escolher uma entre duas opções
- Ligação direta a um campo privado
- Função setter com um único parâmetro, tipo do parâmetro idêntico ao da propriedade
Modificadores extras apenas para serialização: default, stored
O compilador impõe verificação rígida de correspondência de tipos:
- Propriedade Integer: getter deve retornar Integer sem parâmetros / read ligado a campo privado Integer
- Propriedade String: setter deve receber parâmetro const string
Propriedades Published e serialização
1. O que é serialização
Gravar todos os dados de um objeto em um fluxo (arquivo/memória/JSON) para reconstruir o objeto a partir desse fluxo depois ;
Arquivos de formulário Lazarus .lfm e Delphi .dfm dependem totalmente desse mecanismo interno.
- Pré-requisito essencial: propriedades devem estar na seção
publishedpara que as informações de tipo em tempo de execução RTTI as reconheçam - Unidades utilitárias associadas:
LResources: leitura e gravação de arquivos lfm de formuláriosFpJsonRtti/CastleComponentSerialize: serialização JSON de objetos
2. Modificadores exclusivos para serialização
default <constante>: marca o valor padrão da propriedade
- Apenas para avaliação da ferramenta de serialização: se o valor da propriedade for igual ao default após criação do objeto, omitimos seu armazenamento para reduzir o tamanho do arquivo
- Sem inicialização automática: o construtor deve atribuir manualmente o valor correspondente ao default no campo
stored <booleano/método>: controla se a propriedade é salva na serialização
stored True: valor padrão, grava a propriedade no arquivo durante serializaçãostored False: nunca salva essa propriedadestored IsNeedSave: chama um método booleano para decidir dinamicamente se deve armazenar
Exemplo de serialização
type
TWebPage = class
private
FColor: TColor;
function SetColor(const Value: TColor): TColor;
published
// default clBlack significa preto padrão; construtor precisa definir manualmente FColor := clBlack
property Color: TColor read FColor write SetColor default clBlack;
// stored False não salva em lfm/json
property TempCache: string read FTemp write FTemp stored False;
end;