Du hast doch nicht überall die 1000 geändert?
Der Faktor von 1000 ist schon richtig, nur das der Timer öffters die Position abfragen sollte.
Ein Timer mit 1 Sekunde Interval läuft erfahrungsgemäß nicht genau 1 Sekunde, so das ab und zu mal eine untergeht. Es ist schwer zwei Timer (Timer1 und MediaPlayer1) zu syncronisieren, so das sie gleich laufen.
Delphi-Quellcode:
{Timer1.Interval := 300;}
{TrackBar1.Max := MediaPlayer1.Length div 1000;}
Procedure TForm1.Timer1Timer(Sender: TObject);
Begin
(* TrackBar-Position an die MediaPlayer-Position anpassen *)
TrackBar1.Position := MediaPlayer1.Position div 1000;
End;
Procedure TForm1.TrackBar1Change(Sender: TObject);
Var TBP, MPP: Integer;
Begin
TBP := TrackBar1.Position;
MPP := MediaPlayer1.Position div 1000;
(* MediaPlayer-Position an die TrackBar-Position anpassen, *
* wenn der Unterschied grösser als 2 Sekunden ist *)
If ABS(TBP - MPP) > 2 Then MediaPlayer1.Position := TBP * 1000;
End;
Hoffe dich stört es nicht, das hier alles abgerundet (DIV) wird, ist halt die einfachste und schnellste Methode.
In TrackBar1Change wird der neue Wert nur bei grösseren Änderungen übernommen, so das nicht bei jeder Änderung von TrackBar1.Position der "Film" ins stocken kommt.
Man könnte aber auch abfragen ob TrackBar1.Position im Timer1-Ereignis (Timer1Timer) gesetzt wurde, um in diesem Fall MediaPlayer1.Position nicht zu ändern. (der Aufwand dafür das lohnt sich aber nicht)
Der Umrechnungsfaktor von 1000 stimmt nur, wenn MediaPlayer1.TimeFormat = tfMilliseconds ist. (das ist der Standard)
Bei MediaPlayer1.TimeFormat = tfHMS ist
Stunden = MediaPlayer1.Position and $FF,
Minuten = (MediaPlayer1.Position shr 8 ) and $FF,
Sekunden = (MediaPlayer1.Position shr 16) and $FF.
Die
OH sagt jedoch:
Zitat:
Die möglichen Formate werden nicht von allen Multimedia-Geräten unterstützt.
tfMilliseconds wird, so weit ich weis, von allen Geräten unterstützt.