Właściwości tablicowe


Właściwości tablicowe są właściowściami indeksowanymi. Mogą one reprezentować elementy listy, kontrolki-dzieci, piksele bitmapy.

Deklaracja właściwości tablicowej zawiera listę parametrów specyfikującą nazwy i typy indeksów. Przykład:

property Objects[Index: Integer]: TObject read GetObject write SetObject;
property Pixels[X, Y: Integer]: TColor read GetPixel write SetPixel;
property Values[const Name: string]: string read GetValue write SetValue;

Format parametrów indeksowych jest taki sam jak w listach parametrów procedur i funkcji, poza deklaracjami parametrów zamkniętych w nawiasach kwadratowych zamiast okrągłych. Odmiennie niż w tablicach, które mogą używać tylko indeksów o typie porządkowym, właściwości tablicowe zezwalają na indeksy dowolnego typu.

Dla właściwości tablicowych, specyfikatory dostępu powinny zawierać raczej metody niż pola. Metoda w specyfikatorze read musi być funkcją, która pobiera parametry w ilości i o typach jak w wymienionych w liście parametrów indeksowych właściwości, w takiej samej kolejności. Typ zwracanej wartości tej funkcji musi być identyczny jak typ właściwości. Metoda w specyfikatorze write musi być procedurą, która pobiera parametry w ilości i o typach jak w wymienionych w liście parametrów indeksowych właściwości, w takiej samej kolejności, plus dodatkowa wartość lub stała tego samego typu co właściwość.

Przykład metod-specyfikatorów dostępu:

function GetObject(Index: Integer): TObject;
function GetPixel(X, Y: Integer): TColor;
function GetValue(const Name: string): string;
procedure SetObject(Index: Integer; Value: TObject);
procedure SetPixel(X, Y: Integer; Value: TColor);
procedure SetValue(const Name, Value: string);

Elementy właściwości tablicowej udostępniane są poprzez indeksowanie identyfikatora właściwości podobnie, jakby to była zwykła tablica. Przykładowo, instrukcje:

if Collection.Objects[0] = nil then Exit;
Canvas.Pixels[10, 20] := clRed;
Params.Values['PATH'] := 'C:\DELPHI\BIN';

są równoważne z instrukcjami:

if Collection.GetObject(0) = nil then Exit;
Canvas.SetPixel(10, 20, clRed);
Params.SetValue('PATH', 'C:\DELPHI\BIN');

Definicja właściwości tablicowej może poprzedzać dyrektywę default, w którym to przypadku właściwość tablicowa staje się domyślną właściwością klasy. Przykład:

type
  TStringArray = class
  public
    property Strings[Index: Integer]: string ...; default;
    ...
  end;

Jeśli klasa ma domyślną właściwość, można uzyskiwać dostęp do niej z pominięciem identyfikatora domyślnej właściwości w odwołaniu. Poniższe zapisy są równoważne.

object.property[index];
object[index];

Przykładowo, wg wcześniej zamieszczonej deklaracji, zapis:

StringArray.Strings[7];

może byc skrócony do postaci:

StringArray[7];

Klasa może mieć tylko jedną domyślną właściwość, której typy potomne nie mogą zmieniać ani ukrywać.