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.MoveNext: Boolean;
begin
Dec(FIndex);
Result := FIndex >= 1;
end;
function TReverseEnumerator.GetCurrent: Char;
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.