Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Verschachtelte While- Schleife funktioniert nicht (https://www.delphipraxis.net/215934-verschachtelte-while-schleife-funktioniert-nicht.html)

DelphiUser123 27. Sep 2024 12:52

Verschachtelte While- Schleife funktioniert nicht
 
Eine Timer- Procedure prüft kontinuierlich: Wenn er eine bestimmte Datei (KEYxyz.txt) NICHT findet, soll das Programm schliessen. Ursprünglich hatte ich zwei ineinander verschachtelte For- Schleifen, eine geht die Laufwerke durch, die andere geht die darin enthaltenen Dateien durch. Falls die Datei gefunden wird, bricht ein Exit Befehl die gesamte Procedure ab, das Programm bleibt geöffnet. Das hatte funktioniert.
Nun habe ich die For- Schleifen in While- Schleifen übertragen mit Abbruchbedingung und incrementierender Laufvariablen, um auf das "Exit" zu verzichten.
Obwohl die Datei in einem Laufwerk vorhanden ist, wird das Programm dummerweise abgeschaltet. Er kommt nicht rein in den Bereich "Showmessage('in pausieren drin');" (s.u.) obwohl die Datei vorhanden ist.
Wo ist das Problem im Code?
Code:

procedure TForm29.Timer1Timer(Sender: TObject);

var j,i:integer; LookFor: string;  f: File; pausieren: boolean;
begin

try  //T
         pausieren:=false;
         j:=0; i:=0;

    while ((j < (Form29.DriveCombobox1.GetCount)) and (not(pausieren))) do

    begin //B

      Form29.DriveCombobox1.itemindex:=j;

      Inc(j);

      Form29.FileListBox1.Directory:=Form29.DriveCombobox1.text[1] + ':/';

      LookFor:='KEYxyz.txt';

      Form29.FileListBox1.Update;
                                         
    while ((i < (Form29.FileListBox1.Count)) and (not(pausieren))) do

    begin //A

      if (Form29.FileListBox1.Items[i]= LookFor) then begin //Showmessage('gefunden');

            FileNom:= Form29.FileListBox1.Directory + LookFor;

                        if timerstarter=true then begin

                          Laden();
                          timerstarter:=false;
                        end;

                            pausieren:=true;
                                Showmessage('in pausieren drin');

      end;
      Inc(i);

    end; //A

       if ((j=Form29.DriveCombobox1.GetCount) and (not(pausieren))) then begin Application.Terminate; end;
           
    end; //B
    except //T
     on EInOutError do begin
     Application.Terminate;
    end;

end;

end;

Uwe Raabe 27. Sep 2024 13:03

AW: Verschachtelte While- Schleife funktioniert nicht
 
Du musst direkt vor der while-i-Schleife das i auf 0 setzen, nicht schon vor der while-j-Schleife.

DeddyH 27. Sep 2024 13:06

AW: Verschachtelte While- Schleife funktioniert nicht
 
Und niemals in einer Methode einer Form-Klasse auf die globale Variable zugreifen, das geht spätestens, wenn man dynamisch eine 2. Instanz erzeugt, ganz furchtbar in die Hose. Daher entweder "self" verwenden oder ganz weglassen.
Zitat:

Delphi-Quellcode:
while ((j < (Form29.DriveCombobox1.GetCount)) and (not(pausieren))) do

->
Delphi-Quellcode:
while ((j < ({self.}DriveCombobox1.GetCount)) and (not(pausieren))) do

himitsu 27. Sep 2024 13:19

AW: Verschachtelte While- Schleife funktioniert nicht
 
Davor ginge auch (wenn auch nutzlos, was der Compiler anmerken wird),
aber i muß vor (oder nach) jedem durchlauf erneut zurückgesetzt werden.



Warum greifst du innerhalb einer Methode der TForm29 auf die ogloableVariable Form29 zu?
[edit] siehe DeddyH [/edit]

Bei einem Fehler einfach so ohne Rückmeldung das Programm abschießen ... ähhhhhhhhhhhhhhhhhhh, WARUM?

PS: Ein leerer SD-Karten-Leser oder ein CD-Laufwerk oder nicht verbundenes Netzlaufwerkt und das ganze Vorhaben kann hängen oder gar knallen.

Das Dateisystem von Windows ist nicht case-sensitive.
Warum vergleichts du dennoch case-sensitive?
Delphi-Referenz durchsuchenSameFileName, SameText Delphi-Referenz durchsuchenAnsiSameText, ...

Warum das gesamte Verzeichnis auflisten, wenn eh nur eine Datei gesucht wird?

Wieso ist LookFor keine Konstante, obwohl sie sich nie ändert?

Und wieso benutzt man extrem überalterte visuelle Komponenten, um nichtvisuell nach einer Datei zu suchen?
Delphi-Referenz durchsuchenFileExists, oder notfalls FindFirst Delphi-Referenz durchsuchenIOUtils (TFile.Exists / TDirectory.GetFiles)

Zitat:

Delphi-Quellcode:
if timerstarter=true then

ES WIRD NIEMALS NIE NICHT mit True verglichen :!:
Delphi-Quellcode:
if timerstarter then

oder bei False
Delphi-Quellcode:
if not timerstarter then


Die Einrückung ist ... ich würde jetzt nicht sagen p .... neee, doch etwas pervers.

Bonus-Tipp:
[DELPHI] Delphi-Code [/DELPHI]
[CODE] anderer Code oder preformatiertet Text [/CODE]
[CODE=XML] <xml> [/CODE]

DaCoda 27. Sep 2024 23:35

AW: Verschachtelte While- Schleife funktioniert nicht
 
Wenn deine Delphiversion es unterstützt, dann schau dir mal IoUtils an.
So wie himitsu schon geschrieben hat ist der Weg den du da gehst recht "Oldschool".

Und ein wenig Code formatieren wäre auch nicht verkehrt. Wenn dein Delphi das unterstützt und es aktiviert ist einfach mal Ctrl-D drücken ;-)

Generell sollte das so aber gehen:
Code:
procedure TForm29.Timer1Timer(Sender: TObject);
var
  j, i: integer;
  LookFor: string;
  f: file;
  pausieren: boolean;
begin
  Timer1.Enabled := False;
  try //T
    pausieren := false;
    j := 0;
    while ((j < (DriveCombobox1.GetCount)) and (not (pausieren))) do begin //B
      DriveCombobox1.itemindex := j;
      Inc(j);
      FileListBox1.Directory := DriveCombobox1.text[1] + ':/';
      LookFor := 'KEYxyz.txt';
      FileListBox1.Update;
      i := 0;
      while ((i < (FileListBox1.Count)) and (not (pausieren))) do begin //A
        if (FileListBox1.Items[i] = LookFor) then begin //Showmessage('gefunden');
          FileNom := FileListBox1.Directory + LookFor;
          if timerstarter = true then begin
            Laden();
            timerstarter := false;
          end;
          pausieren := true;
          Showmessage('in pausieren drin');
        end;
        Inc(i);
      end; //A

      if ((j = DriveCombobox1.GetCount) and (not (pausieren))) then begin
        Application.Terminate; // Einfach so wegwürgen ist nicht schön. Besser einen kleinen InfoDialog und dann ein Close ???
      end;
    end; //B
  except //T
    on EInOutError do begin
      Application.Terminate; // Das selbe... Einfach so wegwürgen ist nicht schön. Besser einen kleinen InfoDialog und dann ein Close ???
    end;
  end;
  Timer1.Enabled := True;
end;

DelphiUser123 28. Sep 2024 22:20

AW: Verschachtelte While- Schleife funktioniert nicht
 
Vielen Dank an die Runde für die vielen Anmerkungen und Tipps. Es funktioniert soweit.:)


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:39 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