25. juli 2002 - 00:24Der er
25 kommentarer og 1 løsning
Finder sange i Bibliotek sætter dem i en Listbox og afspiller i..
Det jeg gerne vil have den til at gøre er at jeg har en Listbox som er en slags Playlist for min mediaplayer, jeg fik en kode tidligere af Snowball som følger noget af ideen men mangler lige at få den til at finde sangene et bestemt sted fra..... (fx. C:\Waves\), koden er følgenden: unit Unit1;
type TForm1 = class(TForm) ListBox1: TListBox; MediaPlayer1: TMediaPlayer; procedure ListBox1DblClick(Sender: TObject); procedure MediaPlayer1Click(Sender: TObject; Button: TMPBtnType; var DoDefault: Boolean); private { Private declarations } i, imax: Integer; public { Public declarations } end;
var Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.ListBox1DblClick(Sender: TObject); begin imax := Listbox1.Items.Count -1; i := Listbox1.ItemIndex; With MediaPlayer1 do begin Filename := Listbox1.Items.Strings[i]; DeviceType := dtAutoSelect; Open; Play; end;
end;
procedure TForm1.MediaPlayer1Click(Sender: TObject; Button: TMPBtnType; var DoDefault: Boolean); begin case button of btNext: begin With MediaPlayer1 do begin if i+1 <= imax then begin Stop; Close; Filename := Listbox1.Items.Strings[i+1]; i := i + 1; DeviceType := dtAutoSelect; Open; Play; end; end; end;
btPrev: begin With MediaPlayer1 do begin if i >= 0 then begin Stop; Close; Filename := Listbox1.Items.Strings[i-1]; DeviceType := dtAutoSelect; i := i - 1; Open; Play; end; end; end; end; end;
Procedure ListSoundFilesFromDir(Dir:string); var SR: TSearchRec; begin Listbox1.Items.clear; //Finder vores mp3 filer if FindFirst(Dir + '\*.mp3', faAnyFile, SR) = 0 then while FindNext(SR) = 0 do begin if (SR.Name <> '.') and (SR.Name <> '..') then begin if fileexists(Dir+'\'+SR.Name) then Listbox1.Items.Add(Dir+'\'+SR.Name); end; end; //finder wav files if FindFirst(Dir + '\*.wav', faAnyFile, SR) = 0 then while FindNext(SR) = 0 do begin if (SR.Name <> '.') and (SR.Name <> '..') then begin if fileexists(Dir+'\'+SR.Name) then Listbox1.Items.Add(Dir+'\'+SR.Name); end; end; end;
Koden er ikke testet...
Kald den sådan: ListSoundFilesFromDir('C:\Waves');
For at forenkle spørgsmålet så har jeg en: MediaPlayer og en ListBox.... I listboxen skal alle Mp3 sangene være, sangene ligger i fx. \sange\ og listboxen skal bare indsætte filnavnene undtagen .mp3 til sidst... :)
DKN> Hvordan skal jeg bruge: Procedure ListSoundFilesFromDir(Dir:string); var SR: TSearchRec; begin Listbox1.Items.clear; //Finder vores mp3 filer if FindFirst(Dir + '\*.mp3', faAnyFile, SR) = 0 then while FindNext(SR) = 0 do begin if (SR.Name <> '.') and (SR.Name <> '..') then begin if fileexists(Dir+'\'+SR.Name) then Listbox1.Items.Add(Dir+'\'+SR.Name); end; end;
okay... men den kode (Listbox1.Items.Add(Dir+'\'+Copy(SR.Name, 0, Length(SR.Name)-4));) hvor skal den sættes ind henne form1.show? og skal der flere koder formen? ja jeg ved det men min hjerne er ikke så gpd for tiden.. :)
procedure ListSoundFilesFromDir(Dir: string); var SR: TSearchRec; begin Listbox1.Items.clear; //Finder vores mp3 filer if FindFirst(Dir + '\*.mp3', faAnyFile, SR) = 0 then while FindNext(SR) = 0 do begin if (SR.Name <> '.') and (SR.Name <> '..') then begin if fileexists(Dir+'\'+SR.Name) then Listbox1.Items.Add(Dir+'\'+Copy(ExtractFileName(SR.Name), 0, Length(SR.Name)-4)); end; end;
Her er et virkende eksempel! Dog fatter den ikke helt at når man har trykket prev eller frw så skal den starte sangen - men det er nok bare mediaplayer som leger med mig.
type TMusikFil = class(TObject) Filename: string; Filelocation: string; end;
type TForm1 = class(TForm) ListBox1: TListBox; MediaPlayer1: TMediaPlayer; Button1: TButton; procedure MediaPlayer1Click(Sender: TObject; Button: TMPBtnType; var DoDefault: Boolean); procedure Button1Click(Sender: TObject); procedure ListBox1DblClick(Sender: TObject); private { Private declarations } public { Public declarations } end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.MediaPlayer1Click(Sender: TObject; Button: TMPBtnType; var DoDefault: Boolean); var mp3: TMusikFil; begin case button of btNext: if ListBox1.ItemIndex <> ListBox1.Count then begin try MediaPlayer1.Stop; except end; ListBox1.ItemIndex := ListBox1.ItemIndex+1; MediaPlayer1.AutoEnable := true; end;
btPrev: if ListBox1.ItemIndex <> 0 then begin try MediaPlayer1.Stop; except end; ListBox1.ItemIndex := ListBox1.ItemIndex-1; ListBox1DblClick(sender); end; end; end;
//Knappen som skal åbne og liste en mp3 mappe
procedure TForm1.Button1Click(Sender: TObject); var mp3: TMusikFil; SR: TSearchRec; const dir = 'F:\Mp3'; //ændre dir til en variabel og sæt den så til mappen som skal listes for mp3 filer begin Listbox1.Items.clear;
if FindFirst(Dir + '\*.mp3', faAnyFile, SR) = 0 then while FindNext(SR) = 0 do begin if (SR.Name <> '.') and (SR.Name <> '..') then if fileexists(Dir + '\' + SR.Name) then begin mp3 := TMusikFil.Create; mp3.Filename := changefileext(SR.Name, ''); mp3.Filelocation := Dir + '\' + SR.Name; ListBox1.AddItem(mp3.Filename, mp3); end; end; end;
procedure TForm1.ListBox1DblClick(Sender: TObject); var mp3: TMusikFil; begin mp3 := Pointer(Listbox1.Items.Objects[Listbox1.ItemIndex]);
try //Skal være sikker på at der ikke kører en sang (mediaplayer holder ikke til meget :)) MediaPlayer1.Stop; except end;
dkn> Det med at den ikke afspiller sangen når man trykker prev song eller forward... men jeg har et andet problem.... jeg kører Delphi5 og den kode du har lavet er til Delphi 6..? Foruden Variants er der nogle andre koder der ikke funker i D5...? hvis du vil lave en kode til Delphi 5 så kan vi godt finde ud af noget med nogle ekstra points.... :)
Hvis jeg bruger den overstående kode, men ønsker at den også skal lede efter mp3 filer i underbibliotekerne i den mappe jeg vælger (i dette eks: F:\Mp3)?
procedure FindAllFiles(const APath : string); var SearchRec : TSearchRec; FindData : TWin32FindData; FileDate : Integer; MP3 : TMusikFil; begin { find den første fil der matcher } if FindFirst(APath + '*.mp3', faArchive, SearchRec) = 0 then try repeat MP3 := TMusikFil.Create; MP3.Filename := changefileext(SearchRec.Name, ''); MP3.Filelocation := APath + SearchRec.Name;
ListBox1.Items.AddObject(MP3.Filename, MP3) until FindNext(SearchRec) <> 0; // find næste fil finally FindClose(SearchRec); end; end;
procedure DoSearch(const APath : string); var SearchRec: TSearchRec; begin { hvis der er undermapper } if FindFirst(APath + '*.*', faDirectory, SearchRec) = 0 then try repeat { hvis det er en mappe og det ikke er '.' eller '..' } if ((SearchRec.Attr and faDirectory) <> 0) and (SearchRec.Name[1] <> '.') then begin FindAllFiles(APath + SearchRec.Name + '\'); // find filerne i mappen DoSearch(APath + SearchRec.Name + '\'); // og kald sig selv recursivt end; until FindNext(SearchRec) <> 0; // find den næste mappe finally FindClose(SearchRec); end; end;
function AppendBackslash(const APath : string) : string; begin if APath[Length(APath)] <> '\' then Result := APath + '\' else Result := APath; end;
const Path = 'F:\MP3'; begin FindAllFiles(AppendBackslash(Path)); DoSearch(AppendBackslash(Path)); end;
Nico du får lige lidt ekstra points i det næste spørgsmål, du er ved at hjælpe mig med... :) den gad ikke fordele points?
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.