![]() |
for-Schleife und Array
Hi,
ich bekomme beim Aufruf der folgenden Funktion immer die Meldung "Listindex überschreitet das Maximum":
Delphi-Quellcode:
CookieFile ist eine String-Variable mit einen Dateipfad.
function GetAllCookies:TMozCookies;
var Cookies: TStringList; Line, len: Integer; tempcookies: TMozCookies; begin //if cookie file does exist if FileExists(CookieFile) then begin //load the file Cookies := TStringList.Create; Cookies.LoadFromFile(CookieFile); //get every cookie for Line := 0 to Cookies.Count -1 do begin //delete comments and empty lines if pos('#', Cookies.Strings[Line]) > 0 then begin Cookies.Delete(Line); end else if Cookies.Strings[Line] = '' then begin Cookies.Delete(Line); end else begin len := Length(tempcookies); SetLength(tempcookies, len + 1); tempcookies[len] := CreateMozCookie(Cookies.Strings[Line]); end; end; Cookies.Free; Result := tempcookies; end; end; CreateMozCookie gibt einen Record zurück. siehe ![]() Der Aufruf geschieht so:
Delphi-Quellcode:
Schaut euch mal eure cookies.txt von Firefox an. Da sind ganz oben 4 Zeilen mit Kommentaren und 1 leere Zeile. Die möchte ich entfernen und eben anschließend die Records den Array of Record zuweisen. Aber es wird nur ein Kommentar entfernt, die anderen bleiben erhalten.
procedure Tfrm_MozCookie_Demo.btn_refreshClick(Sender: TObject);
var mc: TMozCookies; i: Integer; begin lst_cookies.Clear; mc := GetAllCookies; for i := 0 to Length(mc) -1 do begin Lst_cookies.Items.Add(mc[i].domain); end; end; Wieso? Und warum bekomme ich "Listindex überschreitet das Maximum"???? |
Re: for-Schleife und Array
Das Problem liegt hier:
Delphi-Quellcode:
Der Kopf einer For-Schleife wird nur einmal ausgewertet. Danach läuft die Schleife "dumm" vom Anfangswert zum Endwert. Wenn du jetzt etwas innerhalb der Schleife aus der Liste löschst, bleibt der Endwert der Schleife trotzdem erhalten.
for Line := 0 to Cookies.Count -1 do
So sollte es gehen:
Delphi-Quellcode:
for Line := Cookies.Count -1 downto 0 do
|
Re: for-Schleife und Array
Du löscht innerhalb der Schleife Zeilen aus der StringList.
Daher kommt das ganze dann mit RowCount durcheinander. Ich denke RowCount wird am Anfang de for Schleife bestimmt, danach nie mehr. Vielleicht kannst Du mit einer zweiten Stringlist arbeiten in der Du die Einträge kopierst die Du behalten möchtest. Grüße Klaus |
Re: for-Schleife und Array
Wenn du Trotzdem Aufwärts Zählen willst bleibt dir nur eine While Schleife.
Delphi-Quellcode:
Line := 0; While line < Cookies.count do begin // Dein Code inc(line); end; |
Re: for-Schleife und Array
Auch falsch, dann würde nach jedem Löschen die nächste Zeile ignoriert.
|
Re: for-Schleife und Array
Zitat:
|
Re: for-Schleife und Array
@Khabarakh
Stimmt, aber wenn man bei jedem Löschen ein Dec(line); macht stimmts weider ;) |
Re: for-Schleife und Array
Zitat:
Kein "Dec(line);" benutzen, sondern in einfach weglassen.
Delphi-Quellcode:
if bedingung then
Cookies.delete(line) else inc(line); Gerd |
Re: for-Schleife und Array
Zitat:
|
Re: for-Schleife und Array
Zitat:
Eleganter finde ich dennoch meine Lösung. :lol: Aber das ist nun mal Geschmacksache. Gerd |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:22 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