If the property definition contains an index, then the read and write specifiers must be a function
and a procedure. Moreover, these functions require an additional parameter : An integer
parameter. This allows to read or write several properties with the same function. For this, the
properties must have the same type. The following is an example of a property with an
index:
{$mode objfpc}
Type
TPoint = Class(TObject)
Private
FX,FY : Longint;
Function GetCoord (Index : Integer): Longint;
Procedure SetCoord (Index : Integer; Value : longint);
Public
Property X : Longint index 1 read GetCoord Write SetCoord;
Property Y : Longint index 2 read GetCoord Write SetCoord;
Property Coords[Index : Integer]:Longint Read GetCoord;
end;
Procedure TPoint.SetCoord (Index : Integer; Value : Longint);
begin
Case Index of
1 : FX := Value;
2 : FY := Value;
end;
end;
Function TPoint.GetCoord (INdex : Integer) : Longint;
begin
Case Index of
1 : Result := FX;
2 : Result := FY;
end;
end;
Var
P : TPoint;
begin
P := TPoint.create;
P.X := 2;
P.Y := 3;
With P do
WriteLn (’X=’,X,’ Y=’,Y);
end.
When the compiler encounters an assignment to X, then SetCoord is called with as first parameter
the index (1 in the above case) and with as a second parameter the value to be set. Conversely,
when reading the value of X, the compiler calls GetCoord and passes it index 1. Indexes can only be
integer values.