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.