Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Problem bei for Schleife (https://www.delphipraxis.net/107408-problem-bei-schleife.html)

Asatru 27. Jan 2008 11:36


Problem bei for Schleife
 
Code:
procedure TForm1.ReplaceClick(Sender: TObject);
var
i: integer;
begin
for j:= 0 TO 200 DO begin
try
[Befehl]
except
Memo1.Lines.Delete(i-1);
end;
end;
ReplaceClick(Self);
end;
zu meinem Problem:

Ich hab 1 memo in den ich untereinander gewisse Wörter schreibe. Wird das prog gestartet, so wird gleich eine PHP datei geladen. Drück ich nun meinen Button, soll anhand der Schleife nacheinander die eingeschriebenen Worte gesucht werden und mit vorgegeben ersetzt werden. Die Line im Memo spreche ich mit Memo1.Lines[i] an. Der erste lauf funktioniert wunderbar. Falls es ein Wort nicht gibt wird es mit der Error meldung aus dem Memo gelöscht. Wenn es gelöscht ist, soll er wieder von Anfang an anfangen auch mit den Wörtern die vorher schon gesucht wurden. Derzeitiges Prob: Wenn ein Error verursacht wurde und das letzte Wort oder Wortkette gelöscht wurde, fängt er dann 3 lines unter dem letzten an und nicht von anfang an! Kann mir sagen warum die schleife nicht so will wie ich?!?


MFG

Muetze1 27. Jan 2008 11:40

Re: Problem bei for Schleife
 
Du solltest die Compilerwarnungen beachten! Die For Schleifenvariable sollte eine lokale Variable sein, sagt dir der Compiler!

Die Schleife läuft mit j und du löscht i.

Blackheart 27. Jan 2008 11:41

Re: Problem bei for Schleife
 
probiers mal mit downto

Asatru 27. Jan 2008 11:43

Re: Problem bei for Schleife
 
Zitat:

Zitat von Muetze1
Du solltest die Compilerwarnungen beachten! Die For Schleifenvariable sollte eine lokale Variable sein, sagt dir der Compiler!

Die Schleife läuft mit j und du löscht i.

sorry hab mich da vertippt es ist i

lbccaleb 27. Jan 2008 11:44

Re: Problem bei for Schleife
 
vllt so??


Delphi-Quellcode:
//nicht getestet
procedure TForm1.ReplaceClick(Sender: TObject);
var
i: integer;
  begin
    for i := 0 to 200 do
    try
    except
      Memo1.Lines.Delete(i - 1);
  end;
  ReplaceClick(Self);
end;
edit:
aber wieso überhaupt so umständlich?? wenn du nur das memo "leeren" willst, kannst du das auch so:
Delphi-Quellcode:
memo1.lines.clear;

MrKnogge 27. Jan 2008 11:51

Re: Problem bei for Schleife
 
Wenn deine Schleife bei 0 beginnt, musst du schon das -1 weglassen !

Delphi-Quellcode:
Memo1.Lines.Delete(i); // nicht: Memo1.Lines.Delete(i - 1);

Asatru 27. Jan 2008 11:59

Re: Problem bei for Schleife
 
das Komische ist, hatte das prog schonmal fertig, nach format c alles weg :-P nur hatte ich glück und Kumpel hatte noch Quellcode da gehabt, nur will die schleife nun nicht wieder von anfang an starten. Das i-1 muss ja sein, da wenn Error kommt ist die schleife ja schon eine zeile weiter unten und muss aber den darüber löschen, also -1

@lbccaleb

Dein code will auch nicht!


PS: Angenommen er durchläuft alles und findet das gesucht wort im memo Line 5, danach gibts ein Error, dannach wird mit i-1 der letzte Wert (Line 5) gelöscht, weil schleife in line 6 schon ist! Nun soll die schleife aber wirder von Line 1 an beginnen und nciht von Line 8 wie es derzeit der fall ist!


MFG

Muetze1 27. Jan 2008 12:24

Re: Problem bei for Schleife
 
Hast du eigentlich die Bereichs- und Überlaufprüfung eingeschaltet? Wenn nicht, dann mal in den Projektoptionen beim Compiler machen und das Projekt erneut erstellen (nicht compilieren).

Klaus01 27. Jan 2008 12:33

Re: Problem bei for Schleife
 
Zitat:

Zitat von Asatru
PS: Angenommen er durchläuft alles und findet das gesucht wort im memo Line 5, danach gibts ein Error, dannach wird mit i-1 der letzte Wert (Line 5) gelöscht, weil schleife in line 6 schon ist! Nun soll die schleife aber wirder von Line 1 an beginnen und nciht von Line 8 wie es derzeit der fall ist!

Da in der for Schleife die Schleifenvariable nicht geändert werden sollte.
Solltest Du dir überlegen die Schleife nicht als while-do oder repeat-until Schleife
anzulegen. Denn da kannst Du die Schleifenvariable manipulieren.

Grüße
Klaus

Asatru 27. Jan 2008 17:35

Re: Problem bei for Schleife
 
Hab Bereichs- und Überlaufprüfung eingeschaltet und alles neu geschrieben und siehe da, nun läuft die schleife wie sie soll....

Was hat Bereichs- und Überlaufprüfung zu bedeuten?


MFG

Nuclear-Ping 27. Jan 2008 17:48

Re: Problem bei for Schleife
 
Das Problem ist einfach, dass sich der Index der Memo.Lines ändert, sobald du eine Zeile daraus löschst.

Entweder du machst es mit downto ...
Delphi-Quellcode:
procedure TForm1.ReplaceClick(Sender: TObject);
var
  i: integer;
begin
  for i := Memo1.Lines.Count - 1 downto 0 do
    begin
      try
        [Befehl]
      except
        Memo1.Lines.Delete(i);
      end;
    end;
  ReplaceClick(Self);
end;
... oder einer repeat-until-Schleife
Delphi-Quellcode:
procedure TForm1.ReplaceClick(Sender: TObject);
var
  i: integer;
begin
  i := 0;
  repeat
    try
      [Befehl]
    except
      Memo1.Lines.Delete(i);
      i := 0;
      continue; // kA, ob das in nem except-Block geht
    end;
    inc (i);
  until i > Memo1.Lines.Count - 1;
  ReplaceClick(Self);
end;
Du solltest dir auch überlegen, ob es das richtige ist, eine Exception zu werfen, wenn dein Ereignis eintritt. Warum nicht eine if-Abfrage?
Delphi-Quellcode:
if WordFound (Memo1.Lines[i]) then
  Memo1.Lines.Delete(i);
... oder so?

Blackheart 27. Jan 2008 18:08

Re: Problem bei for Schleife
 
Zitat:

Zitat von Blackheart
probiers mal mit downto

:wink:

Asatru 27. Jan 2008 18:15

Re: Problem bei for Schleife
 
Danke für deine Antwort... Kumpel hat mir den Weg mal so gezeigt :-P Derzeit funzt alles iweder so wie es sollte, nur bringt mein prog jetzt Fehlermeldung mit Integerüberlauf :-P

Kann mir wer mal auf meinen Weg ne verschachtelte schleife vorbauen?!?

Sache:

1 Schleife (soll die anderen 2 Schleifen 2 mal wiederholen)
2 Schleife (darin sollen dann die Wörter zb. unentlich aus dem Memo mit Memo1.Lines[i] übergeben werden (da immer mal unterschiedliche viele Wörter drin stehen))
3 Schleife (Wenn in Schleife 2 ein Error ausgelöst wird und dann der letzte Eintrag aus dem memo gelöscht wird mit Memo1.Lines.Delete(i-1) dannach soll schleife bsp x mal aktiv werden)

Meine Befehle funzen ja in einzelnen Teilen, nur der Zusammenbau der Schleife macht mir grad kopfzerbrechen!


Vielen Dank im Voraus für eure Hilfe *schwitz*

Nuclear-Ping 28. Jan 2008 19:03

Re: Problem bei for Schleife
 
Wird wohl keiner machen hier. Zumindest würde ich's nicht. Weil das ist ein Problem, was sich durch gründliches überdenken und nachvollziehen der Schleife lösen lassen kann. Und denkarbeit wird dir hier sicher keiner abnehmen. ;)

Asatru 31. Jan 2008 10:48

Re: Problem bei for Schleife
 
Problem war nur, das ich langsam an mir selber zweifle, weil schleife 100% korrekt ist, was mir auch gesagt wurde... nur kommt einen immer mal der Gedanke das man nen fasselfehler drin hat!

MFG


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