![]() |
Löschen aus der StringList verursacht Fehler, wieso?
Hallo,
ich lösche wie folgt aus einer StringList, aber immer beim letztem oder vorletztem Item bricht das Programm zusammen, da "List index (x) out of bounds" Ich verstehe nicht wieso... wird der Count etwa runtergezählt? Wie kann man sich das anders erklären, oder mache ich was falsch?
Delphi-Quellcode:
Danke!
procedure TMainForm.DeleteFromErrorList(pvErrorCode: String);
var i, p: Integer; begin if gvErrorReportList.Count > 0 then begin for i := 0 to gvErrorReportList.Count - 1 do begin p := Pos(ErrorCode, gvErrorReportList.Strings[i]); if p <> 0 then begin gvErrorReportList.Delete(i); end; end; end; end; |
AW: Löschen aus der StringList verursacht Fehler, wieso?
Du löscht von oben weg. Aber in der for-Scheife wird Count nicht jedes mal wieder neu berechnet. Ergo es knallt, weil Count noch den Wert x hat aber nur noch x-1 Einträge vorhanden sind.
Lass die Schleife rückwärts laufen. |
AW: Löschen aus der StringList verursacht Fehler, wieso?
Ok... und das Löschen von unten löst das so wie ich das verstehe, oder? Mit einer while-Schleife? OK, danke!
|
AW: Löschen aus der StringList verursacht Fehler, wieso?
Du musst eines bedenken: nehmen wir an du hast eine StringList mit 10 Items, also Count = 10.
Nun gehst du mit
Delphi-Quellcode:
0 bist 9 durch. Das ist der Wert von Count - 1 am Anfang. Das merkt sich die
For To Do
Delphi-Quellcode:
Schleife. Sie merkt sich die Zahl 9 und geht alle 10 Werte durch. Aber mitten drin löscht du Items aus der StringList. Nach dem ersten Löschvorgang gibt es nur noch 9 Items, nach dem zweiten 8, bei dem dritten 7, vierten 6, fünften 5, sechsten (das wäre dann i = 5) hätte die StringList nur noch 4 Items. Spätestens hier greifst du auf einen Item den es nicht mehr gibt.
For To Do
Lösung: nicht
Delphi-Quellcode:
sondern
for i := 0 to gvErrorReportList.Count - 1 do
Delphi-Quellcode:
. In dem Fall gehst du von oben nach unten und überschreitest nie die Grenze.
for i := gvErrorReportList.Count - 1 downto 0 do
|
AW: Löschen aus der StringList verursacht Fehler, wieso?
Eben nicht. Das ist ja das Problem.
|
AW: Löschen aus der StringList verursacht Fehler, wieso?
Erklärung?
|
AW: Löschen aus der StringList verursacht Fehler, wieso?
Die haben wir beide doch schon geliefert.
|
AW: Löschen aus der StringList verursacht Fehler, wieso?
Ich glaube, das Mißverständnis besteht darin, daß Luckie mit seinem "Eben nicht" auf das Posting von AlexII geantwortet hat und nicht auf das von Popov. Passiert manchmal, wenn einer "zwischenrein" postet :-D
Dieses Beispiel funktioniert korrekt (eben schnell in CodeTyphon getippt und getestet):
Delphi-Quellcode:
procedure TFormMain.Button2Click(Sender: TObject);
Var Liste : TStringList; i : Integer; begin Liste := TStringList.Create; Try For i := 1 To 10 Do Liste.Append('Eintrag ' + IntToStr(i)); ShowMessage('Listen-Zahl = ' + IntToStr(Liste.Count)); For i := Liste.Count -1 DownTo 0 Do Liste.Delete(i); Finally ShowMessage('Listen-Zahl = ' + IntToStr(Liste.Count)); Liste.Free; End; end; |
AW: Löschen aus der StringList verursacht Fehler, wieso?
Das "Eben nicht" hat mich irritiert. Weiß nicht auf welchen Post es bezogen ist.
|
AW: Löschen aus der StringList verursacht Fehler, wieso?
Man, man, voll easy... muss nur bisschen nachdenken... und selber solche Problemchen lösen. Vielen Dank euch!
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:43 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 by Thomas Breitkreuz