Dostęp do właściwości


Każda właściwość ma specyfikator read, specyfikator write, lub obydwa. Są one zwane specyfikatorami dostępu i mają postać:

read fieldOrMethod
write fieldOrMethod

gdzie fieldOrMethod jest nazwą pola lub metody zadeklarowanej jako właściwość w tej samej klasie, lub w klasie-przodku.

W przykładzie:

property Color: TColor read GetColor write SetColor;

metoda GetColor musi być zadeklarowana jako:

function GetColor: TColor;

zaś metoda SetColor musi mieć jedną z poniższych postaci deklaracji:

procedure SetColor(Value: TColor);
procedure SetColor(const Value: TColor);

(Nazwą parametru metody SetColor, oczywiście, nie musi być Value.)

Kiedy do właściwości odwołuje się wyrażenie, jej wartość jest odczytywana przez użycie pola lub metody wymienionej w specyfikatorze read. Kiedy wykonywane jest podstawienie wartości do właściowści, wartość ta jest zapisywana poprzez użycie pola lub metody wymienionej w specyfikatorze write.

Ponizszy przykład deklaruje klasę TCompass z opublikowaną właściwością Heading. Wartość Heading jest czytana z pola FHeading i zapisywana za pośrednictwem procedury SetHeading .

type
  THeading = 0..359;
  TCompass = class(TControl)
  private
    FHeading: THeading;
    procedure SetHeading(Value: THeading);
  published
    property Heading: THeading read FHeading write SetHeading;
    ...
  end;

Mając tę deklarację, instrukcje:

if Compass.Heading = 180 then GoingSouth;
Compass.Heading := 135;

odpowiadają następującym:

if Compass.FHeading = 180 then GoingSouth;
Compass.SetHeading(135);

W klasie TCompass, z odczytem właściwości nie wiąże się żadna inna czynność; operacja czytania składa sie z wydobycia wartości przechowywanej w polu FHeading. Z drugiej strony, podstawienie wartości do właściwości Heading przekładane jest na wywołanie metody SetHeading, która, przypuszczalnie, zapamiętuje nową wartość w polu FHeading, jak i może przeprowadzać inne czynności. Przykład: SetHeading może być zaimplementowane następująco:

procedure TCompass.SetHeading(Value: THeading);
begin
  if FHeading <> Value then
  begin
    FHeading := Value;
    Repaint;  // uaktualnienie wyglądu aplikacji
  end;
end;

Właściwość, której deklaracja zawiera tylko specyfikator read jest właściwością tylko do odczytu (read-only), zaś sam specyfikator write czyni właściwość tylko do zapisu (write-only). Próba podstawiania wartości do właściwości tylko do odczytu, jak i próba odczytu właściwości tylko do zapisu jest błędem.