Arrays and collections / Iterators

type
  TReverseEnumerator = class
  private
    FData: string;
    FIndex: Integer;
  public
    constructor Create(const AData: string);
    function MoveNext: Boolean;
    function GetCurrent: Char;
    property Current: Char read GetCurrent;
  end;

  TReverse = class
  private
    FData: string;
  public
    constructor Create(const AData: string);
    function GetEnumerator: TReverseEnumerator;
  end;

constructor TReverseEnumerator.Create(
  const AData: string);
begin
  FData := AData;
  FIndex := Length(AData) + 1;
end;

function TReverseEnumerator.MoveNextBoolean;
begin
  Dec(FIndex);
  Result := FIndex >= 1;
end;

function TReverseEnumerator.GetCurrentChar;
begin
  Result := FData[FIndex];
end;

constructor TReverse.Create(const AData: string);
begin
  FData := AData;
end;

function TReverse.GetEnumerator:
  TReverseEnumerator;
begin
  Result := TReverseEnumerator.Create(FData);
end;

var
  C: Char;
begin
  for C in TReverse.Create('string'do
    WriteLn(C);
  //printed: g, n, i, r, t, s
end.