![]() |
Probleme mit Strings
Hallo!
Ich hab mir ein kleines Tool geschrieben um mp3-Playlists zu erstellen. Die ID3-Tags lese ich hiermit: ![]() Also Interpret, Titel, etc. Nachdem ich aber den ersten String aus dem Record übernommen hab wird der Rest den ich an den String anhängen will ignoriert. Hat jemand eine Idee? Danke im Vorraus! |
Re: Probleme mit Strings
Wie versuchst du das Aneinanderhängen?
|
Re: Probleme mit Strings
normal mit +
Delphi-Quellcode:
Temp:=Artist+' - '+Album+' - '+Titel;
|
Re: Probleme mit Strings
Zeig mal ein wenig von deinem Code
|
Re: Probleme mit Strings
Das hier ist der Quelltext, die unrelevanten Prozeduren hab ich rausgenommen (also die die keinen Einfluß haben).
der code ist Fett
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, CheckLst, ExtCtrls, Buttons, Menus; type TForm1 = class(TForm) Panel1: TPanel; CheckListBox1: TCheckListBox; BitBtn1: TBitBtn; BitBtn2: TBitBtn; BitBtn4: TBitBtn; BitBtn5: TBitBtn; OpenDialog1: TOpenDialog; SaveDialog1: TSaveDialog; BitBtn3: TBitBtn; BitBtn6: TBitBtn; BitBtn7: TBitBtn; BitBtn8: TBitBtn; ListBox1: TListBox; PopupMenu1: TPopupMenu; procedure BitBtn1Click(Sender: TObject); procedure BitBtn2Click(Sender: TObject); procedure BitBtn4Click(Sender: TObject); procedure BitBtn5Click(Sender: TObject); procedure BitBtn3Click(Sender: TObject); procedure BitBtn8Click(Sender: TObject); procedure BitBtn6Click(Sender: TObject); procedure BitBtn7Click(Sender: TObject); procedure Lese_ID3Tag(Filename: string); private { Private-Deklarationen } public { Public-Deklarationen } end; Type TID3Tag = record ID: string; Titel: string; Artist: string; Album: string; Year: string; Comment: string; Genre: byte; dauer: longint; //in sekunden; sample: integer; bits: byte; vers: byte; layers: byte; end; const MPEG_BIT_RATES : array[1..3] of array[1..3] of array[0..15] of word = { Version 1, Layer I } (((0,32,64,96,128,160,192,224,256,288,320,352,384,416,448,0), { Version 1, Layer II } (0,32,48,56, 64, 80, 96,112,128,160,192,224,256,320,384,0), { Version 1, Layer III } (0,32,40,48, 56, 64, 80, 96,112,128,160,192,224,256,320,0)), { Version 2, Layer I } ((0,32,48, 56, 64, 80, 96,112,128,144,160,176,192,224,256,0), { Version 2, Layer II } (0, 8,16,24, 32, 40, 48, 56, 64, 80, 96, 112,128,144,160,0), { Version 2, Layer III } (0, 8,16,24, 32, 40, 48, 56, 64, 80, 96, 112,128,144,160,0)), { Version 2.5, Layer I } ((0,32,48, 56, 64, 80, 96,112,128,144,160,176,192,224,256,0), { Version 2.5, Layer II } (0, 8,16,24, 32, 40, 48, 56, 64, 80, 96, 112,128,144,160,0), { Version 2.5, Layer III } (0, 8,16,24, 32, 40, 48, 56, 64, 80, 96, 112,128,144,160,0))); sample_rates: array[1..3] of array [0..3] of word=((44100,48000,32000,0),(22050,24000,16000,0),(11025,12000,8000,0)); var Form1: TForm1; ID3Tag: TID3Tag; implementation {$R *.DFM} procedure TForm1.BitBtn4Click(Sender: TObject); var Datei: file of char; Zeile,Temp : string; Buffer: char; begin if OpenDialog1.Execute then begin AssignFile(Datei, OpenDialog1.filename); Reset(Datei); Zeile:=''; while not eof(Datei) do begin Read(Datei, Buffer); if Buffer = #$0D then begin ListBox1.Items.Add(Zeile); Lese_ID3Tag(Zeile); if ID3Tag.ID = 'TAG' then begin with ID3Tag do [b]Temp:=Artist+' - '+Album+' - '+Titel;[/b]//schreibt nur artist raus showmessage(id3tag.Album); //nur zum testen ob er die Strings eventuell doch ausgibt CheckListBox1.Items.Add(Temp); end else CheckListBox1.Items.Add(Zeile); Zeile:=''; end else if Buffer >= #$20 then Zeile:=Zeile+Buffer; end; CloseFile(Datei); end; caption:='Playlist - '+OpenDialog1.filename; end; procedure TForm1.Lese_ID3Tag(Filename: string); var Buffer: array[1..128] of char; Datei: File; mp3hdrread: array[1..4] of byte; mp3hdr: longint absolute mp3hdrread; tempbyte, bitrateindex, versionindex: byte; bitrate, version, layer, groese: longint; begin try AssignFile(Datei, Filename); Reset(Datei,1); groese:=filesize(Datei); blockread(Datei,mp3hdrread,4); tempbyte:=mp3hdrread[1]; mp3hdrread[1]:=mp3hdrread[4]; mp3hdrread[4]:=tempbyte; tempbyte:=mp3hdrread[2]; mp3hdrread[2]:=mp3hdrread[3]; mp3hdrread[3]:=tempbyte; reset(Datei,1); Seek(Datei,FileSize(Datei)-128); BlockRead(Datei, Buffer, SizeOf(Buffer)); CloseFile(Datei); bitrateindex:=((mp3hdr shr 12) and $F); versionindex:=((mp3hdr shr 19) and $3); case versionindex of 0: version:=3; 1: version:=0; //unbekannt 2: version:=2; 3: version:=1; end; layer:=4-((mp3hdr shr 17) and $3); if version<>0 then bitrate:=MPEG_BIT_RATES[version][layer][bitrateindex] else bitrate:=128; with ID3Tag do begin ID:=copy(Buffer,1,3); Titel:=copy(Buffer,4,30); Artist:=copy(Buffer,34,30); Album:=copy(Buffer,64,30); Year:=copy(Buffer,94,4); Comment:=copy(Buffer,98,30); Genre:=ord(Buffer[128]); sample:=sample_rates[version][((mp3hdr shr 10) and $3)]; dauer:=(groese*8) div ((bitrate)*1000); bits:=bitrate; vers:=version; layers:=layer; end; except end; end; end. |
Re: Probleme mit Strings
Versuch mal die Länge von Temp zu erhöhen (setLength).
BTW. Ich würde .Lese_ID3Tag als Funktion implementieren und nicht mit geiner lobalen Variablen arbeiten. |
Re: Probleme mit Strings
Das setLength hab ich mal vor die Zuweisung auf Temp geschrieben allerdings ohne Erfolg. Was willst du genau als Rückgabewert für die Funktion nehmen, das Record ? Das Problem liegt scheinbar nicht im Record weil einzeln werden die Member ja ausgegeben.
|
Re: Probleme mit Strings
Zitat:
Zitat:
|
Re: Probleme mit Strings
hab das ganze mal so abgeändert wie du vorgeschlagen hast, aber nichts.
Delphi-Quellcode:
procedure TForm1.BitBtn4Click(Sender: TObject);
var Datei: file of char; Zeile,Tempo: string; Buffer: char; TAG: TID3TAG; begin if OpenDialog1.Execute then begin AssignFile(Datei, OpenDialog1.filename); Reset(Datei); Zeile:=''; while not eof(Datei) do begin Read(Datei, Buffer); if Buffer = #$0D then begin ListBox1.Items.Add(Zeile); TAG:=Lese_ID3Tag(Zeile); if Tag.ID = 'TAG' then begin with Tag do Tempo:=Artist+' - '+Album+' - '+Titel; setLength(Tempo, 128); CheckListBox1.Items.Add(Tempo); end else CheckListBox1.Items.Add(Zeile); Zeile:=''; end else if Buffer >= #$20 then Zeile:=Zeile+Buffer; end; CloseFile(Datei); end; caption:='Playlist - '+OpenDialog1.filename; end; function TForm1.Lese_ID3Tag(Filename: string):TID3Tag; var Buffer: array[1..128] of char; Datei: File; mp3hdrread: array[1..4] of byte; mp3hdr: longint absolute mp3hdrread; tempbyte, bitrateindex, versionindex: byte; bitrate, version, layer, groese: longint; TAG : TID3Tag; begin try AssignFile(Datei, Filename); Reset(Datei,1); groese:=filesize(Datei); blockread(Datei,mp3hdrread,4); tempbyte:=mp3hdrread[1]; mp3hdrread[1]:=mp3hdrread[4]; mp3hdrread[4]:=tempbyte; tempbyte:=mp3hdrread[2]; mp3hdrread[2]:=mp3hdrread[3]; mp3hdrread[3]:=tempbyte; reset(Datei,1); Seek(Datei,FileSize(Datei)-128); BlockRead(Datei, Buffer, SizeOf(Buffer)); CloseFile(Datei); bitrateindex:=((mp3hdr shr 12) and $F); versionindex:=((mp3hdr shr 19) and $3); case versionindex of 0: version:=3; 1: version:=0; //unbekannt 2: version:=2; 3: version:=1; end; layer:=4-((mp3hdr shr 17) and $3); if version<>0 then bitrate:=MPEG_BIT_RATES[version][layer][bitrateindex] else bitrate:=128; with Tag do begin ID:=copy(Buffer,1,3); Titel:=copy(Buffer,4,30); Artist:=copy(Buffer,34,30); Album:=copy(Buffer,64,30); Year:=copy(Buffer,94,4); Comment:=copy(Buffer,98,30); Genre:=ord(Buffer[128]); sample:=sample_rates[version][((mp3hdr shr 10) and $3)]; dauer:=(groese*8) div ((bitrate)*1000); bits:=bitrate; vers:=version; layers:=layer; end; except end; result:=tag; end; |
Re: Probleme mit Strings
Was steht dann in Tempo, immer nur noch der Artist?
Das mit der Funktion hatte nicht direkt mit deinem Problem zu tun. |
Re: Probleme mit Strings
Ja immer noch das selbe Problem, das verwunderliche ist ja der Effekt tritt nur auf, wenn ich einen Wert aus dem Record nehm.
Also sobald ein Wert aus dem Record in den String geschrieben wird ignoriert er den Rest. |
Re: Probleme mit Strings
Also das ist ein wirklich eigenartiger Effekt, versuch mal dies:
Setzte die Länge von Tempo auf die gewüschte Länge und kopiere die Teil-Strings mit Copy rein. |
Re: Probleme mit Strings
Hallo boserPascal,
du liest mit der Copy-Funktion eine feste Anzahl Zeichen aus dem Array Buffer aus. Kürzere Informationen werden in diesem Puffer aber hinten mit dem Zeichen #0 auf die maximale Länge (30 bzw. 4 Zeichen) aufgefüllt. Diese Zeichen liest du mit, obwohl sie nicht zu den eigentlichen Daten gehören. Beim Verketten mit "+" wird das erste Zeichen #0 als Stringende interpretiert. Die einfachste Lösung: nach dem Copy mit Trim() die unerwünschten Zeichen entfernen.
Delphi-Quellcode:
Gruß Hawkeye
Titel:=Trim(copy(Buffer,4,30));
Artist:=Trim(copy(Buffer,34,30)); Album:=Trim(copy(Buffer,64,30)); Year:=Trim(copy(Buffer,94,4)); Comment:=Trim(copy(Buffer,98,30)); |
Re: Probleme mit Strings
Danke jetzt geht alles!
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:34 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