Ver Mensaje Individual
  #3  
Antiguo 07-09-2005
Avatar de jmariano
jmariano jmariano is offline
Miembro
 
Registrado: jul 2005
Posts: 376
Reputación: 21
jmariano Va por buen camino
Creo que no estás comprendiendo bien el evento "OnNotify" del MediaPlayer. Este evento de notificación se produce cuando es ejecutado un comando MCI para indicar el éxito o fracaso de la operación (el resultado de la operación es almacenado en la propiedad "NotifyValue"). Es decir, cuando ejecutamos un comando MCI (reproducir un archivo o CD, pararlo, etc.) se genera un evento "OnNotify" y el resultado de la operación es almacenado en "NotifyValue" (aunque el componente te da la posibilidad de que no se produzca el evento poniendo la propiedad "Notify" a "False").

MediaPlayer también te devuelve el estado actual de la reproducción a través de la propiedad "Mode", que es la que estás usando en el evento "OnNotify", pero, teniendo en cuenta lo que te expliqué antes, lo que te está devolviendo en realidad, cuando se termina de reproducir el archivo, es que el comando para reproducir se ejecutó con éxito (por eso siempre te muestra "Tocando" y "Playing").

Como lo único que te interesa saber es el "estado" de la reproducción, lo que yo haría es colocar un componente Timer y comprobar, dentro de su evento "OnTimer", el estado de la reproducción a través de la propiedad anterior "Mode" (es decir, la operación del evento "OnNotify" la pasamos al evento "OnTimer"):

Código Delphi [-]
procedure TForm1.Timer1Timer(Sender: TObject);
const
  ModeStr: array[TMPModes] of string = ('Not ready', 'Stopped',
    'Playing', 'Recording', 'Seeking', 'Paused', 'Open');
begin
  with MediaPlayer1 do
  begin
    if modestr[Mode] = 'Playing' then
    begin
      Form1.Caption := ModeStr[Mode];
      edit1.text:= 'Tocando';
    end;

    if ModeStr[Mode] = 'Stopped' then
    begin
      Form1.Caption := ModeStr[Mode];
      edit1.text:= 'detenido';
    end;
  end;
end;

(Observa que ya no hace falta poner "Notify" a "True" porque no necesitamos que se ejecute el evento "OnNotify")

Para que el Timer no esté permanentemente ejecutándose podemos desactivarlo una vez que concluya la reproducción y volverlo activar cuando se vuelva a reproducir el archivo (a través de la propiedad "Enabled"). Otra cosa a tener en cuenta es que, por defecto, el Timer nos avisará cada segundo del estado de la reproducción, por lo que puede haber un desfase desde que empieza o termina el archivo hasta que nos informa del estado. Para solucionar este desfase podríamos poner la propiedad "Interval" a 100, en vez de a 1000, lo cual da buen resultado (aunque todo es cuestión de probar).

Saludos!
Responder Con Cita