Avatar billede prodoc Nybegynder
25. juli 2002 - 00:24 Der 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;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  MPlayer, StdCtrls;

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;

end.
Avatar billede prodoc Nybegynder
25. juli 2002 - 00:24 #1
PS.
Snowball vi skal nok finde ud af noget med de points...
Avatar billede nico26 Nybegynder
25. juli 2002 - 01:06 #2
Du mener at listboxen viser filnavnene, og du så mangler stien på filen?
Avatar billede hermandsen Juniormester
25. juli 2002 - 01:09 #3
Brug den her komponent til at finde dine lyd-filer med... Den er lavet i en Thread og er rimelig nem at gå til! ;)
http://www.pythia.dk/komponenter/download/TFileSearch.zip
Avatar billede hermandsen Juniormester
25. juli 2002 - 01:11 #4
Så gør du bare som følger:

FileSearch1.Root := 'C:\Waves';
FileSearch1.Filter := '*.wav';
FileSearch1.Recursiv := True; //Finder undermapper
FileSearch1.Execute;

Så skal du bare kode dine OnFileFound, OnDirectoryFound og OnFinish-events... :)
Avatar billede dkn Nybegynder
25. juli 2002 - 02:17 #5
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');

Husk at den ikke skal have slash tilsidst
Avatar billede prodoc Nybegynder
25. juli 2002 - 19:38 #6
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... :)
Avatar billede prodoc Nybegynder
25. juli 2002 - 19:41 #7
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;
Avatar billede hermandsen Juniormester
25. juli 2002 - 21:36 #8
Listbox1.Items.Add(Dir+'\'+Copy(SR.Name, Length(SR.Name)-4, Length(SR.Name))); ?
Avatar billede hermandsen Juniormester
25. juli 2002 - 21:37 #9
Sorry! Jeg sover...
Listbox1.Items.Add(Dir+'\'+Copy(SR.Name, 0, Length(SR.Name)-4));
Avatar billede nico26 Nybegynder
25. juli 2002 - 21:54 #10
Jeg tror det er meningen, at stien og fil-extensionen ikke skal stå i listboxen. Altså bare navnet på filen.
Avatar billede prodoc Nybegynder
25. juli 2002 - 22:05 #11
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.. :)
Avatar billede hermandsen Juniormester
25. juli 2002 - 22:19 #12
Brug dkn's procedure...

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;
Avatar billede dkn Nybegynder
25. juli 2002 - 23:48 #13
når du bruger en listbox kan du lige så godt bruge addobject();

Det kræver at du laver lidt om i din kode med til sidst vil du være meget glad for det :)

på den måde vil du kunne lave så kun filnavnet bliver vist i listboxen. Laver bare et object der holder både filnavn og dens location.
Avatar billede dkn Nybegynder
26. juli 2002 - 01:01 #14
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.


unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, MPlayer, StdCtrls;

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;

  MediaPlayer1.Filename := mp3.Filelocation;
  MediaPlayer1.DeviceType := dtAutoSelect;
  MediaPlayer1.Open;
  MediaPlayer1.Play;
  caption := 'Spiller nu: ' + mp3.Filename;
end;

end.
Avatar billede prodoc Nybegynder
26. juli 2002 - 17:20 #15
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.... :)
Avatar billede dkn Nybegynder
26. juli 2002 - 18:13 #16
bare slet Variants den bliver ikke brugt. Der er ingen ekstra ting overhovedet
Avatar billede prodoc Nybegynder
26. juli 2002 - 20:10 #17
den laver en fejl mere ved:
      if ListBox1.ItemIndex <> ListBox1.Count then 
      = 
[Error] Unit1.pas(44): Undeclared identifier: 'Count'

og

      ListBox1.AddItem(mp3.Filename, mp3);
      =[Error] Unit1.pas(87): Undeclared identifier: 'AddItem'

???
Avatar billede nico26 Nybegynder
26. juli 2002 - 20:36 #18
erstat if ListBox1.ItemIndex <> ListBox1.Count then
med if ListBox1.ItemIndex <> ListBox1.Items.Count then

En D6 ting
Avatar billede nico26 Nybegynder
26. juli 2002 - 20:38 #19
og ListBox1.AddItem(mp3.Filename, mp3);
erstattes med ListBox1.Items.AddObject(mp3.Filename, mp3);

:)
Avatar billede prodoc Nybegynder
26. juli 2002 - 22:02 #20
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)?
Avatar billede nico26 Nybegynder
26. juli 2002 - 22:25 #21
skift Button1Click ud med denne her


procedure TForm1.Button1Click(Sender: TObject);

  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;
Avatar billede prodoc Nybegynder
26. juli 2002 - 22:31 #22
OKAY tak for det.....
Hvis du vil have nogle points så kom lige med et svar Nico....
dkn du får selfølgelig også nogle... :)
men tak...
Avatar billede nico26 Nybegynder
26. juli 2002 - 22:36 #23
København er altid kokus
Avatar billede dkn Nybegynder
26. juli 2002 - 22:37 #24
var så lidt :)
Avatar billede prodoc Nybegynder
26. juli 2002 - 23:47 #25
Hvad sker der, den siger at jeg ikke giver nok points for den valgte handling når jeg vil fordele mine points...?
Avatar billede prodoc Nybegynder
29. juli 2002 - 13:06 #26
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?
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester