AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language prozedur verhaelt sich je nach aufrufposition anders
Thema durchsuchen
Ansicht
Themen-Optionen

prozedur verhaelt sich je nach aufrufposition anders

Ein Thema von 1234588 · begonnen am 16. Mär 2008 · letzter Beitrag vom 16. Mär 2008
Antwort Antwort
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
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#2

Re: prozedur verhaelt sich je nach aufrufposition anders

  Alt 16. Mär 2008, 16:21
Warum machst du das:
SendMessage(hList, LB_ADDSTRING, 0, LongInt(PChar(ExtractFileName(s)))); Durch ExtractFileName geht der Pfad verloren!
Warum prüfst du nicht zuerst, ob es sich um eine M3U-Datei handelt ?
Es wäre besser, zuerst zu schauen, ob es sich um eine Playlist handelt und dann für jede Zeile AddTrack aufzurufen.
Deine (falsche) Strategie ist ja: erst mal mit LB_ADDSTRING hinzu fügen und wenn es nicht geklappt hat schauen ob es vielleicht eine Playlist war.
  Mit Zitat antworten Zitat
1234588

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

Re: prozedur verhaelt sich je nach aufrufposition anders

  Alt 16. Mär 2008, 16:54
SendMessage(hList, LB_ADDSTRING, 0, LongInt(PChar(ExtractFileName(s)))); ich mach das, weil ich in meiner playlist (der visuelle teil, in dem der user dann sein lied raussucht) nicht den pfad, sondern den namen der datei sehen will. in der zeile darueber speichere ich den dateinamen mit ganzem pfad in meine stringlist. ich hab dann zwei listen. eine visuelle und eine die die ganzen datei namen speichert. die reihgenfolge meiner beiden listen ist ja identisch (da ich die lieder immer ans ende der listen hinzufuege), so weiß ich wenn in meiner visuellen liste element 3 gefragt ist, das das dem element 3 in meiner stringlist entspricht. deshalb brauche ich nicht die ganze pfad angabe in beiden listen


Zitat:
Warum prüfst du nicht zuerst, ob es sich um eine M3U-Datei handelt ?
spaeter sollen noch mehr playlist formate hinzu kommen. da muss ich das ganze umstrukturieren. ich werde dann eine externe prozedur pruefen lassen, was es fuer eine playlist ist. je nach dem wird dann die liste entsprechend geparst.
das ist ja kein großes problem.
außerdem halte ich es fuer wahrscheinlicher, das ein lied hinzugefuegt wird. ich glaube das playlisten nicht so oft als lieder hinzugefuegt werden :o)

Zitat:
Deine (falsche) Strategie ist ja: erst mal mit LB_ADDSTRING hinzu fügen und wenn es nicht geklappt hat schauen ob es vielleicht eine Playlist war.
hast du falsch verstanden. es wird zuerst geprueft ob es eine gueltige audio datei ist. wenn ja wird die datei bzw. der name der datei den listen hinzugefuegt. falls es keine gueltige audio datei ist, wird geprueft ob es sich um eine playlist handelt. das hinzufuegen von strings klappt ja immer und hat ja auch nichts mit der gueltigkeit von den audio dateien zu tun. ich sollte aber vll. trotzdem auf LB_ERR pruefen :)
  Mit Zitat antworten Zitat
Antwort Antwort


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 21:02 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