![]() |
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; |
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.
|
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 < ({self.}DriveCombobox1.GetCount)) and (not(pausieren))) do
|
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? ![]() ![]() 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? ![]() ![]() Zitat:
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] |
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; |
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