CountDown Abfrage

  • Hallo zusammen,

    vorweg: ich bin völliger AutoIT Anfänger und habe erst ein kleines Script zusammengebastelt.

    Ich habe den CountDown von BugFix (Link zum Thread ) genommen und etwas umfunktioniert.
    Eine Zufallszahl (später in Minuten) wird generiert und als Timer verwendet.

    Leider weiß ich nicht wie ich am besten folgendes einbaue

    - Wenn ich das "x" anklicke schließt sich der Counter nicht (nur wenn der Timer nicht läuft)
    - Wenn die Zeit abgelaufen ist möchte ich ein Script ausführen (In diesem Code soll eine MsgBox als Bsp dienen)

    [autoit]

    #include <Date.au3>
    #include <GUIConstants.au3>
    #include <EditConstants.au3>

    [/autoit][autoit][/autoit][autoit]

    Local $sec, $min, $hr, $day
    $gui = GUICreate('CountDown', 200,50)
    $bt = GUICtrlCreateButton('Start', 40, 15, 50, 20)
    $iDown = GUICtrlCreateInput('', 100, 15, 80, 20, $ES_READONLY)
    GUISetState()

    [/autoit][autoit][/autoit][autoit]

    $zufallszahl = Random(10,20,1)

    [/autoit][autoit][/autoit][autoit]

    MsgBox('', "Zufallszahl", "Die Zahl ist " & $zufallszahl)

    [/autoit][autoit][/autoit][autoit]

    $min = 0
    $sec = $zufallszahl

    [/autoit][autoit][/autoit][autoit]

    While True
    $msg = GUIGetMsg()
    If $msg = $bt Then
    _CountDown($sec, $min, $hr, $day, True, $iDown)

    [/autoit][autoit][/autoit][autoit]

    if $idown = 0 Then
    MsgBox('', "TITEL", "TEXT")
    EndIf
    ElseIf $msg = $GUI_EVENT_CLOSE Then
    Exit
    EndIf

    [/autoit][autoit][/autoit][autoit]

    WEnd

    [/autoit]

    Habe zick verschiedene Möglichkeiten versucht aber komme nicht zu dem gewünschten Ergebnis.. :wacko: Ist dieses Problem schon fortgeschritten oder noch für Anfänger zu meistern? ;)

    Besten Dank

  • Zeig mal deine _Countdown Funktion eventuell hängst du in einer Schleife fest.

    Edit: Du hängst in einer Schleife fest.
    Sprich ich würde es so lösen, dass du die _Countdown Funktion so änderst, dass sie true zurück gibt, wenn der _Countdown erreicht wurde, false wenn nicht.
    Du prüfst dann einfach in deiner Msg-Loop ob der Countdown abgelaufen ist und wenn dem so ist machst du halt was du machen möchtest.

    3 Mal editiert, zuletzt von CentuCore (18. Dezember 2013 um 20:33)

  • Hallo CentuCore,

    vielen Dank für Deine Antwort! Es hat funktioniert! :thumbup:

    Könntest Du mir vllt noch ein Tipp geben wo ich ansetzen muss damit der CountDown auch "Abgebrochen" werden kann. Das Fenster kann ich nur schließen wenn der Timer auf "0 s" steht.
    Idealerweise auf 2 Varianten -> das x im Fenster und wenn ich einen neuen Button einbaue der den Counter abbricht.

    Grüße

    • Offizieller Beitrag

    Poste mal den ganzen Code, dann kann man dir auch helfen.
    Die Funktion _CountDown aus einem Post von BugFix zu suchen, ist kontraproduktiv.

  • Hallo Raupi,

    Spoiler anzeigen
    [autoit]

    #include <Date.au3>
    #include <GUIConstants.au3>
    #include <EditConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Local $sec, $min, $hr, $day
    $gui = GUICreate('CountDown', 200,50)
    $bt = GUICtrlCreateButton('Start', 40, 15, 50, 20)
    $iDown = GUICtrlCreateInput('', 100, 15, 80, 20, $ES_READONLY)
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    $zufallszahl = Random(10,20,1)

    [/autoit] [autoit][/autoit] [autoit]

    MsgBox('', "Zufallszahl", "Die Zahl ist " & $zufallszahl)

    [/autoit] [autoit][/autoit] [autoit]

    $min = 0
    $sec = $zufallszahl

    [/autoit] [autoit][/autoit] [autoit]

    While True
    $msg = GUIGetMsg()
    If $msg = $bt Then
    _CountDown($sec, $min, $hr, $day, True, $iDown)

    [/autoit] [autoit][/autoit] [autoit]

    if $iDown = true Then
    MsgBox('', "TITEL", "TEXT")
    EndIf
    ElseIf $msg = $GUI_EVENT_CLOSE Then
    Exit
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _CountDown($SEC, $MIN=0, $HOUR=0, $DAY=0, $VISIBLEDOWN=True, $ALTERNATECTRL='TT')
    $Sekunden = $SEC + $MIN*60 + $HOUR*3600 + $DAY*86400
    $end = _DateAdd('s', $Sekunden, _NowCalc())
    Local $message
    Do
    Sleep(100)
    $sec = _DateDiff('s', _NowCalc(), $end)
    If Not $VISIBLEDOWN Then
    $secShow = $Sekunden - $sec
    Else
    $secShow = $sec
    EndIf
    Select
    Case $secShow < 60
    If $ALTERNATECTRL = 'TT' Then
    ToolTip(StringFormat('%02u', $secShow) & ' s')
    Else
    GUICtrlSetData($ALTERNATECTRL, StringFormat('%02u', $secShow) & ' s')
    EndIf
    Case $secShow < 60*60
    $message = StringFormat('%02u', Floor($secShow/60)) & ':' & _
    StringFormat('%02u', Mod($secShow,60)) & ' min'
    If $ALTERNATECTRL = 'TT' Then
    ToolTip($message)
    Else
    GUICtrlSetData($ALTERNATECTRL, $message)
    EndIf
    Case $secShow < 60*60*24
    $message = StringFormat('%02u', Floor($secShow/3600)) & ':' & _
    StringFormat('%02u', Floor(Mod($secShow,3600)/60)) & ':' & _
    StringFormat('%02u', Mod(Mod($secShow,3600),60)) & ' h'
    If $ALTERNATECTRL = 'TT' Then
    ToolTip($message)
    Else
    GUICtrlSetData($ALTERNATECTRL, $message)
    EndIf
    Case Else
    $message = Floor($secShow/86400) & ' d / ' & _
    StringFormat('%02u', Floor(Mod($secShow,86400)/3600)) & ':' & _
    StringFormat('%02u', Floor(Mod(Mod($secShow,86400),3600)/60)) & ':' & _
    StringFormat('%02u', Mod(Mod(Mod($secShow,86400),3600),60)) & ' h'
    If $ALTERNATECTRL = 'TT' Then
    ToolTip($message)
    Else
    GUICtrlSetData($ALTERNATECTRL, $message)
    EndIf

    if $message = 0 Then
    True
    Else
    GUICtrlSetData($ALTERNATECTRL, $message)
    EndIf
    EndSelect
    Until $sec = 0
    EndFunc ;==>_CountDown

    [/autoit]

    Die Funktion _CountDown versteckt sich normal in der Date.au3. Habe sie eben in den jetzigen Code eingebaut.

    Viele Grüße

    Einmal editiert, zuletzt von PopupBlocker (19. Dezember 2013 um 11:28)

    • Offizieller Beitrag

    Die Funktion _CountDown gehört nicht in eine Standard UDF.
    Besser du packst sie in eine eigenständige Includedatei.
    Dein geposteter Code läuft nicht, scheinbar hast du da was falsch eingefügt. ;)
    Poste mal einen lauffähigen Code.

    • Offizieller Beitrag

    Der Code ist nicht ausführbar.
    Zeile 83 hat einen Syntaxerror.

    Edit. Hänge mal die au3 Datei an deinen Post an.
    Vielleicht hat es ja mit dem Bug in den Codetags zu tun.

    • Offizieller Beitrag

    Selbst wenn du noch 100 mal den Code postest, hat er trotdem einen Syntaxfehler und ist so niemals ausführbar.
    Zeile 80

    [autoit]

    True

    [/autoit]


    Ist nicht korrekt und ich verstehe nicht wie du den Code ausführen willst.
    Scite zeigt dir den Fehler an und ignorieren nutzt dabei nichts. ;)

  • Selbst wenn du noch 100 mal den Code postest, hat er trotdem einen Syntaxfehler und ist so niemals ausführbar.
    Zeile 80

    Habe den Code nur 1 mal gepostet.. und erhalte jetzt auch den von dir beschrieben fehler.. wieso das vorher lief!? 8|

    Eine Änderung ergibt nun keinen fehler..

    Spoiler anzeigen
    [autoit]

    #include <Date.au3>
    #include <GUIConstants.au3>
    #include <EditConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Local $sec, $min, $hr, $day
    $gui = GUICreate('CountDown', 200,50)
    $bt = GUICtrlCreateButton('Start', 40, 15, 50, 20)
    $iDown = GUICtrlCreateInput('', 100, 15, 80, 20, $ES_READONLY)
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    $zufallszahl = Random(10,20,1)

    [/autoit] [autoit][/autoit] [autoit]

    MsgBox('', "Zufallszahl", "Die Zahl ist " & $zufallszahl)

    [/autoit] [autoit][/autoit] [autoit]

    $min = 0
    $sec = $zufallszahl

    [/autoit] [autoit][/autoit] [autoit]

    While True
    $msg = GUIGetMsg()
    If $msg = $bt Then
    _CountDown($sec, $min, $hr, $day, True, $iDown)

    [/autoit] [autoit][/autoit] [autoit]

    if $iDown = true Then
    MsgBox('', "TITEL", "TEXT")
    EndIf
    ElseIf $msg = $GUI_EVENT_CLOSE Then
    Exit
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _CountDown($SEC, $MIN=0, $HOUR=0, $DAY=0, $VISIBLEDOWN=True, $ALTERNATECTRL='TT')
    $Sekunden = $SEC + $MIN*60 + $HOUR*3600 + $DAY*86400
    $end = _DateAdd('s', $Sekunden, _NowCalc())
    Local $message
    Do
    Sleep(100)
    $sec = _DateDiff('s', _NowCalc(), $end)
    If Not $VISIBLEDOWN Then
    $secShow = $Sekunden - $sec
    Else
    $secShow = $sec
    EndIf
    Select
    Case $secShow < 60
    If $ALTERNATECTRL = 'TT' Then
    ToolTip(StringFormat('%02u', $secShow) & ' s')
    Else
    GUICtrlSetData($ALTERNATECTRL, StringFormat('%02u', $secShow) & ' s')
    EndIf
    Case $secShow < 60*60
    $message = StringFormat('%02u', Floor($secShow/60)) & ':' & _
    StringFormat('%02u', Mod($secShow,60)) & ' min'
    If $ALTERNATECTRL = 'TT' Then
    ToolTip($message)
    Else
    GUICtrlSetData($ALTERNATECTRL, $message)
    EndIf
    Case $secShow < 60*60*24
    $message = StringFormat('%02u', Floor($secShow/3600)) & ':' & _
    StringFormat('%02u', Floor(Mod($secShow,3600)/60)) & ':' & _
    StringFormat('%02u', Mod(Mod($secShow,3600),60)) & ' h'
    If $ALTERNATECTRL = 'TT' Then
    ToolTip($message)
    Else
    GUICtrlSetData($ALTERNATECTRL, $message)
    EndIf
    Case Else
    $message = Floor($secShow/86400) & ' d / ' & _
    StringFormat('%02u', Floor(Mod($secShow,86400)/3600)) & ':' & _
    StringFormat('%02u', Floor(Mod(Mod($secShow,86400),3600)/60)) & ':' & _
    StringFormat('%02u', Mod(Mod(Mod($secShow,86400),3600),60)) & ' h'
    If $ALTERNATECTRL = 'TT' Then
    ToolTip($message)
    Else
    GUICtrlSetData($ALTERNATECTRL, $message)
    EndIf

    if $message = 0 Then
    $message = true
    Else
    GUICtrlSetData($ALTERNATECTRL, $message)
    EndIf
    EndSelect
    Until $sec = 0
    EndFunc ;==>_CountDown

    [/autoit]