1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
|
program tforin2;
// test operator Enumerator for the string type and built-in into RTL TStrings enumerator
{$mode objfpc}{$H+}
{$apptype console}
uses
Classes;
type
{ TStringEnumerator }
TStringEnumerator = class // reverse enumerator
private
FString: String;
FIndex: Integer;
function GetCurrent: Char; inline;
public
constructor Create(AString: String);
function MoveNext: Boolean;
property Current: Char read GetCurrent;
end;
{ TStringEnumerator }
function TStringEnumerator.GetCurrent: Char;
begin
Result := FString[FIndex];
end;
constructor TStringEnumerator.Create(AString: String);
begin
inherited Create;
FString := AString;
FIndex := Length(FString) + 1;
end;
function TStringEnumerator.MoveNext: Boolean;
begin
dec(FIndex);
Result := FIndex > 0;
end;
// define an operator for the string type
operator enumerator (const s: string): TStringEnumerator;inline;
begin
Result := TStringEnumerator.Create(s);
end;
procedure LoopString(s: string);
function getstring(s: string): string;
begin
result:=s;
end;
var
c: char;
begin
// check loop in string. output is 'tset' for the string 'test' :)
for c in getstring(s) do
write(c);
WriteLn;
end;
procedure LoopClass;
var
L: TStringList;
S: String;
begin
L := TStringList.Create;
L.Add('1');
L.Add('2');
L.Add('3');
for S in L do
WriteLn(S);
L.Free;
end;
begin
LoopString('test');
LoopClass;
end.
|