Einzelnen Beitrag anzeigen

1234588

Registriert seit: 14. Jan 2007
Ort: Stuttgart
164 Beiträge
 
#1

prozedur verhaelt sich je nach aufrufposition anders

  Alt 16. Mär 2008, 16:11
hallo community
ich arbeite derzeit an einem moeglichst schlanken programm, was musik mit hilfe der bass.dll abspielen soll.
im hauptfenster befindet sich eine playlist, in die man mittels einer prozedur lieder hinzufuegen kann. die prozedur:

Delphi-Quellcode:
procedure AddTrack(s: String);
var
  //TStrList ist ein nachbau der TStrlinglist klasse. in wesentlichen ist es das selbe
  m3ulist: TStrList;
  i: LongInt;
  //HSTREAM ist in der bass.pas definiert. ist vom typ LongWord
  tmpstream: HSTREAM;
begin
  //unsere datei wird gerendert
  tmpstream := BASS_StreamCreateFile(False, @s[1], 0, 0, 0);
  //wenn das handle nicht 0 ist, die datei also eine gueltige audio datei ist..
  if tmpstream <> 0 then
  begin
    //playlist ist mein TStrList objekt, indem ich meine dateinamen der playlist sichere
    Playlist.Add(s);
    SendMessage(hList, LB_ADDSTRING, 0, LongInt(PChar(ExtractFileName(s))));
    //den stream wieder freigeben, da er nur erstellt wurde um die gueltigkeit der audio datei zu pruefen
    BASS_StreamFree(tmpstream);
    //wenn das neu hinzugefuegte lied das erste ist, soll es auch gleich abgespielt werden
    if SendMessage(hList, LB_GETCOUNT, 0, 0) = 1 then play(track);
  end else
  begin
    //wenn die datei keine gueltige audio datei ist, wird die extension der datei geprueft
    //ist diese nicht m3u, wird die procedure verlassen
    if FileExt(s) <> 'm3uthen exit;
    //die stringlist wird erstellt und die playlist geladen
    m3ulist := TStrList.Create;
    m3ulist.loadfromfile(s);
    //der pfad der playlist wird ermittelt. im grunde das selbe wie ExtractFilePath()
    while s[length(s)] <> '\do
      Delete(s, length(s), 1);

    //schleife die jedes element durchgehen soll
    for i := 0 to m3ulist.Count - 1 do
      //ist das erste zeichen ein #, handelt es sich um eine extended m3u playlist. die zeile ist ein kommentar oder eine zusatz information. ich ignoriere diese informationen vorerst
      if m3ulist.strings[i][1] <> '#then
        //IsDrive() prueft den pfad. gibt true zurueck, wenn der pfad mit einem laufwerksbuchstaben beginnt
        if IsDrive(m3ulist.strings[i]) then
          AddTrack(m3ulist.strings[i]) else
            AddTrack(s + m3ulist.strings[i]);
    m3ulist.Free;
  end;
end;
diese prozedur funktioniert tadellos. auch m3u playlist werden erfolgreich ausgelesen. allerdings beobachte ich ein seltsames phaenomen. will ich eine playlist per drag&drop hinzufuegen, sind die dateien nur bedingt abspielbar. man kann beispielsweise das lied nicht per doppelklick abspielen. der aufruf ist genau der selbe, nur findet er an einer anderen position statt

mein drag&drop teil:

Delphi-Quellcode:
var
  tmpstr: String;
  iDrop,
  fSize: LongInt;

..

  WM_DROPFILES:
  begin
    for iDrop := 0 to DragQueryFile(wParam, $FFFFFFFF, @tmpstr[1], 255) - 1 do
    begin
      fSize := DragQueryFile(wParam, iDrop, nil, 0) + 1;
      SetLength(tmpstr, fSize);
      DragQueryFile(wParam, iDrop, @tmpstr[1], fSize);
      AddTrack(tmpstr);
    end;
    DragFinish(wParam);
  end;
ich bin langsam ratlos. ich verstehe nicht, warum der selbe aufruf an einer anderen position nichtmehr funktioniert. ich hoffe, ich habe mich verstaendlich gemacht :)
falls es helfen soll, gebe ich auch gerne den gesamten quelltext raus. das programm soll ohnehin open source werden
  Mit Zitat antworten Zitat