![]() |
Doppelte Schleife verlassen
Hi,
folgender Code aktuell:
Delphi-Quellcode:
Gibt es hierbei eine Möglichkeit, das changed "wegzuoptimieren"? Also ein Break, das sowohl die if, als auch die While Schleife abbricht?var changed: boolean; varCurrActClass: TLastActionClass; i: integer; begin changed := True; while changed do begin changed := False; for i := 0 to FLastActionList.Count -1 do begin varCurrActClass := FLastActionList.Items[i]; if (...) then begin FLastActionList.Remove(varCurrActClass); FLastActionList.TrimExcess; changed := True; break; end; if (...) then begin FLastActionList.Remove(varCurrActClass); FLastActionList.TrimExcess; changed := True; break; end; end; end; end; Viele Grüße, Martin |
AW: Doppelte Schleife verlassen
Zitat:
Nein sowas gibt es nicht. Es gibt nicht wirklich eine andere Möglichkeit als sich zu merken ob die äußeren schleifen abgebrochen werden sollen. |
AW: Doppelte Schleife verlassen
Oh, ja klar, die for und while Schleife :roll:
Danke deiner Antwort! Viele Grüße |
AW: Doppelte Schleife verlassen
Goto :duck:
|
AW: Doppelte Schleife verlassen
Zitat:
|
AW: Doppelte Schleife verlassen
Zitat:
Gruß K-H |
AW: Doppelte Schleife verlassen
Du kannst beide Schleifen in eine separate Methode verlagern und diese dann bei Bedarf mit Exit verlassen.
|
AW: Doppelte Schleife verlassen
Zitat:
Ist das jetzt so gewollt oder war nur deine Frage falsch formuliert? |
AW: Doppelte Schleife verlassen
Zitat:
Sherlock |
AW: Doppelte Schleife verlassen
Jupp, hier geht das Exit, da sowieso die Funktion verlassen wird, nach den Schleifen.
Ihr könnt ja gern man bei Emba den Vorschlag einreichen das Break und Continue zu ändern. (mein uralter Vorschlag im QC wurde ja nicht beachtet :cry:) z.B.
Delphi-Quellcode:
für das Verlassen/Fortsetzen von den inneren zwei Schleifen.
Break 2;
Continue 2; Und für For-Schleifen eventuell auch
Delphi-Quellcode:
für "Breche alle Schleifen ab, bis hin zur For-Schleife mit der i1-Variable".
for i1 := 0 to 10 do begin
for i2 := 0 to 10 do begin ... Break i1; end; end; Eventuell kann man die Repeat- und Whileschleifen auch "benennen" und dann
Delphi-Quellcode:
.
Break DerName;
Und dann hätte ich auch gern noch ein "Self" für With-Blöcke, oder den "Alias", wie es ihn in tausenden anderen Sprachen gibt. sogar in ![]() |
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:36 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-2025 by Thomas Breitkreuz