AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi TStringList Fehler Listenindex überschreitet das Maximum 0
Thema durchsuchen
Ansicht
Themen-Optionen

TStringList Fehler Listenindex überschreitet das Maximum 0

Ein Thema von newuser01 · begonnen am 4. Okt 2006 · letzter Beitrag vom 4. Okt 2006
Antwort Antwort
newuser01

Registriert seit: 31. Aug 2006
248 Beiträge
 
Delphi 7 Professional
 
#1

TStringList Fehler Listenindex überschreitet das Maximum 0

  Alt 4. Okt 2006, 17:29
Hallo

Ich habe folgendes Problem wenn ich mp3s in einer StringList schreibe und Sie dann auf ID3Tag Einträge überprüfe kommt ab und an mal der Fehler "ListenIndex überschreitet das Maximum (0)" Der Fehler tritt aber nur dann auf glaub ich zumindest, wenn die StringList "slMP3" zu viele Daten enthält. Lade ich zb: einen Ordner der ca. 4500 MP3s (einschließlich Unterordner) enthält klappt alles bestens. Versuch ich aber von einem Ordner zu laden der noch mehr mp3s (einschließlich Unterordner) enthält kommt der besagte Fehler. Andererseits wenn ich die for Schleife unten im Code ausklammer also nicht ausführen lasse sondern nur die StringList slMP3 mit MP3s befülle kommt der Fehler auch nicht egal vieviel MP3s sich im Ordner befinden. Der Fehler wird wohl in der Schleife stecken

Delphi-Quellcode:
//StringList slMP3 wird mit MP3s mit Pfadangabe gefüllt
 FindAllFiles(fMain.slMP3,fVerzeichnis.DirectoryListBox1.Directory+'\','*.mp3', true, true, false);

             
for i := 0 to fMain.slMP3.Count - 1 do
begin

//ID3v1Tag auslesen

if fMain.ID3v1Tag.ReadFromFile(fMain.slMP3.Strings[i]) then
begin
  with fMain.ID3v1Tag do
  begin
   fMain.slTmp1.Add(Artist);
   fMain.slTmp1.Add(Album);
   fMain.slTmp1.Add(Year);
   fMain.slTmp1.Add(Title);
  end;
end;

//ID3v2Tag auslesen

if fMain.ID3v2Tag.ReadFromFile(fMain.slMP3.Strings[i]) then
begin
  with fMain.ID3v2Tag do
  begin
   fMain.slTmp2.Add(Artist);
   fMain.slTmp2.Add(Album);
   fMain.slTmp2.Add(Year);
   fMain.slTmp2.Add(Title);
  end;
end;


if (fMain.slTmp1.Strings[0] <> '') and (fMain.slTmp1.Strings[3] <> '') then
begin
 sArtist := fMain.slTmp1.Strings[0];
 sTitle := fMain.slTmp1.Strings[3];
 fMain.lbMP3Ausgabe.Items.Add(IntToStr(i+1) + '.' + ' '+ sArtist +' - '+ sTitle);
end
   else
       begin
        //wenn nichts vorhanden ist weiter und slTmp2 überprüfen
        if (fMain.slTmp2.Strings[0] <> '') and (fMain.slTmp2.Strings[3] <> '') then
        begin
         sArtist := fMain.slTmp2.Strings[0];
         sTitle := fMain.slTmp2.Strings[3];
         fMain.lbMP3Ausgabe.Items.Add(IntToStr(i+1) + '.' + ' '+ sArtist +' - '+ sTitle);
        end
           else
               begin
                // wenn in slTmmp2 auch nichts enthalten ist dann nur Dateinamen eintragen
                sDateiname := ExtractFileName(fMain.slMP3.Strings[i]);
                fMain.lbMP3Ausgabe.Items.Add(IntToStr(i+1) + '.' + ' '+ ChangeFileExt(sDateiname,''));
        end;//if slTmp2
end;//if slTmp1

fMain.slTmp1.Clear;
fMain.slTmp2.Clear;
end;//for
Gruß: Holger

[Hobby-Programmierer]
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: TStringList Fehler Listenindex überschreitet das Maximum

  Alt 4. Okt 2006, 17:41
Hallo,

den Fehler produzierst du irgendwo in deinem Code,
ich habe aber keine Lust, danach zu suchen

Er heisst auf jeden Fall,
dass ein StringList[X] über die Liste hinaus geht,
also Bsp. StringList.Count=2 und du willst mit StringList[2] oder grösser
darauf zugreifen.

StringList kann übrigens 4 Mrd. Einträge verwalten ...


Heiko
Heiko
  Mit Zitat antworten Zitat
Go2EITS

Registriert seit: 25. Jun 2006
519 Beiträge
 
Delphi 7 Personal
 
#3

Re: TStringList Fehler Listenindex überschreitet das Maximum

  Alt 4. Okt 2006, 17:44
Maximum Listenindex [0] bedeutet; Du greifst auf eine leere Liste zu. Wo, kann ich Dir in dem Wust leider nicht sagen. Füge mal temporär ein Paar Showmessages rein, damit Du überhaupt mal siehst, wo Du hinspringst. Hast Du die Liste mit: X:=Tstringlist.create angelegt? Einträge sind in der Liste in jedem Fall mal keine.
  Mit Zitat antworten Zitat
r2c2

Registriert seit: 9. Mai 2005
Ort: Nordbaden
925 Beiträge
 
#4

Re: TStringList Fehler Listenindex überschreitet das Maximum

  Alt 4. Okt 2006, 18:29
Zitat von Go2EITS:
Füge mal temporär ein Paar Showmessages rein, damit Du überhaupt mal siehst, wo Du hinspringst.
Nix ShowMessage... Da wird man bei 4500 iterationen nicht mehr fertig mitm wegklicken...

Debugguing heißt das Zauberwort...

mfg

Christian
Kaum macht man's richtig, schon klappts!
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#5

Re: TStringList Fehler Listenindex überschreitet das Maximum

  Alt 4. Okt 2006, 18:40
Hallo Holger,

wenn eine Datei einen der beiden ID3-Tags (v1 oder v2) nicht enthält, ist die zugehörige Stringliste (slTmp1 bzw. slTmp2) leer. Trotzdem greifst du bei den Abfragen ohne Prüfen der Listenlänge auf einzelne Elemente zu.

Das Löschen der Listen hätte ich eher an den Anfang der Schleife gesetzt. Warum arbeitest du überhaupt mit Listen und nicht mit einfachen String-Variablen?

Und noch etwas: hast du den Schreibfehler bemerkt?

fMain.slTmp3.Add(Title); // sollte wohl slTmp2 sein... Gruß Hawkeye
  Mit Zitat antworten Zitat
newuser01

Registriert seit: 31. Aug 2006
248 Beiträge
 
Delphi 7 Professional
 
#6

Re: TStringList Fehler Listenindex überschreitet das Maximum

  Alt 4. Okt 2006, 18:54
Zitat:
Und noch etwas: hast du den Schreibfehler bemerkt?
Hab ich korrigiert danke für den Hinweis. Das mit dem löschen der slTmp1 und slTmp2 Stringlisten da haste Recht hab es jetzt am Anfang der Schleife gesetzt. Trotzdem ist immer noch der blöde Fehler da

hier muss er drin stecken der böse böse Fehler denn klammer ich diesen Code aus meckert er nicht mehr

Delphi-Quellcode:
if (fMain.slTmp1.Strings[0] <> '') and (fMain.slTmp1.Strings[3] <> '') then
begin
sArtist := fMain.slTmp1.Strings[0];
sTitle := fMain.slTmp1.Strings[3];
fMain.lbMP3Ausgabe.Items.Add(IntToStr(i+1) + '.' + ' '+ sArtist +' - '+ sTitle);
end
   else
       begin
        //wenn nichts vorhanden ist weiter und slTmp2 überprüfen
        if (fMain.slTmp2.Strings[0] <> '') and (fMain.slTmp2.Strings[3] <> '') then
        begin
         sArtist := fMain.slTmp2.Strings[0];
         sTitle := fMain.slTmp2.Strings[3];
         fMain.lbMP3Ausgabe.Items.Add(IntToStr(i+1) + '.' + ' '+ sArtist +' - '+ sTitle);
        end
           else
               begin
                // wenn in slTmmp2 auch nichts enthalten ist dann nur Dateinamen eintragen
                sDateiname := ExtractFileName(fMain.slMP3.Strings[i]);
                fMain.lbMP3Ausgabe.Items.Add(IntToStr(i+1) + '.' + ' '+ ChangeFileExt(sDateiname,''));
        end;//if slTmp2
end;//if slTmp1
Der gesamte Code funktioniert wenn ich zb: einen Hauptordner (MP3s) lade der 10 Unterordner besitzt und insgesamt 4825 mp3s hat
zb:

MP3s //Hauptordner
Unterordner1
Unterordner2
Unterordner3
Unterordner4
Unterordner5
Unterordner6
Unterordner7
Unterordner8
Unterordner9
Unterordner10

Lade ich aber einen Hauptordner der noch mehr Unterordner und somit mehr mp3s enthält zb:so wie hier dann kommt der besagte Fehler. Klammer ich aber wie schon erwähnt den oben stehenden Code aus dann geht auch das ohne Probleme. Also das befüllen von slMP3 klappt ohne Fehler. Ab der If-Abfrage funktioniert etwas nicht sobald es zu viele mp3s sind oder warum auch immer

MP3Verzeichnis jetzige Hauptordner
noch ein Unterordner1
noch ein Unterordner2
MP3s
Unterordner1
Unterordner2
Unterordner3
Unterordner4
Unterordner5
Unterordner6
Unterordner7
Unterordner8
Unterordner9
Unterordner10
Gruß: Holger

[Hobby-Programmierer]
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#7

Re: TStringList Fehler Listenindex überschreitet das Maximum

  Alt 4. Okt 2006, 19:04
Ich glaube immer noch, daß du den falschen Schluß ziehst. Wenn eine MP3-Datei keinen ID3v1-Tag enthält, ist die Liste slTmp1 leer. Enthält sie keinen ID3v2-Tag, ist die Liste slTmp2 leer. Die von dir zitierte IF-Abfrage greift aber auch dann auf die (nicht vorhandenen) Listenelemente Strings[0] und Strings[3] zu. Dieser Zugriff muß bei leeren Listen zu einer Exception führen. Du solltest vor den Zugriffen die Länge der jeweiligen Liste prüfen (Eigenschaft .Count).

Gruß Hawkeye
  Mit Zitat antworten Zitat
newuser01

Registriert seit: 31. Aug 2006
248 Beiträge
 
Delphi 7 Professional
 
#8

Re: TStringList Fehler Listenindex überschreitet das Maximum

  Alt 4. Okt 2006, 19:21
Aber wenn in slTmp1 und slTmp 2 nichts enthalten ist führt er doch den Code nicht weiter aus und trägt dann nur den Dateinamen ein oder versteh ich es immer noch falsch

Delphi-Quellcode:

// wenn in slTmmp2 auch nichts enthalten ist dann nur Dateinamen eintragen
sDateiname := ExtractFileName(fMain.slMP3.Strings[i]);
fMain.lbMP3Ausgabe.Items.Add(IntToStr(i+1) + '.' + ' '+ ChangeFileExt(sDateiname,''));
Gruß: Holger

[Hobby-Programmierer]
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#9

Re: TStringList Fehler Listenindex überschreitet das Maximum

  Alt 4. Okt 2006, 19:43
Diese Zeilen dürfte er wohl nicht mehr ausführen, der Fehler passiert vorher:

Delphi-Quellcode:
if (fMain.slTmp1.Strings[0] <> '') and (fMain.slTmp1.Strings[3] <> '') then // hier...
  :
if (fMain.slTmp2.Strings[0] <> '') and (fMain.slTmp2.Strings[3] <> '') then // ...und hier
Wenn die Listen leer sind, ist der Zugriff auf die Elemente nicht zulässig.

Nimm einfache Stringvariablen statt der Listen slTmp1 und slTmp2, dann hast du den Ärger nicht.

Gruß Hawkeye
  Mit Zitat antworten Zitat
newuser01

Registriert seit: 31. Aug 2006
248 Beiträge
 
Delphi 7 Professional
 
#10

Re: TStringList Fehler Listenindex überschreitet das Maximum

  Alt 4. Okt 2006, 19:51
Danke Hawkeye für deine Hilfe ich hab es ersteinmal so gelöst das wenn beide Stringlisten leer sind nur der Dateiname eingetragen wird aber die If-Abfrage nicht durchgeführt wird und falls wenigstens eine StringList Daten enthält dann halt die IF-Abfrage durchgeführen

if (fMain.slTmp1.Count > 0) or (fMain.slTmp2.Count > 0) then Bei Gelegenheit werde ich die ganze Sache wohl umbauen und Stringvariablen verwenden
Gruß: Holger

[Hobby-Programmierer]
  Mit Zitat antworten Zitat
Antwort Antwort


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 08:18 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