Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi for-Schleife und Array (https://www.delphipraxis.net/81607-schleife-und-array.html)

Andreas L. 30. Nov 2006 09:42


for-Schleife und Array
 
Hi,
ich bekomme beim Aufruf der folgenden Funktion immer die Meldung "Listindex überschreitet das Maximum":
Delphi-Quellcode:
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;
CookieFile ist eine String-Variable mit einen Dateipfad.
CreateMozCookie gibt einen Record zurück. siehe http://www.delphipraxis.net/internal...ct.php?t=97413

Der Aufruf geschieht so:
Delphi-Quellcode:
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;
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.

Wieso? Und warum bekomme ich "Listindex überschreitet das Maximum"????

chaosben 30. Nov 2006 09:46

Re: for-Schleife und Array
 
Das Problem liegt hier:
Delphi-Quellcode:
for Line := 0 to Cookies.Count -1 do
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.

So sollte es gehen:
Delphi-Quellcode:
for Line := Cookies.Count -1 downto 0 do

Klaus01 30. Nov 2006 09:50

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

Corpsman 30. Nov 2006 10:17

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;

Khabarakh 30. Nov 2006 11:11

Re: for-Schleife und Array
 
Auch falsch, dann würde nach jedem Löschen die nächste Zeile ignoriert.

Andreas L. 30. Nov 2006 11:43

Re: for-Schleife und Array
 
Zitat:

Zitat von chaosben
Das Problem liegt hier:
Delphi-Quellcode:
for Line := 0 to Cookies.Count -1 do
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.

So sollte es gehen:
Delphi-Quellcode:
for Line := Cookies.Count -1 downto 0 do

So gehts ;-) Vielen Dank :P

Corpsman 30. Nov 2006 13:28

Re: for-Schleife und Array
 
@Khabarakh

Stimmt, aber wenn man bei jedem Löschen ein

Dec(line);

macht stimmts weider ;)

bernau 30. Nov 2006 14:10

Re: for-Schleife und Array
 
Zitat:

Zitat von Corpsman
@Khabarakh

Stimmt, aber wenn man bei jedem Löschen ein

Dec(line);

macht stimmts weider ;)

Schon! Aber dann wird ein Wert benutzt, der schon mal bearbeitet wurde.

Kein "Dec(line);" benutzen, sondern in einfach weglassen.


Delphi-Quellcode:
if bedingung then
  Cookies.delete(line)
else
  inc(line);

Gerd

Muetze1 30. Nov 2006 15:53

Re: for-Schleife und Array
 
Zitat:

Zitat von bernau
Schon! Aber dann wird ein Wert benutzt, der schon mal bearbeitet wurde.

Das hätte ich nun gerne näher gewusst bzw. erklärt bekommen... :gruebel:

bernau 1. Dez 2006 10:00

Re: for-Schleife und Array
 
Zitat:

Zitat von Muetze1
Das hätte ich nun gerne näher gewusst bzw. erklärt bekommen... :gruebel:

OK. Hast recht. War ein Denkfehler von mir. Auf das dec(line) würde ja wieder das inc(line) erfolgen. Womit wir wieder an der korrekten Stelle wären. :oops:

Eleganter finde ich dennoch meine Lösung. :lol:

Aber das ist nun mal Geschmacksache.

Gerd


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:58 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz