![]() |
Konsolenanwendung: Stringlist error
Mein Code:
Delphi-Quellcode:
Der Fehler:
for i := 0 to supi.Count - 1 do
begin if (supi.ValueFromIndex[i] = paramStr(4)) then begin eFound := True; supi.Delete(i-1); supi.Delete(i-1); supi.Delete(i-1); supi.Delete(i-1); supi.SaveToFile(paramStr(2)); end; end; Q:\>Q:\DATEN\Projekte\delupientry\delupientry -f C:\upm.his -e hideext.upi Exception EStringListError in Modul delupientry.exe bei 00011CF5. Listenindex überschreitet das Maximum (52). Das Problem: Der Fehler erscheint aber das Programm funktioniert ansonsten genau so wie ich das will... Es soll mir aus einer Textdatei 4 Zeilen löschen... Es werden genau die Vier Zeilen gelöscht die ich will, alles funktioniert so wies soll.. aber woher der Fehler??? Wenn ich die vier "supi.Delete(i-1);" weglasse kommt der Fehler nicht... - Dann werden aber auch die gewünschten Zeilen nicht gelöscht... :? Jmd eine Idee was ich schon wieder nicht korrekt mache? |
Re: Konsolenanwendung: Stringlist error
supi.Count wird nur ein einziges Mal ausgelesen. Wenn Du nun innerhalb der Schleife Zeilen löschst, wird dieser nicht durch den tatsächlichen Wert ersetzt. Du musst Dir eine andere Lösung suchen (evtl. mit while?).
|
Re: Konsolenanwendung: Stringlist error
Sorry... ich Raffs nicht... kannst dus nochmals mit anderen Worten erklären bitte? :oops:
//EDIT... Habs nochmals versucht zu verstehen... ich kappier jetzt was du meinst... hehe |
Re: Konsolenanwendung: Stringlist error
Ok und wie könnte ich das nun sonst bewältigen?
|
Re: Konsolenanwendung: Stringlist error
Die Obergrenze der Schleife supi.count wird nur einmal zum Beginn der Schleifendurchläufe ermittelt. Innerhalb der Schleife wird aber die Anzahl der Elemente verringert, dadurch ist die Obergrenze der Schleife dann falsch (zu hoch/groß), was dann den Fehler verursacht. Du musst also die Obergrenze bei jedem Schleifendurchlauf neu bestimmen >> also z.B. mit einer while-Schleife
|
Re: Konsolenanwendung: Stringlist error
Ich hab mal ein Beispiel mit einem Memo erstellt.
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
const weg = 4; var Anzahl, Zeile, j: integer; begin Anzahl := Memo1.Lines.Count; Zeile := weg; //wir fangen erst bei der 5. Zeile an, sonst kracht es beim Löschen while Zeile < Anzahl do begin if Memo1.Lines[Zeile] = 'weg' then begin for j := 1 to weg do Memo1.Lines.Delete(Zeile - j); dec(Anzahl,weg); //Anzahl der Zeilen neu berechnen end; inc(Zeile); if Zeile < weg then Zeile := weg; //ggf. wieder auf 4 erhöhen, s.o. end; end; |
Re: Konsolenanwendung: Stringlist error
Vielen Dank euch allen...
Ich könnte ja auch einfach meine for Schleife verwenden und ein break; einsetzen, wäre das nich so gut? |
Re: Konsolenanwendung: Stringlist error
Jens, das reicht auch nicht. Wenn z.B. die letzte Zeile einen Treffer bringt, werden die direkten Vorgänger gelöscht und anschließend versucht, darauf zuzugreifen.
[edit] Super, löscht der einfach seinen Post, nun steh ich dumm da :( [/edit] |
Re: Konsolenanwendung: Stringlist error
Hallo alle miteinander,
ich glaube die Lösung ist relativ einfach. Hier mal meine
Delphi-Quellcode:
Gruß Thomas
procedure TForm1.Button1Click(Sender: TObject);
Var Zeile : Integer; begin Zeile := 0; While Zeile < Memo1.Lines.Count Do Begin If Memo1.Lines[Zeile] = 'weg' Then Memo1.Lines.Delete(Zeile) Else Zeile := Zeile + 1; End; end; |
Re: Konsolenanwendung: Stringlist error
Da hast Du aber dasselbe Problem.
[edit] Nee, Du inkrementierst ja, könnte klappen. [/edit] |
Re: Konsolenanwendung: Stringlist error
Man kann auch mit einer rückwärtslaufenden for-Schleife arbeiten.
|
Re: Konsolenanwendung: Stringlist error
Das kann man IMHO nicht (siehe #8).
|
Re: Konsolenanwendung: Stringlist error
Meiner Meinung nach ist die while-if-Schleife ( :stupid: ) von Thomas von bestechender Kürze und Übersichtlichkeit - sicherlich gibt es auch noch andere Lösungen, aber diese sollte m.E. die erste Wahl sein
|
Re: Konsolenanwendung: Stringlist error
Aber es soll ja nicht die aktuelle Zeile, sondern die 4 Vorgänger gelöscht werden. Also muss man dann doch wieder etwas ähnliches bauen wie ich ;)
|
Re: Konsolenanwendung: Stringlist error
OK, mein primäres Anliegen war, hier mal den Begriff "while-if-Schleife" ins Spile zu bringen
|
Re: Konsolenanwendung: Stringlist error
Runde geschickt umschifft :thumb: :zwinker:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:27 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