Seite 1 von 1

Zeitanzeige Formelproblem

Verfasst: 04.11.2005 04:15
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

Verfasst: 04.11.2005 08:25
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 :)

oh oh oh

Verfasst: 04.11.2005 22:27
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:

Verfasst: 04.11.2005 22:37
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

Verfasst: 06.11.2005 09:04
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. ;)

Verfasst: 09.11.2005 23:27
von Prodotyp
Danke für die Hilfe

Verfasst: 09.11.2005 23:32
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.