![]() |
Testprog zum feststellen wann ein Musikstück im TMediaPlayer zu Ende ist
Liste der Anhänge anzeigen (Anzahl: 1)
Testprog zum feststellen wann ein Musikstück im TMediaPlayer zu Ende ist.
Hierfür habe ich ein kleines Prog geschrieben, eigendlich recht simpel. Ich frage über einen TTimer die MediaPlayer1.Position ab und wenn diese >= MediaPlayer1.Length ist wird der etwas gemacht.. Doch hier quitscht es; die Bedingung ist erfüllt und springt in den Proc-Teil hier sollte auch der TTimer.Enabled := False; sein. Doch scheint der weiterzulaufen und immer wieder in dem Procteil landet so das eine Endlosschleife entsteht. Mir gehen die Optionen aus was hier falsch läuft. Hoffentlich kann einer von euch mich in die richtige Richtung schubsen. Oder haut eine bessere Idee wie ich feststelle wann das Musikstück im TMediaPlayer zu Ende ist. ## Auszug... gesamter Code in der ANlage procedure TfrmMain.TimerNotifyTimer(Sender: TObject); const EndTolerance = 1000; // 1 Sekunde Toleranz begin lbl_Pos.Caption := IntToStr(MediaPlayer1.Position); if MediaPlayer1.Position >= (MediaPlayer1.Length-EndTolerance) then begin MediaPlayer1.Stop; ShowMessage('Das Musikstück ist zu Ende.'); MediaPlayer1.Notify := False; // Timer explizit freigeben und deaktivieren TimerNotify.Enabled := False; end else begin MediaPlayer1.Notify := True; end; end; |
AW: Testprog zum feststellen wann ein Musikstück im TMediaPlayer zu Ende ist
Eine Möglichkeit wäre das
Delphi-Quellcode:
vor das
TimerNotify.Enabled := False;
Delphi-Quellcode:
zu setzen.
MediaPlayer1.Stop;
ShowMessage('Das Musikstück ist zu Ende.'); ich weiß zwar nicht, welches Interval du im Timer gesetzt hast, aber der läuft halt immer weiter, auch wenn das ShowMessage angezeigt wird. Tritt nun der nächste Interval ein bevor du den Dialog bestätigt hat, landet er zwangläufig wieder in der OnTimer-Methode. Dialoge in einem Timerevent sind immer so ein Sache, das der Timer immer weiterläuft, wärend jedoch die OnTimer-Procedure auf eine Bestätigen des Dialogs warten könnte. Wird der Timer jedoch vor dem Dialog angehalten, so spielt das im Grunde keine Rolle mehr. |
AW: Testprog zum feststellen wann ein Musikstück im TMediaPlayer zu Ende ist
Not sure if i do understand the question at all, but ...
You are disabling MediaPlayer1.Notify, while it might be way better keep it true and enabled it every time MediaPlayer1Notify being called. Also you are checking the wrong state in MediaPlayer1Notify, Notify and OnNotify are associated with ![]() Either i don't know how to find/browse documentation or TMediaPlayer.NotifyValue is missing stuff ![]() if you need to check if the audio play is finished then check for nvSuccessful like this
Delphi-Quellcode:
And that is it, don't mess with playing and timer for checking it is useless, and as i commented above for pause and continue you need to store the status from different place and distinguish Play vs Pause.
procedure TfrmMain.MediaPlayer1Notify(Sender: TObject);
var sModeString: string; begin // Ьberprьfen des aktuellen Modes und in einen lesbaren String umwandeln { case MediaPlayer1.Mode of mpNotReady: sModeString := 'Not Ready'; mpStopped: sModeString := 'Stopped'; mpPlaying: sModeString := 'Playing'; mpRecording: sModeString := 'Recording'; mpSeeking: sModeString := 'Seeking'; mpPaused: sModeString := 'Paused'; mpOpen: sModeString := 'Open'; else sModeString := 'Unknown'; end;} MediaPlayer1.Notify := True; if MediaPlayer1.NotifyValue = nvSuccessful then begin // here check if the the mode was paused or not , the following might be wrong ! and should store the state from OnClick case MediaPlayer1.Mode of mpPaused: MediaPlayer1.Pause; else MediaPlayer1.Play; end; end; end; {------------------------------------------------------- Procedure: TimerNotifyTimer Arguments: Sender: TObject Result: None ### ChangeLog 09.10.2024 ------------------------------------------------------} procedure TfrmMain.TimerNotifyTimer(Sender: TObject); const EndTolerance = 1000; // 1 Sekunde Toleranz begin { lbl_Pos.Caption := IntToStr(MediaPlayer1.Position); if MediaPlayer1.Position >= (MediaPlayer1.Length-EndTolerance) then begin MediaPlayer1.Stop; ShowMessage('Das Musikstьck ist zu Ende.'); MediaPlayer1.Notify := False; MediaPlayer1.Close; // Timer explizit freigeben und deaktivieren TimerNotify.Enabled := False; end else begin MediaPlayer1.Notify := True; end; } end; Hope that helps, for me question is still not clear ! |
AW: Testprog zum feststellen wann ein Musikstück im TMediaPlayer zu Ende ist
Danke Problem ist gelöst. Es lag tatsächlich an dem Showmessage.
Werde mich mit dem Schleifenthema wohl noch beschäftigen müssen :) Danke nochmal an alle. Dirk |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:04 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz