AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Probleme mit Strings

Ein Thema von boserPascal · begonnen am 18. Jul 2006 · letzter Beitrag vom 18. Jul 2006
Antwort Antwort
Seite 1 von 2  1 2      
boserPascal

Registriert seit: 4. Apr 2006
96 Beiträge
 
Delphi 5 Professional
 
#1

Probleme mit Strings

  Alt 18. Jul 2006, 21:38
Hallo!

Ich hab mir ein kleines Tool geschrieben um mp3-Playlists zu erstellen. Die ID3-Tags lese ich hiermit: http://www.dsdt.info/tipps/?id=349 aus. Das Problem ist nun, ich will den Tag in einen String schreiben.
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!
Stefan
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Probleme mit Strings

  Alt 18. Jul 2006, 21:45
Wie versuchst du das Aneinanderhängen?
Markus Kinzler
  Mit Zitat antworten Zitat
boserPascal

Registriert seit: 4. Apr 2006
96 Beiträge
 
Delphi 5 Professional
 
#3

Re: Probleme mit Strings

  Alt 18. Jul 2006, 21:46
normal mit +
Temp:=Artist+' - '+Album+' - '+Titel;
Stefan
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Probleme mit Strings

  Alt 18. Jul 2006, 21:51
Zeig mal ein wenig von deinem Code
Markus Kinzler
  Mit Zitat antworten Zitat
boserPascal

Registriert seit: 4. Apr 2006
96 Beiträge
 
Delphi 5 Professional
 
#5

Re: Probleme mit Strings

  Alt 18. Jul 2006, 21:57
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 = 'TAGthen
                    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.
Stefan
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: Probleme mit Strings

  Alt 18. Jul 2006, 22:04
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.
Markus Kinzler
  Mit Zitat antworten Zitat
boserPascal

Registriert seit: 4. Apr 2006
96 Beiträge
 
Delphi 5 Professional
 
#7

Re: Probleme mit Strings

  Alt 18. Jul 2006, 22:13
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.
Stefan
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#8

Re: Probleme mit Strings

  Alt 18. Jul 2006, 22:29
Zitat von boserPascal:
Das setLength hab ich mal vor die Zuweisung auf Temp geschrieben allerdings ohne Erfolg.
Nach Zuweisung.
Zitat:
Was willst du genau als Rückgabewert für die Funktion nehmen, das Record ?
ja, den record.
Markus Kinzler
  Mit Zitat antworten Zitat
boserPascal

Registriert seit: 4. Apr 2006
96 Beiträge
 
Delphi 5 Professional
 
#9

Re: Probleme mit Strings

  Alt 18. Jul 2006, 22:36
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 = 'TAGthen
                    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;
Stefan
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#10

Re: Probleme mit Strings

  Alt 18. Jul 2006, 22:39
Was steht dann in Tempo, immer nur noch der Artist?
Das mit der Funktion hatte nicht direkt mit deinem Problem zu tun.
Markus Kinzler
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 04:52 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