AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

for-Schleife und Array

Ein Thema von Andreas L. · begonnen am 30. Nov 2006 · letzter Beitrag vom 1. Dez 2006
Antwort Antwort
Seite 1 von 2  1 2      
Andreas L.
(Gast)

n/a Beiträge
 
#1

for-Schleife und Array

  Alt 30. Nov 2006, 10:42
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"????
  Mit Zitat antworten Zitat
Benutzerbild von chaosben
chaosben

Registriert seit: 27. Apr 2005
Ort: Görlitz
1.358 Beiträge
 
Delphi XE2 Professional
 
#2

Re: for-Schleife und Array

  Alt 30. Nov 2006, 10:46
Das Problem liegt hier:
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:
for Line := Cookies.Count -1 downto 0 do
Benjamin Schwarze
If I have seen further it is by standing on the shoulders of Giants. (Isaac Newton)
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.771 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: for-Schleife und Array

  Alt 30. Nov 2006, 10:50
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
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von Corpsman
Corpsman

Registriert seit: 8. Nov 2005
Ort: nähe Stuttgart
981 Beiträge
 
Delphi XE2 Professional
 
#4

Re: for-Schleife und Array

  Alt 30. Nov 2006, 11:17
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;
Uwe
My Sitewww.Corpsman.de

My marble madness clone Balanced ( ca. 70,0 mb ) aktuell ver 2.01
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#5

Re: for-Schleife und Array

  Alt 30. Nov 2006, 12:11
Auch falsch, dann würde nach jedem Löschen die nächste Zeile ignoriert.
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Andreas L.
(Gast)

n/a Beiträge
 
#6

Re: for-Schleife und Array

  Alt 30. Nov 2006, 12:43
Zitat von chaosben:
Das Problem liegt hier:
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:
for Line := Cookies.Count -1 downto 0 do
So gehts Vielen Dank
  Mit Zitat antworten Zitat
Benutzerbild von Corpsman
Corpsman

Registriert seit: 8. Nov 2005
Ort: nähe Stuttgart
981 Beiträge
 
Delphi XE2 Professional
 
#7

Re: for-Schleife und Array

  Alt 30. Nov 2006, 14:28
@Khabarakh

Stimmt, aber wenn man bei jedem Löschen ein

Dec(line);

macht stimmts weider
Uwe
My Sitewww.Corpsman.de

My marble madness clone Balanced ( ca. 70,0 mb ) aktuell ver 2.01
  Mit Zitat antworten Zitat
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.295 Beiträge
 
Delphi 12 Athens
 
#8

Re: for-Schleife und Array

  Alt 30. Nov 2006, 15:10
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
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#9

Re: for-Schleife und Array

  Alt 30. Nov 2006, 16:53
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...
  Mit Zitat antworten Zitat
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.295 Beiträge
 
Delphi 12 Athens
 
#10

Re: for-Schleife und Array

  Alt 1. Dez 2006, 11:00
Zitat von Muetze1:
Das hätte ich nun gerne näher gewusst bzw. erklärt bekommen...
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.

Eleganter finde ich dennoch meine Lösung.

Aber das ist nun mal Geschmacksache.

Gerd
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:32 Uhr.
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