Zeitanzeige Formelproblem

Anfängerfragen zum Programmieren mit PureBasic.
Prodotyp
Beiträge: 5
Registriert: 01.09.2005 14:13

Zeitanzeige Formelproblem

Beitrag von Prodotyp »

Vorhaben: eine Zeitanzeige im Stil 0:00:00 (h:min:sekunden)
Fenstermode
Bsp. Länge 3.50 min

leider komme ich nicht auf die korrekte Handhabung einer formel, geschweige denn, so das sich die Zahlen in Bewegung versetzen.

Im Codearchiv bin ich irgendwie nicht so richtig fündig geworden.
Für ein einfaches Beispiel wäre ich ewig dankbar, da mit timersachen
ich mich leider noch nicht so intensiv beschäftigt habe.


Danke
Benutzeravatar
Ghosty1967
Beiträge: 205
Registriert: 29.08.2005 13:56
Computerausstattung: Intel i7, 128GB Ram, Win10 Ultimate, PB6.00 Alpha 3
Wohnort: Köln

Beitrag von Ghosty1967 »

Was möchtest Du denn genau...

Wenn Du nur die Zeit im Format "0:00:00" angezeigt haben möchtest, geht das mit

Code: Alles auswählen

FormatDate("%hh:%ii:%ss",Date()) ;Anzeigebsp. 06:58:12
FormatDate("%h:%ii:%ss",Date()) ;Anzeigebsp. 6:58:12
Irretiert hat mich am Anfang der Platzhalter "%ii", welcher für die Minuten steht, da
"%mm" schon als Platzhalter für die Monate verwendet wird.
Möchtest Du jedoch eine analoge Zeitanzeige in das dezimale Format umwandeln, wie es z.B.
bei den meisten Zeiterfassungssystemen in Betrieben verwendet wird, dann wird das ganze
soweit ich weis etwas komplizierter.
Ich gehe dann den Weg, das ich erst einmal die Differenz der Zeiten mit folgender Procedure
von "crossroads" (*dank*) in Sekunden errechne...

Code: Alles auswählen

Procedure.l PBDateDiff (modus$, Datum1$, Datum2$) 
  d1.l = ParseDate("%dd.%mm.%yyyy %hh:%ii:%ss", Datum1$) 
  d2.l = ParseDate("%dd.%mm.%yyyy %hh:%ii:%ss", Datum2$) 
  If d1 < 0 Or d2 < 0:ProcedureReturn -1:EndIf ; error! 
  diff.l = Abs(d2 - d1) 
  Select modus$ 
    Case "s":ProcedureReturn diff  ; seconds 
    Case "m":ProcedureReturn Int(diff / 60) ; minutes 
    Case "h":ProcedureReturn Int(diff / (60 * 60)) ; hours 
    Case "d":ProcedureReturn Int(diff / (60 * 60 * 24)) ; days 
    Case "w":ProcedureReturn Int(diff / (60 * 60 * 24 * 7)) ; weeks 
    Default:ProcedureReturn -1 ; error! 
  EndSelect 
EndProcedure
Wenn Du nun hingehst und das Ergebnis in volle Stunden und Minuten zurückrechnest, bist Du am Ziel.

Beispiel:

Code: Alles auswählen

startzeit$="13:12:25"
endzeit$="17:02:25"

vergangeneSekunden=PBDateDiff("s", startzeit$, endzeit$)
stunden=Int(vergangeneSekunden/3600): vergangeneSekunden-(stunden*3600)
minuten=Int(vergangeneSekunden/60): vergangeneSekunden-(minuten*60)
sekunden=vergangeneSekunden
;Variante1
ausgabe$=Right("00"+Str(stunden),2)+"."+Right("00"+Str(minuten),2)+":"+Right("00"+Str(sekunden),2)
;Variante2
ausgabe$=Right("00"+Str(stunden),2)+"."+Right("00"+Str(minuten),2)

;ERGEBIS1 = "3.50:00"
;ERGEBIS2 = "3.50"
Wenn Du die Ausgeb im dezimalen Format... (00:15:00 = 0.25 Std) haben möchtest, mußt Du
natürlich noch hingehen in die werte mit (wert/60)*100 umrechnen. ;)

Ich hoffe, ich konnte Dir helfen und habe nicht zuviele Fehler, da ich selber noch
Anfänger bin :)
Prodotyp
Beiträge: 5
Registriert: 01.09.2005 14:13

oh oh oh

Beitrag von Prodotyp »

ein Musikstück (extension : *.dfl)

nun wollte ich gerne eine Zeitanzeige integrieren
das Musikstück ist 230 Sekunden lang - sprich 3min 50 Sekunden

wenn man play startet spielt es das Musikstück ab und die Zeit soll von
0:00:00 nach 0:03:50 im Sekundentakt laufen
irgendwie stelle ich mich zu doof an :cry:
Benutzeravatar
freedimension
Admin
Beiträge: 1987
Registriert: 08.09.2004 13:19
Wohnort: Ludwigsburg
Kontaktdaten:

Beitrag von freedimension »

Ungefähr so?

Code: Alles auswählen

For s = 0 To 230
  min.l = s / 60
  sec.l = s % 60
  Debug RSet(Str(min), 2, "0") + ":" + RSet(Str(sec), 2, "0")
  Delay(100)
Next
Debugger muss natürlich an sein


Da ich weiß, dass die Frage dann auch gleich gekommen wäre ;)
Mit Stunde geht dass dann so:

Code: Alles auswählen

For s = 0 To 5230
  std.l = s / 3600
  min.l = (s % 3600)/ 60
  sec.l = s % 60
  Debug RSet(Str(std), 2, "0") + ":" + RSet(Str(min), 2, "0") + ":" + RSet(Str(sec), 2, "0")
Next
Beginne jeden Tag als ob es Absicht wäre!
Bild
BILDblog
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

wie wärs mit der klassischen lösung?

Code: Alles auswählen

timer = ElapsedMilliseconds() +1000   ; timer Init

; Hauptschleife Beginn

If ElapsedMilliseconds() >= timer
    timer + 1000
    sec +1
    If sec > 59
        sec = 0
        min +1
        If min > 59
            min = 0
            std +1
        EndIf
    EndIf
EndIf

time$ = Right("00"+Str(std),3)+":"+Right("0"+Str(min),2)+":"+Right("0"+Str(sec),2)

; Hauptschleife Ende
...und bevor jetzt jemand über die verwendung von elapsedmilli mosert:

durch die erhöhung von timer um 1000 anstatt setzen auf aktuelle elapsedmilli
werden unebenheiten ausgebügelt. ;)
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Prodotyp
Beiträge: 5
Registriert: 01.09.2005 14:13

Beitrag von Prodotyp »

Danke für die Hilfe
Benutzeravatar
freedimension
Admin
Beiträge: 1987
Registriert: 08.09.2004 13:19
Wohnort: Ludwigsburg
Kontaktdaten:

Beitrag von freedimension »

Mir gefällt das übrigens, dass die Leute sich in letzter Zeit immer öfter für die erhaltene Hilfe abschließend bedanken :allright: Wollte ich nurmal so gesagt haben, selbstverständlich ist das nämlich leider nicht mehr.
Beginne jeden Tag als ob es Absicht wäre!
Bild
BILDblog
Antworten