Tutorial: Delphi Mediaplayer for Dummies

          
Version 0.2
  


Dieses kleine Tutorial soll einem kurz zeigen, wie man den Mediaplayer in seinem Programm einsetzen kann.

Kapitel 2: Eine eigene Playliste

Damit unser Programm in der Lage ist, mehr als ein Lied abzuspielen, werden wir ihm eine einfache Playliste verpassen.

Dafür werden wir eine TStringList verwenden, ein von Delphi bereitgestelltes Objekt mit dem leicht lange Listen verwalten kann.

var PlayList: TStringList;

Da es sich um eine Delphi-Klasse handelt, müssen wir die Liste selber erstellen und selber wieder freigeben.

PlayList:= TStringList.Create; // instanz der playlist erzeugen
PlayList.Free; // instanz der playlist wieder freigeben

Dafür werden wir die beiden Ereignis-prozeduren OnCreate und OnDestroy unseres Formulars verwenden:

wir machen je einen Doppelklick auf das OnCreate und OnDestroy des Formulars im Objektinspektor.

Delphi erzeugt uns nun automatisch den Code-Header für die beiden Prozeduren und weist diese den jeweiligen ereignisen zu.

Nun werden wir im OnCreate den Code für die Erstellung und ins OnDestroy den Code für die Freigabe einfügen, sowie bei den globalen Variablen die PlayList deklarieren.

Anschliessend sollte unser Code so aussehen:

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    MediaPlayer1: TMediaPlayer;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  playList: TStringList; // <- globale Variable einrichten

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  mediaplayer1.FileName := 'C:\Inetpub\wwwroot\dirty.mp3';
  mediaplayer1.Open;
  mediaplayer1.play;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
   playList := TStringList.Create; // objekt erzeugen
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
   playList.Free; // objekt freigeben
end;

end.

Nun brauchen wir noch eine Prozedur AddToPlaylist, mit der wir der Playliste neue Einträge hinzufügen können:

 
Procedure TForm1.AddToPlayList(s:string);
begin
   playList.Add(s);
end;

Wir werden diese Prozedur der Form1 zuweisen, damit wir später reibungslos auf deren Mitglieder zugreifen können, weswegen wir im Interface-Teil diese Prozedur bei der Form bekannt machen:

  // ...
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    Procedure AddToPlayList(s:string);    
  end;



Soweit so gut. Die Dateinamen der Lieder würden nun mit dieser Prozedur an unsere Playliste angehängt werden.

Nun müssen wir uns noch um folgende Punkte kümmern:

  • Playliste grafisch darstellen
  • Playlisteintrag abspielen
  • Playlisteinträge hinzufügen

Zur grafischen Darstellung werden wir eine Listbox verwenden.

Anklicken und auf unser Formular klicken, Delphi fügt die Listbox dort für uns ein.
Wir werden noch den button etwas wegschieben, und die Elemente in ihrer Grösse und Position verschieben. Danach sollte es ca. so aussehen:


Wir fügen unserer AddToPlaylist-Prozedur noch einen Eintrag hinzu, damit man die Playlist-Einträge auch sehen kann:

 
Procedure TForm1.AddToPlayList(s:string);
begin
   playList.Add(s);
   ListBox1.Items.Add(s);
end;

Nun kümmern wir uns um das abspielen eines Playlist-Eintrag.


Wir verwenden hierfür das OnClick-Ereignis der Listbox.
Also in den Objektinspektor, Listbox1 auswählen, und einen Doppelklick auf OnClick machen. Zusätzlich werden wir gleich noch eine Prozedur PlayFile einrichten:

procedure TForm1.PlayFile(s:string);
begin
   mediaplayer1.Close;
   mediaplayer1.FileName := s;
   mediaplayer1.Open;
   mediaplayer1.play;
end;

procedure TForm1.ListBox1Click(Sender: TObject);
var i : integer;
begin
  for i := 0 to listbox1.Count - 1 do
    if listbox1.Selected[i] then break;
  { nun haben wir in i die nummer der selektierten Zeile
    da Listbox und Playlist eine identische Reihe der Einträge und gleiche Sortierung
    vorweisen, können wir mit dem erhaltenen index den richtigen Eintrag der Playlist
    auslesen. }
  if fileexists(Playlist.Strings[i]) then PlayFile(Playlist.Strings[i]);
end;

Die Prozedur PlayFile ist wieder Mitglied von TFOrm1. Was heisst das für uns ?

Richtig, bei den Public-Deklarationen muss die Prozedur wieder bekannt gemacht werden. Wir kopieren also das procedure TForm1.PlayFile(s :string); 
in den public teil, und löschen das TForm1. dort raus, damit es so aussieht:

  public
    { Public-Deklarationen }
    Procedure AddToPlayList(s:string);
    procedure PlayFile(s:string);

Sehr gut, unser MP3-Player Gerüst ist nun fertig und bereit, auf klick mp3s abzuspielen !
Wir müssen ihm nur noch die Möglichkeit geben, Mp3s hinzuzufügen.

Ich werde hierfür Drag & Drop verwenden. Man kann es aber genau sogut mit einem TOpenDialog oder so machen, oder mit einer ShellListBox usw...

Um das Drag & Drop zu verwenden, benutze ich diese Prozedur, die ich mal im swissdelphicenter.ch gefunden habe:

Procedure TForm1.WMDropFiles (Var aMsg: tMessage);
Var
  Idx, Size, FileCount: Integer;
  Filename: pChar;
Begin
  Inherited;
  FileCount := DragQueryFile (aMsg.WParam, $FFFFFFFF, nil, 255);
  For Idx := 0 To FileCount -1 Do Begin
    Size := DragQueryFile (aMsg.WParam, Idx, nil, 0) + 1;
    Filename := StrAlloc (Size);
    If DragQueryFile (aMsg.WParam, Idx, Filename, Size) = 1 Then  { nothing }
    else  AddToPlayList (pChar (Filename)); // hier wird das jeweilige file unserer Prozedur AddToPlaylist überwiesen.
    StrDispose (Filename);
  End;
  DragFinish (aMsg.WParam);
End;

damit wir diese Prozedur nutzen können, sind noch ein paar kleine änderungen notwendig, wir müssen

  • die unit ShellApi bei der uses Klausel mitangeben
  • die Prozedur WMDropFiles bei TForm1 bekanntmachen und einen Handler für die Windowsmessage WM_DROPFILES einrichten
  • Beim Start unseres Programmes bekanntgeben, dass es Drag & Drop Messages akzeptiert.
hört sich schwieriger an als es ist:
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, MPlayer, ShellApi;

  public
    { Public-Deklarationen }
    Procedure AddToPlayList(s:string);
    procedure PlayFile(s:string);
    Procedure WMDropFiles (Var aMsg: tMessage);  message WM_DROPFILES;
  end;

procedure TForm1.FormCreate(Sender: TObject);
begin
   DragAcceptFiles (Handle, True);   // drag und drop akzeptieren
   playList := TStringList.Create;
end;

 
das war es schon, wir können das programm nun starten und ein paar mp3s auf unser formular ziehen:



ein klick auf einen Eintrag und er spielt ;-)

hier nochmal der komplette quellcode für diejenigen, die nicht mitgekommen sind:

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    MediaPlayer1: TMediaPlayer;
    Button1: TButton;
    ListBox1: TListBox;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure ListBox1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    Procedure AddToPlayList(s:string);
    procedure PlayFile(s:string);
    Procedure WMDropFiles (Var aMsg: tMessage);  message WM_DROPFILES;
  end;

var
  Form1: TForm1;
  playList: TStringList;

implementation

{$R *.dfm}

Procedure TForm1.WMDropFiles (Var aMsg: tMessage);
Var
  Idx, Size, FileCount: Integer;
  Filename: pChar;
Begin
  Inherited;
  FileCount := DragQueryFile (aMsg.WParam, $FFFFFFFF, nil, 255);
  For Idx := 0 To FileCount -1 Do Begin
    Size := DragQueryFile (aMsg.WParam, Idx, nil, 0) + 1;
    Filename := StrAlloc (Size);
    If DragQueryFile (aMsg.WParam, Idx, Filename, Size) = 1 Then  { nothing }
    else  AddToPlayList (pChar (Filename));
    StrDispose (Filename);
  End;
  DragFinish (aMsg.WParam);
End;

Procedure TForm1.AddToPlayList(s:string);
begin
   playList.Add(s);
   ListBox1.Items.Add(s);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  mediaplayer1.FileName := 'C:\Inetpub\wwwroot\dirty.mp3';
  mediaplayer1.Open;
  mediaplayer1.play;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
   DragAcceptFiles (Handle, True);   // drag und drop akzeptieren
   playList := TStringList.Create;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
   playList.Free;
end;

procedure TForm1.PlayFile(s:string);
begin
   mediaplayer1.Close;
   mediaplayer1.FileName := s;
   mediaplayer1.Open;
   mediaplayer1.play;
end;

procedure TForm1.ListBox1Click(Sender: TObject);
var i : integer;
begin
  for i := 0 to listbox1.Count - 1 do
    if listbox1.Selected[i] then break;
  { nun haben wir in i die nummer der selektierten Zeile
    da Listbox und Playlist eine identische Reihe der Einträge und gleiche Sortierung
    vorweisen, können wir mit dem erhaltenen index den richtigen Eintrag der Playlist
    auslesen. }
  if fileexists(Playlist.Strings[i]) then PlayFile(Playlist.Strings[i]);
end;

end.

weiter zu kapitel 3: Herausfinden, wann ein Lied zu Ende ist

zurück zum start