2017-10-09 28 views
1

Delphi7アプリケーションに些細なMP3プレーヤーを埋め込む必要があります。 私は単にディレクトリをスキャンし、すべてのファイルをランダムな順序で再生します。Delphi MediaPlayerが曲を停止したことを通知しました。

私は、Delphi MediaPlayerを使用するソリューションと、PlaySound Windows APIを使用するソリューションの2つのソリューションを見つけました。

ありません。

この問題は、「停止」通知がありません。 このようPlaySoundを使用する:私は(丁寧に)曲の再生を停止したときにお知らせするようにWindowsを依頼する方法を見つけることができませんでした

playsound(pchar(mp3[r].name), 0, SND_ASYNC or SND_FILENAME); 

。デルファイのMediaPlayerを使用して

、インターネットは提案に満ちている/ここのように、一方から他方を貼り付けコピー:

http://www.swissdelphicenter.ch/en/showcode.php?id=689

http://delphi.cjcsoft.net/viewthread.php?tid=44448

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: {do something here}; 
    end; 
    //must set to true to enable next-time notification 
    Notify := True; 
    end; 
end; 
{ 
    NOTE that the Notify property resets back to False when a 
    notify event is triggered, so inorder for you to recieve 
    further notify events, you have to set it back to True as in the code. 
    for the MODES available, see the helpfile for MediaPlayer.Mode; 
} 

私の問題は、私は入手できますかということですNotifyValue == nvSuccessfull曲が終了しても、曲を開始するときには、私はそれに頼ることができません。 さらに、私は見つけたすべての例に従ってmpStoppedになるはずの "モード"プロパティの状態の変更を受け取ったことはありません。

あり、ここで

How can I repeat a song?

同様の問題があるが、言ったように、私は開始と停止を区別するための方法なしに、二回nvSuccessfullを受け、ので、それは動作しません。

最後に、このアプリケーションはXPからWin10まで動作するはずです。そのため、私はWinXPでDelphi7を使って開発しています。

ありがとう、このポストの長さは申し訳ありませんが、私は本当に助けを求める前に多くのソリューションを試しました。

+0

最も簡単なのは 'mciSendString'です。目に見えないウィンドウ( 'AllocateHWnd'による)と' MM_MCINOTIFY'メッセージに対する_listen_を作成します。 – Victoria

+0

ありがとうございます。一般に、Windows APIを使って直接プログラミングするのは私の「パン&バター」ではありませんが、MSDNのMM_MCINOTIFYについて読むと、Delphiが「NotifyValue」プロパティにマップするように見えますので、 2つの間で: – ZioBit

+0

@Victoria - 面白い解決策を聞いていますが、APIを使いVCLに頼っていないのであれば、代わりにスレッドを使うだけでいいですか?私は同じ問題を抱えていました(異なるアプリケーションですが、同じ問題です)。 Windowsのオリジナルバージョン(と私はここでXP以前のことを話しています)は、通知モードでは堅実でした。後のものはそうではなかった。だから私は良い解決策についても興味があります。 – Dsm

答えて

2

例えば、再生のための新しいファイルをロードするときに、OnNotifyイベントとMP(以下、MPと呼ばれる)TMediaPlayer

まずセットアップのEndPosPositionプロパティを使用することができ、検出しTimeFormatを選択するには

MediaPlayer1.Wait := False; 
MediaPlayer1.Notify := True; 
MediaPlayer1.TimeFormat := tfFrames; 
MediaPlayer1.OnNotify := NotifyProc; 

あなたが演奏のためにファイルを読み込む

は、 EndPosプロパティを設定

MediaPlayer1.FileName := OpenDialog1.Files[NextMedia]; 
MediaPlayer1.Open; 
MediaPlayer1.EndPos := MediaPlayer1.Length; 
MediaPlayer1.Play; 

また、新しい曲に変更するMP.Mode = mpStoppedモードを使用するようにしようと最後にコメントOnNotify()手順

procedure TForm1.NotifyProc(Sender: TObject); 
var 
    mp: TMediaPlayer; 
begin 
    mp:= Sender as TMediaPlayer; 

    if not (mp.NotifyValue = TMPNotifyValues.nvSuccessful) then Exit; 

    if mp.Position >= mp.EndPos then 
    begin 
    // Select next file to play 
    NextMedia := (NextMedia + 1) mod OpenDialog1.Files.Count; 
    mp.FileName := OpenDialog1.Files[NextMedia]; 
    mp.Open; 
    mp.EndPos := mp.Length; 
    mp.Position := 0; 
    mp.Play; 
    // Set Notify, important 
    mp.Notify := True; 
    end; 
end; 

。ボタンが操作されると、モードが変更されます。ユーザーが[停止]ボタンを押すと、mpStoppedが表示されます。曲を変更して再生を開始するのは、ユーザーが期待したものではない可能性があります。

+0

ソリューションをありがとうございました(私は24時間以内に試してみます)とmpStoppedの動作の説明、私は認識していませんでしたそれの。実際には、私はユーザーインターフェイスを使用していない、私はコントロールを隠しておく、それは単なるmp3ファイルを再生する方法でした。 – ZioBit

+0

それは動作します、ありがとう! – ZioBit

関連する問題