Delphi-PRAXiS
Seite 2 von 2     12

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Step wie noch mal ? (https://www.delphipraxis.net/132994-step-wie-noch-mal.html)

himitsu 23. Apr 2009 15:16

Re: Step wie noch mal ?
 
Delphi-Quellcode:
for i := 0 to 100 {step 3} do
begin
  // mach was mit i

  i := i + 2; // es gibt einen Hack, womit man die Variable sezten kann,
  // aber da muß man aufpassen, denn daß hier wird eine "Endlosschleife",
  // da die Abbruchbedingung i=100 nicht erreicht wird > 93 96 99 102 ...
end;

Hawkeye219 23. Apr 2009 16:43

Re: Step wie noch mal ?
 
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

Sunlight7 23. Apr 2009 20:49

Re: Step wie noch mal ?
 
Zitat:

Zitat von himitsu
Delphi-Quellcode:
for i := 0 to 100 {step 3} do
begin
  // mach was mit i

  i := i + 2; // es gibt einen Hack, womit man die Variable sezten kann,
  // aber da muß man aufpassen, denn daß hier wird eine "Endlosschleife",
  // da die Abbruchbedingung i=100 nicht erreicht wird > 93 96 99 102 ...
end;

Du meinst (falls man nen Integer als i hat)

Delphi-Quellcode:
  Inc(PInteger(@i)^, 2);
Edit: Da ich per PN geschimpft wurde, sowas zu zeigen...
Ne so schlimm war die PN nich, aber hier halt ein Hinweis zum beachten:
Manipuliert man Delphis Schleifenvariable, kann dies zu unerwünschten Ergebnissen,
wie zB. Endlosschleifen und AVs führen.
Man sollte dies nur machen, wenn man genau weiß was man macht, oder gleich die Finger davon lassen.
:mrgreen:

Noch eine saubere Methode:

Delphi-Quellcode:
   for i := 0 to 100 {step 3} do begin
   If i mod 3<>0 then continue;

   // Mach was mit i
end;
Ist 0 nicht gewünscht mit 1 beginnen


Alle Zeitangaben in WEZ +2. Es ist jetzt 16:04 Uhr.
Seite 2 von 2     12

Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf