Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   For-Schleife als Template mit Prozedur als Parameter? (https://www.delphipraxis.net/194759-schleife-als-template-mit-prozedur-als-parameter.html)

LTE5 2. Jan 2018 12:46


For-Schleife als Template mit Prozedur als Parameter?
 
Ich weiß nicht wie ich das erklären soll. Ich habe das schon einmal gesehen weiß aber nicht wie es heißt und wie ich es finden kann.
Kann man den Schleifenkopf einer For-Schleife irgendwie als eine Art Template als Code festhalten und den Schleifeninhalt als Prozedur oder direkt Zeile für Zeile übergeben?

Delphi-Quellcode:
for i := 0 to 99 do
 begin
  1
  2
  3
 end;

for i := 0 to 99 do
 begin
  A
  B
  C
 end;
In obigen Falle (Beispiel) würde ich mir diese doppelte Schreibarbeit des Schleifenkopfes gerne ersparen und stattdessen so was hier schreiben
Delphi-Quellcode:
ForTemplate0To99.Do(
 procedure
  begin
   A
   B
   C
  end);
);

oder

ForTemplate0To99.Do(MeineProcedur;);

Zacherl 2. Jan 2018 12:49

AW: For-Schleife als Template mit Prozedur als Parameter?
 
Ja, das geht über Anonyme Methoden.

Bernhard Geyer 2. Jan 2018 12:51

AW: For-Schleife als Template mit Prozedur als Parameter?
 
Sicherlich gibt es Möglichkeiten. Aber ob sich das Lohnt 3 Zeilen einer sehr verständlichen schleife durch sowas wie Methodenparameter und anonyme Methoden zu ersetzen lohnt?

Wenn es sich nicht nur im eine einfache Schleife sonder mehr handeln würde (Langläufer mit aktualisierung GUI und Abbrechbarkeit, dann ja.

LTE5 2. Jan 2018 12:52

AW: For-Schleife als Template mit Prozedur als Parameter?
 
Zitat:

Aber ob sich das Lohnt 3 Zeilen einer sehr verständlichen schleife durch sowas wie Methodenparameter und anonyme Methoden zu ersetzen lohnt?
Das war doch nur ein Beispiel ;)

Bernhard Geyer 2. Jan 2018 13:00

AW: For-Schleife als Template mit Prozedur als Parameter?
 
Zitat:

Zitat von LTE5 (Beitrag 1390095)
Zitat:

Aber ob sich das Lohnt 3 Zeilen einer sehr verständlichen schleife durch sowas wie Methodenparameter und anonyme Methoden zu ersetzen lohnt?
Das war doch nur ein Beispiel ;)

Die beiden Mitforisten haben dir ja schon weiterführende Links bzw. Beispielcode gegeben.

Delphi.Narium 2. Jan 2018 13:43

AW: For-Schleife als Template mit Prozedur als Parameter?
 
Unter Delphi 7 kann man das so machen:
Delphi-Quellcode:
Type
  // Einen Typen festlegen, der den Aufrufparametern der zu "verschleifenden" Funktionen entspricht.
  tFormel = function(a : Integer; b : Integer) : LongInt;
  // Proceduren würden auch gehen.
  tProzeduren = Procedure(a : Integer; b : Integer);

function EineFormel(a : Integer; b : Integer) : LongInt;
begin
  Result := a * b;
end;

function NochEineFormel(a : Integer; b : Integer) : LongInt;
begin
  Result := a + b;
end;

function For_A_To_B_Do(AForVon : Integer; AForBis : Integer; AFormel : TFormel; aParameter : Integer; bParameter : Integer) : Integer;
var
  i : Integer;
begin
  Result := 0;
  for i := AForVon to AForBis do Result := Result + AFormel(aParameter, bParameter);
end;

function machmalwas : Integer;
var
  Formel : TFormel;
begin
  Formel := EineFormel;
  Result := For_A_To_B_Do(1,100,Formel,100,200);
  Formel := NochEineFormel;
  Result := Result div For_A_To_B_Do(1,100,Formel,100,200);
end;
Und das ist noch nichteinmal kryptisch.

LTE5 2. Jan 2018 14:04

AW: For-Schleife als Template mit Prozedur als Parameter?
 
Für Tokyo habe ich das jetzt so gemacht

Delphi-Quellcode:
type
 TProcedureParameter = reference to procedure(i: Integer);

implementation

procedure ForLoop(Proc: TProcedureParameter);
var
 i: Integer;
begin
 for i := 0 to 3 do
  Proc(i);
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
 ForLoop(
   procedure(i: Integer)
  begin
   ShowMessage(i.ToString);
  end);
end;
X wird 3x aufgerufen.
Wenn ich jetzt etwas am Schleifenkopf ändere, muss ich es nur noch an einer Stelle tun und nicht mehr an 100.

=> Habe erfolgreich resigniert :thumb:
klappt nicht so wie ich will. Denn abbrechen kann man die Schleife dann scheinbar nicht mehr.

Jumpy 2. Jan 2018 15:06

AW: For-Schleife als Template mit Prozedur als Parameter?
 
Kann man das nicht als Funktion schreiben, die False zurück gibt, wenn abgebrochen werden soll?

for i := 0 to 3 do
if not Proc(i) then break;

LTE5 2. Jan 2018 15:08

AW: For-Schleife als Template mit Prozedur als Parameter?
 
Das ist die Frage. Das übersteigt aber meine Fähigkeiten :oops:

SProske 2. Jan 2018 15:16

AW: For-Schleife als Template mit Prozedur als Parameter?
 
Delphi-Quellcode:
implementation

procedure ForLoop(Func: TFunc<Integer, Boolean>);
var
  i: Integer;
begin
  for i := 0 to 3 do
    if not Func(i) then
      Break;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  ForLoop(
    function(i: Integer): Boolean
    begin
      ShowMessage(i.ToString);
      Result := I <= 1;
      //oder vllt eher
      Result := I <= 2;
      if Result then
        ShowMessage(i.ToString);
    end);
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:23 Uhr.
Seite 1 von 4  1 23     Letzte »    

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