![]() |
prozedur verhaelt sich je nach aufrufposition anders
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:
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
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) <> 'm3u' then 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; mein drag&drop teil:
Delphi-Quellcode:
ich bin langsam ratlos. ich verstehe nicht, warum der selbe aufruf an einer anderen position nichtmehr funktioniert. ich hoffe, ich habe mich verstaendlich gemacht :)
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; falls es helfen soll, gebe ich auch gerne den gesamten quelltext raus. das programm soll ohnehin open source werden |
Re: prozedur verhaelt sich je nach aufrufposition anders
Warum machst du das:
Delphi-Quellcode:
Durch ExtractFileName geht der Pfad verloren!
SendMessage(hList, LB_ADDSTRING, 0, LongInt(PChar(ExtractFileName(s))));
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. |
Re: prozedur verhaelt sich je nach aufrufposition anders
Delphi-Quellcode:
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
SendMessage(hList, LB_ADDSTRING, 0, LongInt(PChar(ExtractFileName(s))));
Zitat:
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:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:22 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