![]() |
TStringList Fehler Listenindex überschreitet das Maximum 0
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 :gruebel:
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 |
Re: TStringList Fehler Listenindex überschreitet das Maximum
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 |
Re: TStringList Fehler Listenindex überschreitet das Maximum
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.
|
Re: TStringList Fehler Listenindex überschreitet das Maximum
Zitat:
Debugguing heißt das Zauberwort... mfg Christian |
Re: TStringList Fehler Listenindex überschreitet das Maximum
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?
Delphi-Quellcode:
Gruß Hawkeye
fMain.slTmp3.Add(Title); // sollte wohl slTmp2 sein...
|
Re: TStringList Fehler Listenindex überschreitet das Maximum
Zitat:
hier muss er drin stecken der böse böse Fehler :-) denn klammer ich diesen Code aus meckert er nicht mehr :mrgreen:
Delphi-Quellcode:
Der gesamte Code funktioniert wenn ich zb: einen Hauptordner (MP3s) lade der 10 Unterordner besitzt und insgesamt 4825 mp3s hat
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 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 :gruebel: MP3Verzeichnis jetzige Hauptordner noch ein Unterordner1 noch ein Unterordner2 MP3s Unterordner1 Unterordner2 Unterordner3 Unterordner4 Unterordner5 Unterordner6 Unterordner7 Unterordner8 Unterordner9 Unterordner10 |
Re: TStringList Fehler Listenindex überschreitet das Maximum
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 |
Re: TStringList Fehler Listenindex überschreitet das Maximum
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 :gruebel:
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,'')); |
Re: TStringList Fehler Listenindex überschreitet das Maximum
Diese Zeilen dürfte er wohl nicht mehr ausführen, der Fehler passiert vorher:
Delphi-Quellcode:
Wenn die Listen leer sind, ist der Zugriff auf die Elemente nicht zulässig.
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 Nimm einfache Stringvariablen statt der Listen slTmp1 und slTmp2, dann hast du den Ärger nicht. Gruß Hawkeye |
Re: TStringList Fehler Listenindex überschreitet das Maximum
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
Delphi-Quellcode:
Bei Gelegenheit werde ich die ganze Sache wohl umbauen und Stringvariablen verwenden
if (fMain.slTmp1.Count > 0) or (fMain.slTmp2.Count > 0) then
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:12 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-2025 by Thomas Breitkreuz