![]() |
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. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:46 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