Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi ID3v2 wird nicht Ausgeführt - warum? (https://www.delphipraxis.net/86341-id3v2-wird-nicht-ausgefuehrt-warum.html)

Flom 12. Feb 2007 20:58


ID3v2 wird nicht Ausgeführt - warum?
 
Hallöle,
Ich habe ein Problem (mal wieder - selbes Programm - soll MP3 Dateien finden und Auflisten)
Jedoch funktioniert das Liste nicht mit gausi seiner ID3v1 - ID3v2 Codes irgendwie nicht.

Ich habe Folgenden Code:
in der uses ist Deklariert: Mp3FileUtils_WE

var
Form1: TForm1;
quelle:string;
Id3v1Tag:TId3v1Tag;
Id3v2Tag:TId3v2Tag;

der code soll MP3 Dateien finden und in das ListView Eintragen:
Delphi-Quellcode:
procedure TForm1.CreateFileList(Dir, Ext: String; UseSubDirs: Boolean);
var
SR: TSearchRec;
stream: TFilestream;
Item: TListItem;
begin
If FindFirst(Dir + '*.*', faAnyFile, SR) = 0 then
Repeat
  If (SR.Attr and faDirectory = faDirectory) and (SR.Name <> '.') and (SR.Name <> '..') and (UseSubDirs) then CreateFileList(IncludeTrailingPathDelimiter(Dir + SR.Name), Ext, UseSubDirs)
  Else If LowerCase(ExtractFileExt(SR.Name)) = LowerCase(Ext) then
   begin
    Application.ProcessMessages;
    ////////////////////////////////////////////////////////////////////////////
      stream := TFileStream.Create(dir + sr.name, fmOpenRead or fmShareDenyWrite);

  // ID3v2-Tag auslesen
  Id3v2Tag.ReadFromStream(stream);

  // Position neu setzen
  if Not Id3v2Tag.exists then
    stream.Seek(0, sobeginning)
  else
    stream.Seek(Id3v2Tag.size, soFromBeginning);

  // ID3v1-Tag auslesen
  Id3v1Tag.ReadFromStream(stream);

  stream.free;
   // ListView1.Items.Add(Dir + SR.Name);
 ////////////////////////////////////////////////////////////////////////////
    Item.Caption:=Id3v2Tag.Artist;
    Item.SubItems.Add(Id3v2Tag.Title);
    Item.SubItems.Add(Id3v2Tag.Album);
    Item.SubItems.Add(SR.Name);
    Label1.Caption:='Bin da!';
   end;
Until FindNext(SR) <> 0;
FindClose(SR);
end;
Start des Programmes
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
Id3v1Tag:=TId3v1Tag.Create;
Id3v2Tag:=TId3v2Tag.Create;
end;
bei FormDestroy wirds wieder frei gegeben

und zu guter letzt die Suche selbst

Delphi-Quellcode:
procedure TForm1.BtnSucheClick(Sender: TObject);
begin
ListView1.Clear;
CreateFileList(quelle + '\','mp3', CheckBox1.Checked);
end;
Habe diesmal auf eine Sortierung bisher verzichtet! (Programm ist neu Entwickelt :dp:

Grüße!

bitsetter 12. Feb 2007 21:18

Re: ID3v2 wird nicht Ausgeführt - warum?
 
Mach mal vor mp3 einen Punkt also .mp3
Delphi-Quellcode:
CreateFileList(quelle + '\','.mp3', CheckBox1.Checked);

Flom 12. Feb 2007 21:36

Re: ID3v2 wird nicht Ausgeführt - warum?
 
Zugriffsverletzung bei
Delphi-Quellcode:
If (SR.Attr and faDirectory = faDirectory) and (SR.Name <> '.') and (SR.Name <> '..') and (UseSubDirs) then CreateFileList(IncludeTrailingPathDelimiter(Dir + SR.Name), Ext, UseSubDirs);
===========
Meldungen:
===========
Erste Gelegenheit für Exception bei $7C81EB33. Exception-Klasse EAccessViolation mit Meldung 'Zugriffsverletzung bei Adresse 00468208 in Modul 'MP3_Lister_neu.exe'. Lesen von Adresse 00000024'. Prozess MP3_Lister_neu.exe (4092)
Erste Gelegenheit für Exception bei $7C81EB33. Exception-Klasse EAccessViolation mit Meldung 'Zugriffsverletzung bei Adresse 00468208 in Modul 'MP3_Lister_neu.exe'. Lesen von Adresse 00000024'. Prozess MP3_Lister_neu.exe (4092)
Erste Gelegenheit für Exception bei $7C81EB33. Exception-Klasse EAccessViolation mit Meldung 'Zugriffsverletzung bei Adresse 00468208 in Modul 'MP3_Lister_neu.exe'. Lesen von Adresse 00000024'. Prozess MP3_Lister_neu.exe (4092)

^^ wenn ihr damit was anfangen könnt xD

Gausi 13. Feb 2007 08:34

Re: ID3v2 wird nicht Ausgeführt - warum?
 
Ich bin mir nicht ganz sicher, was die Bedienung von TListview angeht, aber wenn man da Items einfügt, müssen die dann nicht erst erzeugt werden mit
Delphi-Quellcode:
Item := TListItem.Create;
, bevor man die Eigenschaften setzt?

p0w3r5tr34m3r 13. Feb 2007 08:55

Re: ID3v2 wird nicht Ausgeführt - warum?
 
Delphi-Quellcode:
stream := TFileStream.Create(dir + sr.name, fmOpenRead or fmShareDenyWrite);
sr.name würde vollkommen reichen weil es schon den kompletten Pfad zurückgibt


Mit freundlichen Grüßen

Hawkeye219 13. Feb 2007 09:18

Re: ID3v2 wird nicht Ausgeführt - warum?
 
Hallo,
Zitat:

Zitat von p0w3r5tr34m3r
Delphi-Quellcode:
stream := TFileStream.Create(dir + sr.name, fmOpenRead or fmShareDenyWrite);
sr.name würde vollkommen reichen weil es schon den kompletten Pfad zurückgibt

das stimmt nicht, und es wäre auch unsinnig, weil FindFirst/FindNext immer in einer Verzeichnisebene arbeiten. Der Pfad für alle gelieferten Einträge ist somit identisch und er sollte der Applikation bekannt sein.

Gruß Hawkeye

p0w3r5tr34m3r 13. Feb 2007 11:01

Re: ID3v2 wird nicht Ausgeführt - warum?
 
in meinem Programm klappt es aber wunderbar...

Delphi-Quellcode:
...
if FindFirst(dir+'\*.mp3', faAnyFile, sr) = 0 then begin
    repeat
      if ReadID3v2Tag(sr.Name, lTitle, lArtist, lAlbum, lYear, lComment, lTrackNo) then begin
...
Ich nutze übrigens die Komponente von muetze

Hawkeye219 13. Feb 2007 12:39

Re: ID3v2 wird nicht Ausgeführt - warum?
 
Natürlich funktioniert es - wenn die Dateien im aktuellen Verzeichnis liegen. TSearchRec enthält in der Eigenschaft .Name den Dateinamen inklusive Extension, nicht aber einen Verzeichnisanteil.

Ändere den Quelltext mal wie folgt ab:

Delphi-Quellcode:
...
SetCurrentDir ('C:\'); // neu
if FindFirst(dir+'\*.mp3', faAnyFile, sr) = 0 then begin
  repeat
    if ReadID3v2Tag(sr.Name, lTitle, lArtist, lAlbum, lYear, lComment, lTrackNo) then begin
...
Die .mp3-Dateien sollten weiterhin gefunden werden, da FindFirst() eine Verzeichnisangabe erhält. Das Auslesen der ID3-Tags sollte aber nicht mehr funktionieren, weil alle Dateien im aktuellen Verzeichnis (hier C:\) gesucht werden.

Gruß Hawkeye

Flom 13. Feb 2007 14:41

Re: ID3v2 wird nicht Ausgeführt - warum?
 
Zitat:

Zitat von Gausi
Ich bin mir nicht ganz sicher, was die Bedienung von TListview angeht, aber wenn man da Items einfügt, müssen die dann nicht erst erzeugt werden mit
Delphi-Quellcode:
Item := TListItem.Create;
, bevor man die Eigenschaften setzt?

Wenn dann
Delphi-Quellcode:
Item:=TListItem.Create(Self);
aber das funktioniert nicht! Folgende Meldung:
[Pascal Fehler] Code1.pas(88 ): E2010 Inkompatible Typen: 'TListItems' und 'TForm1'

und ich weiß nicht wieso!

p0w3r5tr34m3r 13. Feb 2007 15:12

Re: ID3v2 wird nicht Ausgeführt - warum?
 
Zitat:

Zitat von Hawkeye219
Natürlich funktioniert es - wenn die Dateien im aktuellen Verzeichnis liegen. [...]

habe aber nicht das aktuelle verzeichnis geändert.. lediglich habe ich der var dir einen wert zugewiesen ;)
hier mal die ganze prozedur ^^

Delphi-Quellcode:
var
  item: TListColumn;
  tracks: TListItem;
  sr: TSearchRec;
  i: integer;
  lArtist, lTitle, lAlbum, lYear, lComment, lTrackNo: string;
  dir: string;
  fn: string;
begin
  listview1.ViewStyle := vsReport;
  listview1.Align := alClient;
  lArtist := '';
  lTitle := '';
  lAlbum := '';
  lYear := '';
  lComment := '';
  lTrackNo := '';
  for i := low(lvColumns) to high(lvColumns) do begin
    item := listview1.Columns.Add;
    item.Caption := lvColumns[i];
    item.AutoSize := true;
  end;
  if paramstr(1) = '' then
    with TOpenDialog.Create(self) do begin
      if execute then
        dir := ExtractFilePath(Filename);
    end;
  if dir <> '' then
 
  if FindFirst(dir+'\*.mp3', faAnyFile, sr) = 0 then begin
    repeat
      if ReadID3v2Tag(sr.Name, lTitle, lArtist, lAlbum, lYear, lComment, lTrackNo) then begin
        tracks := listview1.Items.Add;
        with tracks do begin
          if lArtist <> '' then begin
            caption := lArtist;
            with subitems do begin
              add(lTitle);
              add(lAlbum);
              add(lYear);
              if lComment = '' then
                add('-')
              else
                add(lComment);
              add(lTrackNo);
            end;
            fn := '';
            if lTrackNo <> '' then
              fn := '['+lTrackNo+'] ';
            if lArtist <> '' then
              fn := fn + trim(lArtist);
            if lTitle <> '' then
              fn := fn+' - '+trimleft(lTitle);
            RenameFile(sr.name, trim(fn+extractfileext(sr.name)))
          end;
        end;
      end;
    until
      FindNext(sr) <> 0;
  end;
Mit freundlichen Grüßen


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:53 Uhr.
Seite 1 von 2  1 2      

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