Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   For in For dann Goto (https://www.delphipraxis.net/159138-dann-goto.html)

WM_CLOSE 16. Mär 2011 10:44

AW: For in For dann Goto
 
Und warum nicht so:
Delphi-Quellcode:
var
  boBreak:Boolean;
begin
  for a := 0 to 10 do
  begin
    for b := 0 to 20 do
    begin
      ...
      if ... then
      begin
        boBreak:=True;
        Break;
      end;
    end;
    if boBreak then
      break;
    if ... then Break;
  end;
end;
?

JamesTKirk 16. Mär 2011 13:17

AW: For in For dann Goto
 
Zitat:

Zitat von himitsu (Beitrag 1088907)
Warum sollte es reichen?

Diese Variableninhalte sind nach der Schleife undeffiniert.
Davor Zu Beginn wird es von Delphi automatisch initialisiert.
(nämlich mit dem Wert nach dem
Delphi-Quellcode:
:=
des For-To/Downto-Do)
Und wie grade erwähnt, optimiert der Compiler deine Zuweisungen eh weg.

Während ich voll zustimme, dass man normalerweise nicht nach der Schleife auf die Werte der Schleifenvariablen zugreifen sollte, so gibt es doch folgenden Eintrag in der Hilfe zu der zitierten Warnung: W1037: FOR-Loop variable '%s' may be undefined after loop (Delphi)

Besonders hervorheben möchte ich folgenden Absatz:
Zitat:

You can only rely on the final value of a for loop control variable if the loop is left with a goto or exit statement.
Wer hat nun Recht? Die Hilfe oder alle, die sagen, dass man nicht drauf zugreifen darf?

Gruß,
Sven

Medium 16. Mär 2011 13:50

AW: For in For dann Goto
 
Es ist hier doch überhaupt nicht das Problem, wenn die Schleife via Goto verlassen wird. Das Problem ist, dass der Code hinter dem Label auch ausgeführt wird, wenn die Bedingung vor dem Goto niemals zutrifft! Von daher ist diese Warnung mit diesem Wortlaut auch völlig korrekt - das hatte ich aber auf Seite eins schon gesagt. Das und NUR das ist das konkrete Problem, von all der Goto-Diskussion unberührt, die natürlich wieder auf 3 Seiten breit gezogen werden musste, weil man es ja so selten und unzureichend bespricht...

Satty67 16. Mär 2011 14:01

AW: For in For dann Goto
 
Statt dem GOTO könnte man eine Sub-Procedure aufrufen und hätte dann das Problem mit dem ereignislosen Scheifendurchlauf auch gleich gelöst:

Delphi-Quellcode:
procedure Something;

  procedure OnlyIfTrue;
  begin
    //
  end;

var
  a,b : IntegerM
begin
  for a := 0 to 10 do
    for b := 0 to 20 do
      if True then
      begin
        OnlyIfTrue;
        Exit;
      end;
end;

demic 16. Mär 2011 16:56

AW: For in For dann Goto
 
Hallo,

so viele Nachrichten... alles wegen Goto :)
Also "PRINT" und "GOTO" waren die ersten Befehle die ich gelernt hatte... zumindest auf dem C64 :)

Aber erst mal Danke für die vielen Vorschläge. Ich hatte den Code vereinfacht. Der richtige Code behandelt 3 StringGrids, sprich nach dem ersten Doppel-FOR das gleiche noch 2x, deshalb ist ein EXIT nicht auf einfacher Weise möglich. Zu der "If Prüfung Then Goto ForEnd"... es ist eine Prüfung die 100% eintritt aber das weis Delphi ja nicht, deshalb wohl die Warnung.

Ich bin heute auf folgende Idee gekommen. Hier der richtige Code:
Delphi-Quellcode:
Procedure TForm1.CheckGridCell(DG : TmyGrid);
Var NCol,NRow,i : LongInt;
Begin
 With DG Do
 Begin
  SelPaint := False;
  For NCol := 0 to ColCount-1 Do
  Begin
   For NRow := 0 to RowCount-1 Do
   Begin
    i := (NCol*(RowCount)) + NRow;
    If ACell = Dirlist[i].Name Then
    Begin
     Row := NRow;
     Col := NCol;
     If ShowStyle = ssFull Then
     begin
      if row < toprow then toprow := row
      else if row > toprow+visiblerowcount-1 then toprow := row-visiblerowcount+1;
     end;
     SelPaint := True;
     RePaint;
     Exit;
    End;
   End;
  End;
 End;
End;
Ich rufe an den nötigen Stellen die Prozedur 3x auf.
Delphi-Quellcode:
CheckGridCell(Grid1);
CheckGridCell(Grid2);
CheckGridCell(Grid3);
Mit der Parameterübergabe hat der Inhalt der Prozedur auch weniger Zeilen und ein EXIT kann ich so einsetzen. Warnungen gibt's von Delphi so auch nicht mehr.

Auch Danke für den Tipp, zum einfügen von Delphi-Code.

Gruß
Michael


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:36 Uhr.
Seite 3 von 3     123   

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