![]() |
AW: For-Schleife als Template mit Prozedur als Parameter?
Zitat:
Delphi-Quellcode:
const
cLoopCount = 4; for i := 0 to cLoopCount - 1 do // oder for i := 1 to cLoopCount do ... |
AW: For-Schleife als Template mit Prozedur als Parameter?
Zitat:
|
AW: For-Schleife als Template mit Prozedur als Parameter?
Zitat:
|
AW: For-Schleife als Template mit Prozedur als Parameter?
Ich glaube er wünscht sich so einen Stil wie Javascript.
Wo man massive Dinge wie höhere Funktionen und bindings als Funktionsparameter verwenden kann. |
AW: For-Schleife als Template mit Prozedur als Parameter?
Nee. Ich benutze an sehr vielen Stellen im Programm immer wieder denselben Schleifenkopf und vor diesem Schleifenkopf noch eine weitere if-Abfrage.
Etwa so
Delphi-Quellcode:
Durch das Auslagern des Schleifenkopfes und DieEigentlicheArbeit (das kann alles sein) als Prozedurparameter habe ich { 1 } und { 2 } jetzt nur noch an einer einzigen Stelle.
{ 1 } if Liste.Count > 0 then
begin { 2 } for i := 0 to Liste.Count - 1 do begin DieEigentlicheArbeit; end; end;
Delphi-Quellcode:
Was ich jedoch noch nicht so richtig verstehe, ist die Definition von TFunc. Warum <Integer, Boolean>?
procedure TForm1.ForLoopList(Func: TFunc<Integer, Boolean>);
var i: Integer; begin if Liste.Count = 0 then Exit; for i := 0 to Liste.Count - 1 do begin if Func(i) then Break; end; end; ForLoopList( function(i: Integer): Boolean begin Result := DieEigentlicheArbeit; end); |
AW: For-Schleife als Template mit Prozedur als Parameter?
Du weißt aber schon das der erste Teil mit "if Liste.Count > 0" unnötig ist wenn nur die for-Schleife folgt.:gruebel:
|
AW: For-Schleife als Template mit Prozedur als Parameter?
Sähe das sonst aber nicht so aus?
Delphi-Quellcode:
Weil Liste.Count -1 bedeutet ja 0-1 = -1?
FÜR i = 0 BIS -1 DANN
Zitat:
|
AW: For-Schleife als Template mit Prozedur als Parameter?
Zitat:
![]() [edit] Wenn bei der For-Schleife der Anfangswert nicht mindestens genauso groß wie der Endwert ist, wird sie gar nicht erst durchlaufen. [/edit] |
AW: For-Schleife als Template mit Prozedur als Parameter?
Zitat:
Zitat:
Delphi-Quellcode:
{ 1 } if Liste.Count > 0 then
|
AW: For-Schleife als Template mit Prozedur als Parameter?
Anderer Ansatz: 'nen Nachfahren von List (was auch immer das jetzt genau ist) bauen. Für 'ne TStringList sinngemäß sowas (mit Delphi 7 probiert und funktioniert):
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type tLoopFunc = Function(AString : String) : Boolean; type tForLoopList = class(TStringList) private { Private-Deklarationen } public function DoLoop(AProc : tLoopFunc) : Boolean; end; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} function DieEigentlicheArbeit(AString : String) : Boolean; begin if aString = 'x' then begin // mach noch was ... Result := True; end else Result := False; end; function DieAndereArbeit(AString : String) : Boolean; begin if aString = 'x' then begin // mach noch was .... ShowMessage('Eine Zeile mit x'); Result := True; end else Result := False; end; function tForLoopList.DoLoop(AProc : TLoopFunc) : Boolean; var i : Integer; begin Result := False; if Not Assigned(AProc) then Exit; for i := 0 to Self.Count - 1 do begin Result := AProc(Self[i]); if Result then Break; end; end; procedure TForm1.Button1Click(Sender: TObject); var sl : tForLoopList; begin sl := tForLoopList.Create; // irgendwie jetzt für Inhalt in sl sorgen. // sl.LoadFromFile('x.txt'); sl.Add('x'); case sl.DoLoop(DieEigentlicheArbeit) of true : sl.DoLoop(DieAndereArbeit); false : ShowMessage('war nix'); end; // Ergbenis eventuell abspeichern? // sl.SaveToFile('x.txt'); sl.Free; end; end. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:41 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz