Avatar billede prodoc Nybegynder
29. juli 2002 - 23:45 Der er 60 kommentarer og
1 løsning

Mediaplayer1 går automatisk videre til næste sang i min Listbox..

Hejsa igen igen,
jeg har en Mediaplayer og en Listbox...hvor mediaplayeren afspiller sange som er i Listboxen....men jeg har et problem for når én sang er færdig så stopper musikken bare, og jeg vil gerne have den til at gå videre til næste sang på listen i listboxen!!!??
Avatar billede nico26 Nybegynder
30. juli 2002 - 00:01 #1
Brug notify-eventet a la det her


implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
  MediaPlayer1.Open;
  MediaPlayer1.Notify := True;
end;

procedure TForm1.MediaPlayer1Notify(Sender: TObject);
begin
  ListBox1.ItemIndex := ListBox1.ItemIndex + 1;
  MediaPlayer1.Notify := True;
  MediaPlayer1.FileName := 'Sæt filnavn til den næste';
  MediaPlayer1.Play;
end;

end.
Avatar billede proximus86 Nybegynder
30. juli 2002 - 00:19 #2
har du en play list ?
Avatar billede nico26 Nybegynder
30. juli 2002 - 00:23 #3
Han har en ListBox som playlist
http://www.eksperten.dk/spm/239332
Avatar billede dkn Nybegynder
30. juli 2002 - 01:22 #4
{
mpNotReady    Not ready
mpStopped    Stopped
mpPlaying    Playing
mpRecording    Recording
mpSeeking    Seeking
mpPaused    Paused
mpOpen    Open
}

procedure TForm1.FormCreate(Sender: TObject);
begin
  MediaPlayer1.Notify := True;
  MediaPlayer1.OnNotify := NotifyProc;
end;

procedure TForm1.NotifyProc(Sender: TObject);
begin
  With Sender As TMediaPlayer do
  begin
    Case Mode of
      mpStopped: MediaPlayer1Click(sender, btNext, default);
    end;
    //Skal sættes til true for at vi får næste besked
    Notify := True;
  end;
end;
Avatar billede prodoc Nybegynder
30. juli 2002 - 14:38 #5
Nico jeg har brugt dit eks....men den skriver at "enhedstypen kan ikke bestemmes ud fra det angivne filtypenavn".....? jeg har prøvet at skrive alt (*.mp3 .mp3 mp3) men det virker stadigvæk ikke?
Kan det gøre en forskel at jeg har sat koden ind i form2.show i stedet for form2.create...

m.v.h. ProDoc
Avatar billede nico26 Nybegynder
30. juli 2002 - 17:23 #6
Du har vel ændret denne linie så den hiver navnet ud listboxen i stedet for.

MediaPlayer1.FileName := 'Sæt filnavn til den næste';
Avatar billede prodoc Nybegynder
30. juli 2002 - 20:31 #7
ja det ved jeg :)
Men hvad skal jeg skrive, har prøvet:

MediaPlayer1.FileName := 'ListBox1.ItemIndex + 1';
MediaPlayer1.FileName := 'ListBox1.ItemIndex := ListBox1.ItemIndex + 1';

men forstår ikke problemet..?
Avatar billede prodoc Nybegynder
30. juli 2002 - 21:59 #8
med andre ord, hvad skal jeg skrive på linien?
Avatar billede nico26 Nybegynder
30. juli 2002 - 22:34 #9
Noget i retningen af

ListBox1.ItemIndex := ListBox1.ItemIndex + 1;
MediaPlayer1.FileName := TMusikFil(ListBox1.Items.Objects[ListBox1.ItemIndex]).FileLocation;
MediaPlyer1.Notify := True;
MediaPlayer1.Play;
Avatar billede prodoc Nybegynder
30. juli 2002 - 23:06 #10
Den siger stadigvæk at:
"enhedstypen kan ikke bestemmes ud fra det angivne filtypenavn"

Mediaplayer1.notify:
ListBox1.ItemIndex := ListBox1.ItemIndex + 1;
MediaPlayer1.FileName := TMusikFil(ListBox1.Items.Objects[ListBox1.ItemIndex]).FileLocation;
MediaPlayer1.Notify := True;
MediaPlayer1.Play;

Resten har jeg indsat i form2.show;
Avatar billede nico26 Nybegynder
30. juli 2002 - 23:13 #11
prøv at sætte en ShowMessage ind, for at se om filnavnet er korrekt

procedure TForm1.MediaPlayer1Notify(Sender: TObject);
begin
  ListBox1.ItemIndex := ListBox1.ItemIndex + 1;
  ShowMessage(TMusikFil(ListBox1.Items.Objects[ListBox1.ItemIndex]).FileLocation);
  MediaPlayer1.FileName := TMusikFil(ListBox1.Items.Objects[ListBox1.ItemIndex]).FileLocation;
  MediaPlyer1.Notify := True;
  MediaPlayer1.Play;
end;
Avatar billede prodoc Nybegynder
30. juli 2002 - 23:18 #12
Der står stadigvæk det samme? altså ("enhedstypen kan ikke bestemmes ud fra det angivne filtypenavn")
Avatar billede nico26 Nybegynder
30. juli 2002 - 23:25 #13
Opstår fejlen i notify proceduren - og i hvilken linie går det galt?
Avatar billede prodoc Nybegynder
30. juli 2002 - 23:28 #14
ja den viser i hvert fald at det er ved: MediaPlayer1.Notify := True; den stopper, men det værste er at den viser ikke der er nogle fejl i programmet, men først når man kører programmet....
Avatar billede nico26 Nybegynder
30. juli 2002 - 23:31 #15
Underligt - hvad med den ShowMessage, viste den et korrekt filnavn?
Avatar billede prodoc Nybegynder
30. juli 2002 - 23:33 #16
jeg kopierede bare den kode du gav mig?
-men den viste bare den førnævnte besked......?
Avatar billede nico26 Nybegynder
30. juli 2002 - 23:45 #17
Det kan være fejlen er et andet sted - virker programmet hvis du fjerne notify koden?
Avatar billede prodoc Nybegynder
30. juli 2002 - 23:48 #18
Nej fejlen kommer stadigvæk......
Men der er jo også en (MediaPlayer1.Notify := True;) ved Form2.show; ...
Avatar billede nico26 Nybegynder
31. juli 2002 - 00:01 #19
Prøv også at fjerne den - hvad laver form2?
Avatar billede dkn Nybegynder
31. juli 2002 - 00:09 #20
måske du vil poste dine units?
Avatar billede prodoc Nybegynder
31. juli 2002 - 00:11 #21
Jeg fjernede linien:  MediaPlayer1.Open;
og så virkede det, selv om den begyndte at bombe mig med utallige beskeder med lokationen af de sange i min Listbox :)

Men når jeg så også fjerner linien (ShowMessage...) så begynder den at scrolle  ned igennem min Listbox og tilsidst går programmet kold?

Hvad mener du med at hvad laver form2?
Avatar billede prodoc Nybegynder
31. juli 2002 - 00:13 #22
DKN> ja det tænkte jeg også på...

unit Unit2;

interface

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

type
  TMusikFil = class(TObject)
    Filename: string;
    Filelocation: string;
  end;

type
  TForm2 = class(TForm)
    ListBox1: TListBox;
    MediaPlayer1: TMediaPlayer;
    CoolForm1: TCoolForm;
    Image1: TImage;
    Image2: TImage;
    Image3: TImage;
    Timer1: TTimer;
    Timer2: TTimer;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Animate1: TAnimate;
    Image4: TImage;
    procedure MediaPlayer1Click(Sender: TObject; Button: TMPBtnType;
      var DoDefault: Boolean);
    procedure ListBox1DblClick(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure Image1Click(Sender: TObject);
    procedure Image2Click(Sender: TObject);
    procedure Image3Click(Sender: TObject);
    procedure Image4Click(Sender: TObject);
    procedure Image5Click(Sender: TObject);
    procedure Timer2Timer(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure MediaPlayer1Notify(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

uses Unit1, Unit3;

{$R *.dfm}

procedure TForm2.MediaPlayer1Click(Sender: TObject; Button: TMPBtnType;
  var DoDefault: Boolean);
var
  mp3: TMusikFil;
begin
case button of
    MPlayer.btPlay          : Animate1.Play(0, 100, 0);
    MPlayer.btPause, MPlayer.btStop : Animate1.Stop;
    MPlayer.btNext:
      if ListBox1.ItemIndex <> ListBox1.Items.Count then
      begin
          try
            MediaPlayer1.Stop;
          except
          end;
          ListBox1.ItemIndex := ListBox1.ItemIndex+1;
          MediaPlayer1.AutoEnable := true;
          end;

    MPlayer.btPrev:
      if ListBox1.ItemIndex <> 0 then
      begin
          try
            MediaPlayer1.Stop;
          except
          end;
          ListBox1.ItemIndex := ListBox1.ItemIndex-1;
          ListBox1DblClick(sender);
    end;
  end;
end;

procedure TForm2.ListBox1DblClick(Sender: TObject);
var
  mp3: TMusikFil;
begin
  Image4.visible := false;
  Animate1.visible := true;
  Animate1.Stop;
  Animate1.Play(0, 612, 0);
  timer1.enabled := true;
  image2.visible := true;
  image3.visible := true;
  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;

procedure TForm2.FormShow(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 = 'D:\cat_mp3\';
begin
  MediaPlayer1.Notify := True;
  FindAllFiles(AppendBackslash(Path));
  DoSearch(AppendBackslash(Path));
  Form1.hide;
end;
procedure TForm2.Image1Click(Sender: TObject);
begin
Application.terminate;
end;

procedure TForm2.Image2Click(Sender: TObject);
begin
Image4.Visible := false;
Animate1.visible := true;
Mediaplayer1.Rewind;
Mediaplayer1.play;
Animate1.stop;
Animate1.Play(0, 612, 0);
end;

procedure TForm2.Image3Click(Sender: TObject);
begin
Mediaplayer1.Rewind;
Animate1.Stop;
end;

procedure TForm2.Image4Click(Sender: TObject);
begin
Mediaplayer1.Previous;
end;

procedure TForm2.Image5Click(Sender: TObject);
begin
Animate1.Visible := false;
Image4.visible := true;
end;

procedure TForm2.Timer2Timer(Sender: TObject);
begin
label1.caption := timetostr(time);
end;

procedure TForm2.Timer1Timer(Sender: TObject);
var
  R : Integer;
begin
  R := MediaPlayer1.Position;
  Label2.Caption := Format('%.2d:%.2d', [R div 60000, (R mod 60000) div 1000]);

  R := MediaPlayer1.Length - MediaPlayer1.Position;
  Label3.Caption := Format('%.2d:%.2d', [R div 60000, (R mod 60000) div 1000]);
end;


procedure TForm2.MediaPlayer1Notify(Sender: TObject);
begin
  ListBox1.ItemIndex := ListBox1.ItemIndex + 1;
  MediaPlayer1.FileName := TMusikFil(ListBox1.Items.Objects[ListBox1.ItemIndex]).FileLocation;
  MediaPlayer1.Notify := True;
  MediaPlayer1.Play;
end;

end.
Avatar billede nico26 Nybegynder
31. juli 2002 - 00:29 #23
procedure TForm2.MediaPlayer1Notify(Sender: TObject);
begin
  if MediaPlayer1.Mode = mpStopped then
  begin
    ListBox1.ItemIndex := ListBox1.ItemIndex + 1;
    MediaPlayer1.FileName := TMusikFil(ListBox1.Items.Objects[ListBox1.ItemIndex]).FileLocation;
    MediaPlayer1.Notify := True;
    MediaPlayer1.Play;
  end;
end;
Avatar billede nico26 Nybegynder
31. juli 2002 - 00:34 #24
Der er også lidt i ListBox1DblClick der skal rettes - ellers startes to sange oven i hinanden

procedure TForm2.ListBox1DblClick(Sender: TObject);
var
  mp3: TMusikFil;
begin
  Image4.visible := false;
  Animate1.visible := true;
  Animate1.Stop;
  Animate1.Play(0, 612, 0);
  timer1.enabled := true;
  image2.visible := true;
  image3.visible := true;
  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.Notify := False; //notify skal ikke kaldes - ellers startes to sange
    MediaPlayer1.Stop;
  except
  end;

  MediaPlayer1.Filename := mp3.Filelocation;
  MediaPlayer1.DeviceType := dtAutoSelect;
  MediaPlayer1.Open;
  MediaPlayer1.Notify := True; //sæt notify til igen
  MediaPlayer1.Play;
  caption := 'Spiller nu: ' + mp3.Filename;
end;
Avatar billede prodoc Nybegynder
31. juli 2002 - 00:40 #25
I form2.show; skal der stadigvæk være:
MediaPlayer1.Open;
MediaPlayer1.Notify := True;
for så virker det stadigvæk ikke
og uden Mediaplayer1.notify := true; virker det heller ikke, men uden den kører programmet men den kører bare ikke videre til den næste sang på listen...?
Avatar billede dkn Nybegynder
31. juli 2002 - 00:45 #26
tænkte om man egentlig skal bruge den Notify event...jeg mener hvis man trykker på stop knappen bliver den så kaldt? (har ikke prøvet)

Hvis den gør tror jeg kun der er en anden mulighed...
Det ville være at lave et stort loop. Altså noget som

for i := 0 to mp3sToPlay do
begin
Mediaplayer1.filename := ...
Play...
end;

Og så bare have en masse application.processmessages for at man kan køre med musen.

Du kunne så lave en boolean værdi som hedder Stop: boolean;
På play vil det så se sådan her ud:


for i := 0 to mp3sToPlay do
begin
if stop then break;
Mediaplayer1.filename := ...
Play...
end;

og når de klikker op btStop skal den bare sætte stop til true, og mediaplayer1.stop;

Tænk over det, eller fortæl mig at Notify:stop kun bliver kaldt når en sang er færdig med at spille.

dkn
Avatar billede nico26 Nybegynder
31. juli 2002 - 00:51 #27
Den bliver også kaldt når man trykker på stop-knappen
Avatar billede prodoc Nybegynder
31. juli 2002 - 00:53 #28
er det for sent at fortælle at jeg ikke er den store haj:) forstår desværre ikke hvad du prøver at forklare mig...:)?
Avatar billede dkn Nybegynder
31. juli 2002 - 01:13 #29
hmm okay så tror jeg sku det er den eneste måde - eller hvad siger du nico22 ?
Avatar billede prodoc Nybegynder
31. juli 2002 - 11:33 #30
Kunne man ikke skrive noget med:
when Mediaplayer1.stopped then
ListBox1.ItemIndex := ListBox1.ItemIndex + 1;
Mediaplayer1.play;

heh ja ja jeg ved det godt kan man sikkert ikke :)
Avatar billede prodoc Nybegynder
02. august 2002 - 19:34 #31
Jeg kunne vel ikke sende projektet til en af jer... så var det måske lidt lettere at overskue problemet...og evt løse det......
Avatar billede nico26 Nybegynder
02. august 2002 - 19:48 #32
jo da nico@pc.dk
Avatar billede dkn Nybegynder
02. august 2002 - 21:07 #33
dkn@pc.dk
Avatar billede prodoc Nybegynder
02. august 2002 - 22:20 #34
Jeg prøver lige at sende den til jer begge to, hvis det er muligt kunne I evt kontakte mig via ICQ (9515472) eller dettte spørgsmål.....
Avatar billede nico26 Nybegynder
02. august 2002 - 22:34 #35
hvor finder jeg TCoolForm?
Avatar billede prodoc Nybegynder
02. august 2002 - 22:57 #36
troede jeg havde fjernet det.... :) men her:
http://www.lawrenz.com/coolform/
Avatar billede nico26 Nybegynder
02. august 2002 - 23:42 #37
prodoc>>I din mail skrev du noget om en menu der ikke virkede, men jeg kan ikke se at du har nogen på din form. Er det mig der er blind?
Avatar billede prodoc Nybegynder
03. august 2002 - 00:32 #38
Hvad mener du med at jeg ikke har noget på min form? er der ingen koder...
Avatar billede nico26 Nybegynder
03. august 2002 - 00:43 #39
jo, men ingen menu
Avatar billede prodoc Nybegynder
03. august 2002 - 01:10 #40
form2?
Avatar billede prodoc Nybegynder
03. august 2002 - 01:11 #41
med menu mener jeg at program, eller hvad mener du med menu?
Avatar billede nico26 Nybegynder
03. august 2002 - 01:59 #42
Jeg mente sådan en der i toppen af de fleste programmer - feks. File og Edit
Avatar billede prodoc Nybegynder
03. august 2002 - 03:16 #43
nej nej, det er bare et program som kan afspille sange.... og viser en lille video ved siden af :)
GOD NAT...
Avatar billede prodoc Nybegynder
04. august 2002 - 13:08 #44
Ved I evt hvad problemet kan være det der med "No MCI device open"???
Avatar billede nico26 Nybegynder
04. august 2002 - 15:32 #45
Jeg får ikke den fejl du beskriver.
Avatar billede dkn Nybegynder
04. august 2002 - 15:50 #46
har kigget på det, mp siger tit "No MCI device open".
Jeg syntes mp er noget lort og det er måske på tide at skifte component?
Meget af koden vil stadig kunne bruges, men efter min mening laver mp bare for mange problemmer.
Avatar billede prodoc Nybegynder
04. august 2002 - 18:59 #47
findes der et andet component som man kan indsætte, som virker på samme måde som MediaPlayer...? Hvis du kan få det til at virke med det andet component så er du velkommen til at gøre det.... Men det skal være sådan at programmet kan køre på en anden pc som ikke har Delphi........

(som nævnt i mailen så får den der fixer programmet 100 points) :)

m.v.h. ProDoc
Avatar billede prodoc Nybegynder
04. august 2002 - 19:02 #48
Nico> det gør min computer og de 2 andre computere som jeg har afprøvet..?
Avatar billede nico26 Nybegynder
04. august 2002 - 19:07 #49
Det er måske fordi jeg har ændret koden - ellers ved jeg det ikke.
Avatar billede prodoc Nybegynder
04. august 2002 - 19:10 #50
Nico> okay....? men virker det hele hos dig nu?
Avatar billede nico26 Nybegynder
04. august 2002 - 19:12 #51
Nja, notify-eventet driller en del.
Avatar billede prodoc Nybegynder
04. august 2002 - 19:19 #52
nico> ja ik ;) lige for at gøre det endnu mere besværligt kunne man, lave en slags random play from listbox? - i teorien ikke fordi det er vigtigt nu..?
Avatar billede prodoc Nybegynder
05. august 2002 - 00:57 #53
NICO> tak for det......
desværre DKN men NICO kom først.....sorry.... :)
Men NICO gider du ikke lave et svar...? så du kan få dine velfortjente points.... :)
Avatar billede prodoc Nybegynder
05. august 2002 - 01:20 #54
Forresten lige en sidste ting.....
Er det ikke muligt at gøre det sådan at når man trykker på "Play knappen" foroven (billedet) så afspiller den, den markerede linie i Listboxen og ikke den sidst afspillede linie...?
(For ellers ville Play knappen jo ikke være så meget værd... ;))

m.v.h. ProDoc
Avatar billede nico26 Nybegynder
05. august 2002 - 01:58 #55
Glad for at du kunne bruge det. For at få play knappen til at virke, skal du bare fjene al koden i OnClick - eventet, og kalde PlayIt() i stedet for.

procedure TForm2.Image2Click(Sender: TObject);
begin
  PlayIt;
end;
Avatar billede prodoc Nybegynder
05. august 2002 - 02:07 #56
OKAY tak for det NICO du er en guttermand, kunne synge en sang men det bliver du fri for :)
Her er dine velfortjente points...
Avatar billede prodoc Nybegynder
05. august 2002 - 02:08 #57
Jeg forstår ikke det her pointsystem, jeg kan ikke give over 99 points og når jeg så går det så siger den at jeg ikke har givet nook points for spørgsmålet.....?
Avatar billede prodoc Nybegynder
05. august 2002 - 02:09 #58
Jeg opretter lige et spørgsmål som du lige skal lave et svar i........ 2 sek..
Avatar billede nico26 Nybegynder
05. august 2002 - 02:10 #59
okay
Avatar billede prodoc Nybegynder
05. august 2002 - 02:16 #60
Nå Nico har fået sine points så trækker jeg disse her tilbage....
Avatar billede assassin Juniormester
17. januar 2006 - 13:28 #61
Var det muligt at få vist koden?

Jeg står nemlig overfor det samme problem.
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