Zitat von
marabu:
Moin,
vielleicht habe ich nicht aufmerksam genug gelesen, aber wenn ich die etwas abstrakten Anforderungen mal ignoriere und die durchscheinende Anwendungsidee betrachte, dann verstehe ich folgendes:
Anders als übliche Player will der thread owner ein automatisches Abspielen von Audio-Dateien nicht über einen vom Benutzer geordneten SnapShot eines Verzeichnisbaumes steuern, sondern die physische Abfolge von Titeln unabhängig von der Tiefe der Verzeichnisstruktur heranziehen.
Code:
- Audio
- Best Of The 50's
- Dean Martin - Memories Are Made Of This
- Don Robertson - The Happy Whistler
- Eagles
- One Of These Nights
- Lyin' Eyes
- Take It To The Limit
- Desperado
- Tequila Sunrise
Nach dem Track "The Happy Whistler" soll der Track "Lyin' Eyes" gespielt werden - also ein Depth-First TreeWalk durch einen Verzeichnisbaum, bei dem die leafs die zu spielenden Tracks darstellen.
Freundliche Grüße
So wie du es oben darstellst, soll es sein, wenn du noch einzelne Files z.B. in Eagles\berücksichtigst sowie eine Maximalgrenze nach oben, ich biete da mal das festgelegte Rootverzeichnis "Audio" an. Ist "Tequila Sunrise" abgespielt, sollte er wieder oben anfangen bzw er geht nach "Dean Martin" durch die Tiefen-Funtion.
Hallo, also ganz so abstrakt sind die Anforderungen ja nicht. Grundsätzlich verwende ich das EasyListView zum darstellen der Struktur und man kann selbst durch alle Ordner zappen und irgendwas anspielen. Befinde ich mich in einem Ordner, spiele ich jetzt diesen ab und am Ende wieder zum ersten Track.
Jetzt kam die Frage bei den Usern auf, ob man nicht am Ende zum nächsten Ordner springen kann und diesen dann abspielen. Das fällt bei mir so in die Art eines CD-Wechslers mit dem Unterschied, das es halt im Verzeichnisbaum auch Tiefen gibt.
Mit weiteren Gedanken kam ich dann dazu, das in jedem Ordner sowie UnterOrdner als auch RestFiles liegen können, die auch automatisiert abgespielt werden müssen.
Um überhaupt das Ganze zu ermöglichen, kann ich 2 Dinge tun:
1: innerhalb des ListViews gezielt die Indexe abfragen und springen, was aber immer eine Aktualisierung des Listviews zur Folge hat, also schlecht (ListView wird über FindAllFiles gefüllt)
2: Die Struktur absuchen mit Funktionen zur Pfadermittlung aber auch Funktionen für die Inhalte der wie Ordner und Files zu haben....und wenn alles richtig läuft, das PlayFile erreicht eine einmalige Aktualisierung des ListView
So mal ganz unprofessionell angefangen (unfertig):
Delphi-Quellcode:
procedure FindDir;
var i:integer;
aPath:string;
label DirSearch;
begin
aPath := ExcludeTrailingPathDelimiter(PlayPath);//PlayPath merken ggf noch ändern
Path := GetAudioplayerDirectory(PlayPath); //Path eine Ebene höher als PlayPath
showmessage(path);
DirSearch:
DirLst.Clear;
ListeDir(Path,DirLst); //dort alle Ordner in Stringliste holen
{****nächsten Ordner unter PlayOrdner suchen und 1.Fileabspielen**************}
if DirLst.Count >0 then //wenn mehr als 0 Ordner vorhanden
begin
for I := 0 to DirLst.Count-1 do //Ordner zählen und Play-Ordnernamen
if aPath = DirLst.Strings[I] then //mit Liste vergleichen bzw suchen
break; //wenn gefunden
Inc(I); //Index-Nr ab Playordner um 1 erhöhen
end;
if (I < DirLst.Count) then //** wenn OrdnerIndex < DirLsteintraege
begin
if DirectoryExists(DirLst.Strings[I]) then //wenn Ordner vorhanden
Path := FindLastDir(DirLst.Strings[I]); //neuen Path setzen auf tiefsten Ordner
DirLst.Clear; //vom indexierten Ordner setzen
FileLst.Clear;
search:=true;
FindAllFiles(DirLst,FileLst,Path,FileMask,false,true,true);//dort alle Ordner...
search:=false; // ...und Files in Stringlisten holen,DirLst sollte
//...leer bleiben da in tiefsten Ordner
if FileLst.Count >0 then //wenn in Fileliste mehr als 0 Einträge
begin
if FileExists(FileLst.Strings[0]) then //wenn File vorhanden (1. File)
begin
ShowMediaFiles(listmedia,false,true); //AudioListe aktualisieren
showmessage('Play in tiefster Ebene');
Play(Path,0); //dann 1.File abspielen
end;
end else //wenn keine Einträge in Stringliste, dann
begin
showmessage('kein File vorhanden in tiefster Ebene');
Goto DirSearch;
end;
end else if FileLst.Count >0 then //wenn erhöhter OrdnerIndex >DirLsteinträge
begin //sprich kein weiterer Ordner mehr
if FileExists(FileLst.Strings[0]) then //dann wenn File vorhanden (1. File)
begin
ShowMediaFiles(listmedia,false,true); //Audioliste aktualisieren
showmessage('Play restliche Files unter Ordner');
Play(Path,0); //und 1.File abspielen
end else
begin //wenn Ordner und Files nicht mehr vorhanden
showmessage('Loop zum ersten Ordner vom Root')
fehlt noch //dann bei erstem Ordner ab MediaRoot anfangen
end;
...und ich dachte, Delphi ist ein Programmgenerator mit nur einem Button......tzzz