procedure TForm1.FormCreate(Sender: TObject);
begin
  MediaPlayer1.Notify := True;
  MediaPlayer1.OnNotify := NotifyProc;
end;procedure TForm1.NotifyProc(Sender: TObject);
begin  Case (Sender As TMediaPlayer).Mode of
    mpNotReady:
    begin
      Memo1.Lines.Add('mpNotReady');
    end;
    mpStopped:
    begin
      Memo1.Lines.Add('mpStopped');
    end;
    mpPlaying:
    begin
      Memo1.Lines.Add('mpPlaying');
    end;
    mpRecording:
    begin
      Memo1.Lines.Add('mpRecording');
    end;
    mpSeeking:
    begin
      Memo1.Lines.Add('mpSeeking');
    end;
    mpPaused:
    begin
      Memo1.Lines.Add('mpPaused');
    end;
    mpOpen:
    begin
      Memo1.Lines.Add('mpOpen');
    end;
  end;  (Sender As TMediaPlayer).Notify := True;
end;当文件播完了以后为什么显示mode是playing?

解决方案 »

  1.   

    当TMediaPlayer的一个媒体控件方法(诸如Back、Close、Eject、Next、Open、Pause、PauseOnly、Play、Previouse、Resume、Rewind、StartRecordint、Step或Stop)执行完毕,就会触发OnNotify。我测试其Click事件及Notify,发现其发送的是执行完毕之前的Mode,并且如果是手动进行点击按钮的话,你会发现OnNotify不会按照我们想像的模式进行,有的时候返回的是两个状态,有的时候返回的是一个状态,但是如果按照里面代码的分析,是正确的。而如果将上面的代码添加到OnClick事件中,便会完全呈现发送的是执行完毕之前的Mode。
      

  2.   

    用notify来解决判断媒体播放完毕的代码在网上一搜一大堆,我觉得很奇怪。既然行不通为什么还这么有生命力?
    正解是什么?难道真的要用定时器解决吗?
      

  3.   

    我觉得应该加一个判断,当其position=length的时候,让其自动的stop应该就可以了。你有没有发现realplay 和windows media player没有开始按钮的,只有开始和暂停共用的,而影音风暴是有的,我想应该是这样实现的。不行,查看源代码,看原因,然后自己写一个事件来完成。也可以利用定时器,真麻烦呀,感觉。
      

  4.   

    可以通过 Postion 和 Length 这两个属性来判断的!