Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Lauftext arbeitet nicht korrekt (https://www.delphipraxis.net/73814-lauftext-arbeitet-nicht-korrekt.html)

Nils_13 24. Jul 2006 12:41


Lauftext arbeitet nicht korrekt
 
Hi,

ich habe eine Methode einen Lauftext zu erstellen hier in der DP gefunden. Ich suche über einen Typen den Titel und den Artisten eines Liedes heraus. Ich möchte dann beides in folgender Form in einen Lauftext unterbringen: Artist - Titel.
Bei folgendem Code steht aber nur der Artist da, aber nicht der Titel. Warum ?
Delphi-Quellcode:
lLauftext.Caption := fFiles[lbList.ItemIndex].Artist + ' - ' + fFiles[lbList.ItemIndex].Titel;
// Artist und Titel sind auf jeden Fall vorhanden

procedure TfrmMain.tLauftextTimer(Sender: TObject);
var
  hilf, hilfbuchstabe : String;
begin
  if BASS_ChannelIsActive(chan) = BASS_ACTIVE_PLAYING then
  begin
    hilf := lLauftext.Caption;
    hilfbuchstabe := hilf[1];
    delete(hilf, 1, 1);
    hilf := hilf + hilfbuchstabe;
    lLauftext.Caption := hilf;
    Application.ProcessMessages;
  end;
end;

Daniel B 24. Jul 2006 12:44

Re: Lauftext arbeitet nicht korrekt
 
Suche mal in der Code-Lib nach "lauftext" und "laufschrift", da gibt es drei Beispiele. :)

Nils_13 24. Jul 2006 12:45

Re: Lauftext arbeitet nicht korrekt
 
Keines der Beispiele funktioniert mit der ID3-Tag-Zuweisung.

marabu 24. Jul 2006 13:09

Re: Lauftext arbeitet nicht korrekt
 
Hallo Nils,

es kommt darauf an, wie du das Feld Artist gefüllt hast. Setze einen break point vor der ersten Zuweisung an lLaufText.Caption und schau dir den Inhalt mal an:

Delphi-Quellcode:
var
  s: String;
begin
  ...
  with fFiles[lbList.ItemIndex] do
  begin
    s := Artist + ' - ' + Titel;
    lLauftext.Caption := s; // hier anhalten und s inspizieren
  end;
  ...
end;
Vermutlich hast du es geschafft einen gezählten string terminator (#0) an das Ende von Artist du pappen.

Grüße vom marabu

Nils_13 24. Jul 2006 15:01

Re: Lauftext arbeitet nicht korrekt
 
Ja, da sind mehrere #0. Wie bekomme ich die weg ?

marabu 24. Jul 2006 15:04

Re: Lauftext arbeitet nicht korrekt
 
Am Besten ist es, du lässt sie erst garnicht hinein gelangen. Schau dir mal akribisch den Code an, mit dem du die Felder Artist und Titel füllst.

marabu

Nils_13 24. Jul 2006 18:31

Re: Lauftext arbeitet nicht korrekt
 
Ich habe keinen Fehler gefunden, vielleicht findet ihr ja einen:
Delphi-Quellcode:
procedure TfrmMain.AddFiles(files : Array of String);
var
  len : integer;
  i  : integer;
begin
  len := Length(fFiles);
  SetLength(fFiles, len + Length(files));
  for i := 0 to pred(length(files)) do
  begin
    fFiles[len+i] := ReadID3Tag(files[i]);
  end;
  UpdateListBox;
end;

procedure TfrmMain.UpdateListBox;
var
  i : integer;
begin
  lbList.Items.BeginUpdate;
  lbList.Clear;
  for i := 0 to pred(length(fFiles)) do
  begin
    lbList.Items.Add(trim(fFiles[i].Artist) + ' - ' + trim(fFiles[i].Titel));
  end;
  lbList.Items.EndUpdate;
end;

Klaus01 24. Jul 2006 19:16

Re: Lauftext arbeitet nicht korrekt
 
Liste der Anhänge anzeigen (Anzahl: 1)
...kann es sein, das die mp3 verschiede Versionen des ID3 Tags
haben? Es gibt Unterschiede zwischen ID3TagV2 und ID3TagV3.2
Vgl. hier: http://de.wikipedia.org/wiki/ID3-Tag

lbList.Items.Add(trim(fFiles[i].Artist) + ' - ' + trim(fFiles[i].Titel))

Wie schauen denn die Variablen ....Artist und ...Titel aus wenn Du sie Dir mit
Ctrl-F5 anschaust?

Kannst Du die ReadId3Tag Funktion auch noch einstellen?

Aus einem Projekt von mir lese ich die ID3Tags so ein:

Delphi-Quellcode:
procedure FillID3TagInformation(mp3File:string;VAR ID3:TID3Rec);
var //fMP3: file of Byte;
    id3v2Tag : TID3v2;
begin

  id3v2Tag := TID3v2.Create;

  if id3v2tag.ReadFromFile(mp3File) then
    begin
      id3.Title:='';
      id3.Artist:='';
      id3.Album:='';

      id3.title:=id3v2tag.Title;
      id3.artist:=id3v2tag.artist;
      id3.album:=id3v2tag.album;

      if id3.artist = '' then
        id3.artist := 'no artist';
      if id3.Album = '' then
        id3.Album:= 'no album';
      if id3.Title = '' then
        id3.Title := 'no title';
    end;

  id3v2Tag.Free;

end;
Die angehängte Unit wird dazu benötigt.


Grüße
Klaus

Nils_13 24. Jul 2006 21:05

Re: Lauftext arbeitet nicht korrekt
 
Hm, ich möchte eigentlich bei meiner Methode bleiben, damit bin ich auch eigentlich zufrieden, aber ich weiß nicht, wie ich die #0-Zeichen da rausholen kann.

marabu 24. Jul 2006 21:59

Re: Lauftext arbeitet nicht korrekt
 
Hallo Nils,

Klaus hat es ja schon konkret angefragt:

Delphi-Quellcode:
fFiles[len+i] := ReadID3Tag(files[i]);
Mit der Routine ReadID3Tag() scheinst du die low values in die Strings der Struktur ID3Tag hinein zu bringen - dort musst du suchen oder den Code für die Routine mal zeigen.

Gute Nacht

marabu

Nils_13 25. Jul 2006 07:42

Re: Lauftext arbeitet nicht korrekt
 
Delphi-Quellcode:
function TfrmMain.ReadID3Tag(FileName: String): TID3Tag;
var
  FS: TFileStream;
  Buffer: array [1..128] of Char;
begin
  FS := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
  try
    FS.Seek(-128, soFromEnd);
    FS.Read(Buffer, 128);

    Result.ID      := Copy(Buffer, 1, 3);
    Result.Titel   := Copy(Buffer, 4, 30);
    Result.Artist   := Copy(Buffer, 34, 30);
    Result.Album  := Copy(Buffer, 64, 30);
    Result.Year   := Copy(Buffer, 94, 4);
    Result.Comment   := Copy(Buffer, 98, 30);
    Result.Genre   := Ord(Buffer[128]);
    Result.FileName := FileName;
  finally
    FS.Free;
  end;
end;

Klaus01 25. Jul 2006 07:48

Re: Lauftext arbeitet nicht korrekt
 
Mit Deinem ReadID3Tag kannst Du nur ID3V1 korrekt lesen.
Wenn ein mp3 File mit ID3V3 Tags daher kommt liest Du Datenmüll ein.

Du solltest zumindest vorher prüfen, ob ein ID3V1 Tag vorliegt.

Code:
Offset Länge Bedeutung
0 3 Kennung "TAG" zur Kennzeichnung eines ID3v1-Blocks
3 30 Songtitel
33 30 Künstler/Interpret
63 30 Album
93 4 Erscheinungsjahr
97 30 Beliebiger Kommentar
127 1 Genre
Oder die Werte, die Du dem Record übergibts, überprüfst
ob sie denn lesbare AsciiZeichen beinhalten.

Grüße
Klaus

Nils_13 25. Jul 2006 07:51

Re: Lauftext arbeitet nicht korrekt
 
Und wie kann ich so etwas überprüfen ?

Dein Code oben liest die Id3TagsV2 ein und meiner 1, also muss ich rausfinden, welche Version in der Datei steht und mit dem passenden Code auslesen. Stimmt das so ?

*** edit ***
Warum stehen dann aber die Id3Tags bei den selben Dateien in der Playlist ohne Datenmüll ? In der Playlist: Static-X - The Only
Lauftext: Static-X #0#0#0#0#0#0#0#0#0#0#0#0 - The Only #0#0#0#0#0#0#0#0#0#0#0#0

Klaus01 25. Jul 2006 07:57

Re: Lauftext arbeitet nicht korrekt
 
ID3v1 -> 0 3 Kennung "TAG" zur Kennzeichnung eines ID3v1-Blocks
hat in den ersten 3 Bytes das Wort "TAG" stehen.
Steht aber auch in dem Link den ich im obigen Beitrag erwähnt habe.

Warum in der Playlist alles korrekt zu lesen ist,
da steht auch für mich ein großes ?.

Vielleich spielt das etwas von PChar und String hinein.
bei PChar wird das Textende mit #0 definiert und wird in einem
String nicht dargestellt.

Grüße
Klaus

marabu 25. Jul 2006 08:11

Re: Lauftext arbeitet nicht korrekt
 
Hallo Nils,

Delphi-Quellcode:
Result.Artist := Copy(Buffer, 34, 30);
du liest mit Copy() einen festen Bereich aus einer Struktur in einen String fester Länge. In Buffer ist Artist aber ein array of byte, welches rechts mit low values (#0) aufgefüllt wird. Du musst also anders vorgehen:

Delphi-Quellcode:
function BufToStr(buf: PChar; maxSize: Integer): String;
begin
  SetLength(Result, maxSize);
  Move(buf^, Result[1], maxSize);
  Result := StrPas(@Result[1]);
end;
Grüße vom marabu

Nils_13 25. Jul 2006 08:33

Re: Lauftext arbeitet nicht korrekt
 
Danke, ich habe es jetzt so gelöst:
Delphi-Quellcode:
type
  TID3Tag = record
    ID: array[0..3] of Char;          
    Titel: array[0..30] of Char;      
    Artist: array[0..30] of Char;    
    Album: array[0..30] of Char;      
    Year: array[0..4] of Char;        
    Comment: array[0..30] of Char;    
    Genre: Byte;
    Filename: String;                      
  end;

function ReadID3Tag(const FileName: String): TID3Tag;
begin
  FillChar(Result, SizeOf(Result), 0);
  with TFileStream.Create(FileName, fmOpenRead or fmShareDenyNone) do
  try
    Position := Size - 128;
    Read(Result.ID, 3);
    Read(Result.Titel, 30);
    Read(Result.Artist, 30);
    Read(Result.Album, 30);
    Read(Result.Year, 4);
    Read(Result.Comment, 30);
    Read(Result.Genre, 1);
    Result.Filename := Filename;
  finally
    Free;
  end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:42 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