![]() |
AW: Doppelte Schleife verlassen
Ich persönlich nutze dafür immer ein Boolean:
Delphi-Quellcode:
var
a, b: Integer; c: Boolean; begin c := False; for a := 0 to 10 do begin for b := 0 to 10 do begin ShowMessage('b = ' + IntToStr(b)); if b = 1 then begin c := True; Break; end; end; if c then Break; ShowMessage('a = ' + IntToStr(a)); end; ShowMessage('Und weiter im Programm'); end; Wenn es etwas unkonventionell sein darf, dann kann man das auch mit Except lösen:
Delphi-Quellcode:
var
a, b: Integer; begin try for a := 0 to 10 do begin for b := 0 to 10 do begin ShowMessage('b = ' + IntToStr(b)); if b = 1 then Abort; end; ShowMessage('a = ' + IntToStr(a)); end; ShowMessage('Schleifen sind durch'); except ShowMessage('Hallo aus Except'); end; ShowMessage('Und weiter im Programm'); end; |
AW: Doppelte Schleife verlassen
Zitat:
|
AW: Doppelte Schleife verlassen
Wie von Uwe Raabe schon erwähnt:
Delphi-Quellcode:
Bisserl refactoring wg. DRY wäre noch möglich. Und der Funktion solltest Du noch die passende Bezeichnung verpassen... Function ProcessAction : Boolean; var varCurrActClass : TLastActionClass; i : integer; begin for i := 0 to FLastActionList.Count -1 do begin varCurrActClass := FLastActionList.Items[i]; if (...) then begin FLastActionList.Remove(varCurrActClass); FLastActionList.TrimExcess; exit(true); end; if (...) then begin FLastActionList.Remove(varCurrActClass); FLastActionList.TrimExcess; exit(true); end; end; exit(false); end; begin while ProcessAction() do; end; Goto wird nie benötigt und wer ein Flag mitschleppen muss, weil innere Schleifen verlassen, sollte refaktorisieren. Ausnahme: Höchst zeitkritische Abläufe, denn dann ist alles erlaubt. Aber ansonsten geht imho Clean Code vor Performance. |
AW: Doppelte Schleife verlassen
Zitat:
Danke für das Beispiel! |
AW: Doppelte Schleife verlassen
Wenn ich das richtig sehe, dann müsste es so auch DRY werden.
Delphi-Quellcode:
Aber wenn ich es mir so richtig anschaue, dann müsste sich das komplett so abtüten lassen:
function ProcessAction : Boolean;
var varCurrActClass : TLastActionClass; i : integer; begin try for i := 0 to FLastActionList.Count -1 do begin varCurrActClass := FLastActionList.Items[i]; if {Bedingung1} (...) {oder} or {Bedingung2} (...) then begin FLastActionList.Remove(varCurrActClass); FLastActionList.TrimExcess; exit(true); end; end; exit(false); finally {Wenn es noch etwas zu tun gibt, wird quasi immer ausgeführt} end; end; begin while ProcessAction( ) do; end;
Delphi-Quellcode:
procedure ProcessAction;
var varCurrActClass : TLastActionClass; i : integer; begin for i := FLastActionList.Count -1 downto 0 do begin varCurrActClass := FLastActionList.Items[i]; if {Bedingung1} (...) {oder} or {Bedingung2} (...) then begin FLastActionList.Delete( i ); end; end; FLastActionList.TrimExcess; end; |
AW: Doppelte Schleife verlassen
Zitat:
Delphi-Quellcode:
Eine Möglichkeit, ja aber die if Abfragen sind etwas größer, daher hatte ich das aufgeteilt um den Code Übersichtlich zu halten.
if
{Bedingung1} (...) {oder} or {Bedingung2} (...) then |
AW: Doppelte Schleife verlassen
Zitat:
Definitiv sollte man keinen Code doppelt schreiben, denn Änderungen müssen dann auch doppelt gepflegt werden und das ist schon wieder der Anfang vom Chaos ;) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:43 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