Hallo,
es ist eine technische Spielerei, aber ich konnte einfach nicht widerstehen:
Delphi-Quellcode:
type
TLoop = class
private
FFrom : Integer;
FTo : Integer;
FStep : Integer;
FCurrent : Integer;
public
constructor Create (const aFrom, aTo: Integer);
function MoveNext: Boolean;
function Step (const aStep: Integer): TLoop;
function GetEnumerator: TLoop;
property Current: Integer read FCurrent;
end;
constructor TLoop.Create (const aFrom, aTo: Integer);
begin
FFrom := aFrom;
FTo := aTo;
Step(1);
end;
function TLoop.Step (const aStep: Integer): TLoop;
begin
FStep := aStep;
FCurrent := FFrom - FStep;
Result := Self;
end;
function TLoop.GetEnumerator: TLoop;
begin
Result := Self;
end;
function TLoop.MoveNext: Boolean;
begin
Inc (FCurrent, FStep);
if (FStep < 0) then
Result := (FCurrent >= FTo)
else
Result := (FCurrent <= FTo);
end;
function Range (const aFrom, aTo: Integer): TLoop;
begin
Result := TLoop.Create(aFrom, aTo);
end;
// Anwendung:
procedure TForm1.btnEnumeratorClick (Sender: TObject);
var
i : Integer;
begin
Memo.Clear;
for i in Range(12, 51).Step(7) do
Memo.Lines.Add (IntToStr(i));
Memo.Lines.Add('');
for i in Range(20, 0).Step(-3) do
Memo.Lines.Add (IntToStr(i));
end;
Die Klasse und die Hilfsfunktion
Range würde man natürlich in eine eigene
Unit verfrachten.
Gruß Hawkeye