Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Probleme mit Strings (https://www.delphipraxis.net/73483-probleme-mit-strings.html)

boserPascal 18. Jul 2006 21:38


Probleme mit Strings
 
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!

mkinzler 18. Jul 2006 21:45

Re: Probleme mit Strings
 
Wie versuchst du das Aneinanderhängen?

boserPascal 18. Jul 2006 21:46

Re: Probleme mit Strings
 
normal mit +
Delphi-Quellcode:
Temp:=Artist+' - '+Album+' - '+Titel;

mkinzler 18. Jul 2006 21:51

Re: Probleme mit Strings
 
Zeig mal ein wenig von deinem Code

boserPascal 18. Jul 2006 21:57

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.

mkinzler 18. Jul 2006 22:04

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.

boserPascal 18. Jul 2006 22:13

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.

mkinzler 18. Jul 2006 22:29

Re: Probleme mit Strings
 
Zitat:

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.

boserPascal 18. Jul 2006 22:36

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;

mkinzler 18. Jul 2006 22:39

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.
Seite 1 von 2  1 2      

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