Witam.
Pisze odtwarzacz mp3, i mam problem z wyświetleniem czasu ścieżki MM:SS np. (01:00 / 02:30)
MediaPlayer1.Position - zwraca pozycję odtważanej ścieżki w milisekundach (jako Ineger).
Pytanie, jak taki czas w milisekundach zapisać jako TDateTime?
Trzeba to podzielić przez stałą równą liczbie milisekund w ciągu doby.
Z tego będzie b. mała liczba. Ale jak to zapisać do TDateTime? (Konwersja Float -> TDateTime). Chodzi o to, że z TDateTime'a wyciągnąłbym sekundy i minuty, opcjonalnie godziny.
Do to tego potrzeba aż TDateTime? Samo TTime nie wystarczy? :>
A może po prostu policzyć to prostymi operacjami matematycznymi, takimi jak dzielenie i reszta z dzielenia (liczba minut = liczba sekund / 60).
Operacje arytmetyczne:
var
Pos : Integer;
Len : Integer;
FPos : Float;
begin
Pos:=MediaPlayer1.Position; // np. 90000 milisekund
Len:=MediaPlayer1.Length;
FPos:=(Pos/1000); // Sekundy np. 90
FPos:=(FPos/60); // Minuty 1,5
// Jeśli zapisać w formacie MM:SS trzeba od minut odjąć to co jest po przecinku (1,5-0,5 = 1) do MM, a SS to 0,5 * 60 = 30 do SS.
end;
Nie obejdzie się bez konwertowania na ciąg. Jak konwertowałem i rozbijałem z powrotem to wyskakiwał mi błąd 0,336 is not a valid integer value.
Dlatego wole użyć TDateTime, lub j. w. TTime
Dla formalności: TDateTime = Double, zniknie problem liczb z przecinkiem.
A ten dabel to jest dość precyzyjny by na milisekundy liczyć? Niezbyt mi się podoba takie podejście…
Rafieldex napisał(a)
Nie obejdzie się bez konwertowania na ciąg. Jak konwertowałem i rozbijałem z powrotem to wyskakiwał mi błąd 0,336 is not a valid integer value.
Dlatego wole użyć TDateTime, lub j. w. TTime
A o dzieleniu całkowitym to kolega słyszał? TDateTime również nie bardzo da się tu zastosować.
Mały przykład, jak można to rozwiązać:
procedure TForm1.Timer1Timer(Sender: TObject);
var Len, Pos: Integer;
h, m, s: Byte;
begin
MediaPlayer1.TimeFormat:= tfMilliseconds;
Len:= MediaPlayer1.Length;
Pos:= MediaPlayer1.Position;
h:= Pos div 3600000;
m:= Pos mod 3600000 div 60000;
s:= Pos mod 60000 div 1000;
Label1.Caption:= Format('Elapsed: %d:%.2d:%.2d', [h, m, s]);
h:= (Len - Pos) div 3600000;
m:= (Len - Pos) mod 3600000 div 60000;
s:= (Len - Pos) mod 60000 div 1000;
Label2.Caption:= Format('Remaining: %d:%.2d:%.2d', [h, m, s]);
end;
PS. Czy w Delphi to w ogóle jest TTime? U mnie w "Siódemce" nie ma
No nie, gdzie ja miałem łeb, mod i div. simplex, dzięki ;). Temat uważam za zakończony.