Mit dem AssignFile hast du wirklich recht. Keine Ahnung warum ich das überhaupt durch eine StringList ersetzt habe, war definitiv ein Fehler. Nun aber eine Frage dazu: Spielt das Clear eine Rolle ? Denn Lazarus kennt das nicht. Ich habe es daher einfach mal weggelassen, in Beispielen zu AssignFile in Lazarus taucht das Clear auch nicht auf.
Bei "??? – Boléro" erscheint weiterhin nur eine leere Meldung (=leerer Listboxeintrag). Hier die aktuelle Version, sie entspricht deinem zurecht bevorzugtem Stil mit AssignFile. In meinen Augen ist es identisch zu deinem Code, bloß dass eben die ein oder andere Variable anders heißt, aber mehr auch wirklich nicht.
Delphi-Quellcode:
var Datei : TextFile;
Zeile, Titel, Dateiname :
String;
// Titel=Artist+Titel
p, Sekunden : Integer;
begin
AssignFile(Datei, f);
try
Reset(Datei);
Sekunden := -1;
Titel := '
';
while not EOF(Datei)
do
begin
ReadLn(Datei, Zeile);
Zeile := Trim(Zeile);
Dateiname := '
';
if Pos('
#EXTM3U', Zeile) = 1
then
begin
end else
if Pos('
#EXTINF:', Zeile) = 1
then
begin
Delete(Zeile, 1, 8);
p := Pos('
,', Zeile);
if p > 0
then
begin
if not TryStrToInt(Copy(Zeile, 1, Pred(p)), Sekunden)
then
Sekunden := -1;
Delete(Zeile, 1, p);
Titel := Zeile;
end;
end else
begin
Dateiname := Zeile;
{$IFDEF Win32}
if Pos('
:', Zeile) > 0
then
Dateiname := Zeile
else
{$ENDIF}
{$IFDEF UNIX}
if (Length(Zeile) > 0)
and (s[1] = '
/')
then
Dateiname := Zeile
else
{$ENDIF}
Dateiname := ExtractFilePath(f)+Zeile;
end;
if Dateiname <> '
'
then
begin
SetLength(Arr, Succ(Length(Arr)));
Arr[High(Arr)].Dauer := SecToOut(Sekunden);
Arr[High(Arr)].Artist := Titel;
Arr[High(Arr)].Dateiname := Dateiname;
Arr[High(Arr)].kDateiname := ExtractFileName(Dateiname);
ShowMessage(Arr[High(Arr)].Artist);
Sekunden := -1;
Titel := '
';
end;
end;
finally
CloseFile(Datei);
end;
end;