Zeiterfassung Topic is solved

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

Filzfrosch
Posts: 42
Joined: 18 Feb 2017, 08:39
Location: Hamburg / Germany

Zeiterfassung

Post by Filzfrosch » 23 Dec 2020, 10:45

Moin,

ich brauche eine Art Zeiterfassung.
Also eine Art Timer, der auf Knopfdruck los zählt und alle 15-Min eine Variable (Zeiteinheiten/ZE) um den Wert +1 hochzählt.

Einen rudimentären Timer habe ich:

Code: Select all

Gui, Margin, 10,10
Gui,Font,s18 bold
Gui,Add,Text,x340 y10 w150 center vSEC,0
Gui,Font,s10 normal
Gui,Add,Button,xp y+20 wp vStart_Stop gStart_Stop, START / STOP
Gui,Add,Button,xp y+10 wp gCLEAR,CLEAR
Gui,Add,Text,x340 y10 w150 center vSEC,0
Gui Show, w500 h300, Stoppuhr
return

Start_Stop:
IF ON=0
    {
    START:=A_TickCount
    SetTimer,Timer,ON
    ON=1
    }
    else
    {
    SetTimer,Timer,OFF
    ON=0
    }
return

CLEAR:
IF ON=1
    return
    else
    GuiControl,,SEC,0
return

TIMER:
SetFormat,Float,0.2
Zeit:=(A_TickCount-START)/1000
SetFormat,Float,0.0
Zeit+=0
GuiControl,,SEC,% Zeit
return
Allerdings bräuchte ich Hilfe bei folgenden Dingen:

- Der Timer zeigt die Bildschirmanzeige in Sekunden an. Wie kann ich den formatieren, dass anstatt z.B. 3660 Sekunden dann 01:01:00 (hh:mm:ss) angezeigt wird? Ich kapiere bisher noch nicht, wo ich den Wert abgreifen und umformatieren kann, bzw. den Timer gleich dazu bringe in der hh:mm:ss Formatierung zu arbeiten.

- Wie kann ich dem Timer beibringen zu triggern, dass alle 15-Minuten eine Variable (ZE) um der Wert 1 erhöht werden soll?

- Wie schaffe ich es, dass mir nicht nur der aktuell laufende Gesamt-Timer angezeigt wird, sondern gleichzeitig auch noch die verbleibende Zeit der aktuell laufenden Zeiteinheit?
Beispiel: Der Gesamttimer läuft seit 31 Minuten und 20 Sekunden.
Ich möchte noch eine zweite Anzeige, die zusätzlich dann in diesem Fall 13 Minute und 40 Sekunden anzeigt, also die restliche Zeit der aktuellen Zeiteinheit.

- Wie baue ich in den Timer eine Pause-Funktion ein? Im Beispiel oben wird der Timer bei Stop natürlich wieder auf 0 gesetzt. Manchmal ist es aber nötig, nur zu pausieren.


Ich habe lange nichts mehr mit AHK gemacht, im Moment fällt mir das "wieder reindenken" ein wenig schwer, daher wäre es klasse, wenn mir jemand auf die Sprünge helfen könnte ...

Beste Grüße
just me
Posts: 7751
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Zeiterfassung

Post by just me » 23 Dec 2020, 12:07

Moin,

mal als kleiner weihnachtlicher Anschub:

Code: Select all

#NoEnv
SetBatchLines, -1
; Standartwerte
DefGZ := "20200101000000"
DefRZ := "20200101001500"
Gui, Margin, 10, 10
Gui, Font, s10 normal
Gui, Add, Text, xm w200 Center, Gesamtzeit
Gui, Font, s18 bold
Gui, Add, Text, xm y+2 wp Center vGZ
Gui, Font, s10 normal
Gui, Add, Text, xm wp Center, Zeiteinheiten
Gui, Font, s18 bold
Gui, Add, Text, xm y+2 wp Center vZE
Gui, Font, s10 normal
Gui, Add, Text, xm wp Center, Restzeit in Zeiteinheit
Gui, Font, s18 bold
Gui, Add, Text, xm y+2 wp Center vRZ
Gui, Font, s10 normal
Gui, Add, Button, xm wp vStart_Stop gStartStop, Start
Gui, Add, Button, xm wp vBtnClear gClear, Clear
Gui, Show, , Stoppuhr
Return

GuiClose:
ExitApp

StartStop:
   GuiControlGet, Aktion, , %A_GuiControl%
   If (Aktion = "Start")
   {
      GuiControl, ,  %A_GuiControl%, Stop
      GuiControl, Disable, BtnClear
      GZ := DefGZ
      FormatTime, FGZ, %GZ%, HH:mm:ss
      GuiControl, , GZ, %FGZ%
      ZE := 0
      GuiControl, , ZE, %ZE%
      RZ := DefRZ
      FormatTime, FRZ, %RZ%, mm:ss
      GuiControl, , RZ, %FRZ%
      LastTickcount := A_TickCount
      SetTimer, Timer, 10
   }
   Else
   {
      GuiControl, ,  %A_GuiControl%, Start
      GuiControl, Enable, BtnClear
      SetTimer, Timer, OFF
   }
Return

Clear:
   GuiControl, , GZ
   GuiControl, , ZE
   GuiControl, , RZ
Return

Timer:
   If ((A_TickCount - LastTickcount) >= 1000)
   {
      LastTickCount += 1000
      GZ += 1, S
      FormatTime, FGZ, %GZ%, HH:mm:ss
      GuiControl, , GZ, %FGZ%
      RZ += -1, S
      If (SubStr(RZ, 9) = "000000")
      {
         ZE++
         GuiControl, , ZE, %ZE%
         RZ := DefRZ
      }
      FormatTime, FRZ, %RZ%, mm:ss
      GuiControl, , RZ, %FRZ%
   }
Return
Vielleicht kommst Du so mit dem Rest selbst klar. Wenn nicht, melde Dich!
:xmas:
Guest

Re: Zeiterfassung

Post by Guest » 23 Dec 2020, 14:30

Boah, wie geil ist das denn? Und so schnell ... ich bin beeindruckt, muss ich sagen ...
Das werde ich mir mal noch genauer ansehen, aber ist genau das was ich brauche, vielen Dank!

Eins ist mir aber unklar:
Wo im Timer stelle ich ein, dass er gleich mit dem Wert 1 bei der Zeiteinheit startet? Ab der ersten Sekunde ist ja schon eine Zeiteinheit angebrochen, weshalb der Startwert 0 dann nicht passt.
Vielleicht hast Du ja nochmal einen Tipp.

Grüße
BoBo
Posts: 4367
Joined: 13 May 2014, 17:15

Re: Zeiterfassung

Post by BoBo » 23 Dec 2020, 15:04

Ab der ersten Sekunde ist ja schon eine Zeiteinheit angebrochen, weshalb der Startwert 0 dann nicht passt.
Ist die erste Sekunde nicht erst mit Ablauf der 1000. Millisekunde erreicht, also startet sehr wohl von Null ausgehend?? :think:
Filzfrosch
Posts: 42
Joined: 18 Feb 2017, 08:39
Location: Hamburg / Germany

Re: Zeiterfassung

Post by Filzfrosch » 23 Dec 2020, 18:37

Ups ... stimmt natürlich und ich habe es dann auch gefunden ...
Deutlich im Script ... :oops:
Habe es jetzt alles in meine GUI eingebaut und funktioniert echt klasse.
Fehlt nur noch die Pausefunktion, da schaue ich mal ein wenig, wie man das am Besten löst.
Merry Crisis and a happy new fear
BoBo
Posts: 4367
Joined: 13 May 2014, 17:15

Re: Zeiterfassung

Post by BoBo » 23 Dec 2020, 18:48

Code: Select all

F12::Pause
:?:
just me
Posts: 7751
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Zeiterfassung

Post by just me » 24 Dec 2020, 06:15

Moin BoBo,

Pause ist in diesem Fall nicht hilfreich. Die Zeit wird ja über Differenzen zu A_TickCount ermittelt, und der läuft während der 'Pause' munter weiter.

Frohe Weihnachten! :xmas:
Filzfrosch
Posts: 42
Joined: 18 Feb 2017, 08:39
Location: Hamburg / Germany

Re: Zeiterfassung

Post by Filzfrosch » 24 Dec 2020, 08:28

Das hatte ich auch schon versucht, nur mit einem anderen Hotkey.
Damit wird das Script zwar pausiert, der Timer läuft aber im Hintergrund weiter, genau wie oben schon geschrieben.

Ja ... und frohe Weihnachten wünsche ich natürlich auch allen!
Merry Crisis and a happy new fear
just me
Posts: 7751
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Zeiterfassung  Topic is solved

Post by just me » 26 Dec 2020, 06:42

Ich geh dann mal in die Pause, :xmas:

Code: Select all

#NoEnv
SetBatchLines, -1
; Standartwerte ------------------------------------------------------
DefGZ := "20200101000000"  ; Startwert für die Zählung:     00:00:00
DefZE := 0                 ; Startwert für Zeiteinheiten:   0 / 1
DefRZ := "20200101001500"  ; Dauer einer Zeiteinheit:       00:15:00
; GUI ----------------------------------------------------------------
Gui, Margin, 10, 10
Gui, Font, s10 normal
Gui, Add, Text, xm w200 Center, Gesamtzeit
Gui, Font, s18 bold
Gui, Add, Text, xm y+2 wp Center vGZ
Gui, Font, s10 normal
Gui, Add, Text, xm wp Center, Zeiteinheiten
Gui, Font, s18 bold
Gui, Add, Text, xm y+2 wp Center vZE
Gui, Font, s10 normal
Gui, Add, Text, xm wp Center, Restzeit in Zeiteinheit
Gui, Font, s18 bold
Gui, Add, Text, xm y+2 wp Center vRZ
Gui, Font, s10 normal
Gui, Add, Button, xm wp vStart_Stop gStartStop, Start
Gui, Add, Button, xm wp vBtnClear gClear, Löschen
Gui, Add, Button, xm wp Disabled vPause_Weiter gPauseWeiter, Pause
Gui, Show, , Stoppuhr
Return
; --------------------------------------------------------------------
GuiClose:
ExitApp
; --------------------------------------------------------------------
StartStop:
   GuiControlGet, Aktion, , %A_GuiControl%
   If (Aktion = "Start")
   {
      GuiControl, ,  %A_GuiControl%, Stop
      GuiControl, Disable, BtnClear
      GuiControl, Enable, Pause_Weiter
      GZ := DefGZ
      FormatTime, FGZ, %GZ%, HH:mm:ss
      GuiControl, , GZ, %FGZ%
      ZE := DefZE
      GuiControl, , ZE, %ZE%
      RZ := DefRZ
      FormatTime, FRZ, %RZ%, mm:ss
      GuiControl, , RZ, %FRZ%
      LastTickcount := A_TickCount
      LastDiff := 0
      SetTimer, Timer, 10
   }
   Else
   {
      GuiControl, ,  %A_GuiControl%, Start
      GuiControl, Enable, BtnClear
      GuiControl, Disable, Pause_Weiter
      SetTimer, Timer, OFF
   }
Return
; --------------------------------------------------------------------
PauseWeiter:
   GuiControlGet, Aktion, , %A_GuiControl%
   If (Aktion = "Pause")
   {
      SetTimer, Timer, Off
      Sleep, 10
      GuiControl, ,  %A_GuiControl%, Weiter
      LastDiff := A_TickCount - LastTickcount
   }
   Else
   {
      GuiControl, ,  %A_GuiControl%, Pause
      LastTickcount := A_TickCount - LastDiff
      LastDiff :=0
      SetTimer, Timer, 10
   }
Return
; --------------------------------------------------------------------
Clear:
   GuiControl, , GZ
   GuiControl, , ZE
   GuiControl, , RZ
Return
; --------------------------------------------------------------------
Timer:
   If ((A_TickCount - LastTickcount) >= 1000)
   {
      LastTickCount += 1000
      GZ += 1, S
      FormatTime, FGZ, %GZ%, HH:mm:ss
      GuiControl, , GZ, %FGZ%
      RZ += -1, S
      If (SubStr(RZ, 9) = "000000")
      {
         ZE++
         GuiControl, , ZE, %ZE%
         RZ := DefRZ
      }
      FormatTime, FRZ, %RZ%, mm:ss
      GuiControl, , RZ, %FRZ%
   }
Return
Filzfrosch
Posts: 42
Joined: 18 Feb 2017, 08:39
Location: Hamburg / Germany

Re: Zeiterfassung

Post by Filzfrosch » 26 Dec 2020, 09:57

Alter Verwalter, das klappt super!
Ich hatte mich gestern bestimmt 3 Stunden damit beschäftigt und bin kein Stück voran gekommen. Hatte es dann schon als "vlt. ist es gar nicht so notwendig" abgetan und mich doch geärgert, dass ich es nicht hinbekommen habe.
Frage mich echt, wie du so etwas mal eben so machst. Mein vollster Respekt!
Und vielen Dank für das echt spitzenmäßige Weihnachtsgeschenk!!
Merry Crisis and a happy new fear
Filzfrosch
Posts: 42
Joined: 18 Feb 2017, 08:39
Location: Hamburg / Germany

Re: Zeiterfassung

Post by Filzfrosch » 26 Dec 2020, 10:30

Eine letzte Frage habe ich noch, allerdings weiß ich nicht, ob ich dafür ein neuen Thread aufmachen soll.
Ich habe durch mein gebastel an meinem Script mir irgendwo einen Fehler reingesetzt, der in einer Endlosschleife endet. Das Script startet ganz normal und funktioniert auch, allerdings lässt es sich nicht mehr beenden und bleibt hartnäckig aktiv, bis ich es mit dem Taskmanager manuell abschieße.
Gibt es irgendeine Möglichkeit, irgendwo zu sehen, an welcher Stelle es ein Problem gibt?
Habe es schon mit dem AutoGUI Debugger versucht, aber auch da verklemmt es sich und nirgends ist zu sehen, an welcher Stelle.
Es ist bestimmt nur ein kleiner Fehler den ich aber einfach nicht entdecke.
Klar habe ich ein Backup von vorher, aber ich würde schon gerne das weiterentwickelte Script nutzen und dann auch wissen, welchen Fehler ich dort gemacht habe.
Merry Crisis and a happy new fear
just me
Posts: 7751
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Zeiterfassung

Post by just me » 26 Dec 2020, 10:58

Hallo, Du kannst versuchen, über das Kontextmenü das versteckte Hauptfenster zu öffnen und Dir die zuletzt ausgeführten Skriptzeilen anzuschauen. Dann weißt Du wenigstens, wo sich das Skript befindet.
Filzfrosch
Posts: 42
Joined: 18 Feb 2017, 08:39
Location: Hamburg / Germany

Re: Zeiterfassung

Post by Filzfrosch » 26 Dec 2020, 11:11

Es war wie schon vermutet ein ganz billiger Fehler ... ich hatte mir den "Schließen"-Befehl zerschossen.
Statt
GuiClose:
ExitApp

stand da nur noch die Hälfte ....
Unangenehmer Fehler, zumal ich immer wieder das ganze Script durchgeflöht hatte nach Fehlern und ganz unten nicht beachtet hatte dabei.
Danke! Alles ok jetzt :-D

Habe aber durch dieses ganze Gebastel jetzt wieder richtig Lust auf AHK bekommen und werde in nächster Zeit wieder öfter damit arbeiten. Da kommen bestimmt noch ein paar Fragen von mir in diesem Forum demnächst :-D
Merry Crisis and a happy new fear
Post Reply

Return to “Ich brauche Hilfe”