6.7.2 Indexed properties

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.