Timer mit Progress

  • Ich habe gerade mit AutoIT angefangen und mache meine ersten Versuche, deswegen bitte ich ein bisschen um Rücksichtnahme ;) Ich habe auf jeden Fall ein Progressbar erstellt, welcher aber aus mir unbekannten Gründen erst bei 100% angezeigt wird. Das ist nicht gerade sinnvoll, da er ja schließlich den Progress anzeigen soll und nicht erst, wenn er fertig ist ;)

    [autoit]


    ; Copyright 2011 master2die [http://www.bafg.net]
    #include <GUIConstants.au3>

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

    MsgBox(64, "Willkommen beim Gamer-Futter-Timer!", "Copyright 2011 masterdie@BAFG.network")
    $zahl = InputBox("Bitte Eingabe tätigen", "Bitte gebe die Zubereitungsdauer an. Eine Angabe in Minuten ist von Nöten.", "10")*60000
    $progress = $zahl/4
    If $zahl > 1 Then
    MsgBox(48,"Timer gestartet","Der Timer wird sich dann bei dir melden :) [MIT DEM CLICK AUF OK STARTET DER TIMER]")
    #Region ### START Koda GUI section ### Form= ;Anfang von Koda GUI sectionG
    GUICreate("Aktueller Status", 469, 26, 193, 125)
    GUICtrlCreateProgress(0, 0, 468, 25) ;Er erstellt eine Statusleiste
    GUICtrlSetData(-1, 20) ;Gehe zu 20%
    Sleep($progress) ;Warte, wie bei einer Installation
    GUICtrlSetData(-1, 40) ;Gehe zu 40%
    Sleep($progress) ;Warte
    GUICtrlSetData(-1, 60) ;Gehe zu 60%
    Sleep($progress) ;Warte
    GUICtrlSetData(-1, 80) ;Gehe zu 80%
    Sleep($progress) ;Warte
    GUICtrlSetData(-1, 100) ;Gehe zu 100%
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ### ;Das Ende von Koda Gui section
    ;Sleep($zahl)
    MsgBox(64, "Essen ist fertig", "Deine Mahlzeit ist fertig. Guten Appetit! :)")
    MsgBox(64, "Danke", "Wenn Dir dieses Tool gefallen hat, dann besuche doch mal http://www.bafg.net ;)")
    Else
    MsgBox(16, "Fehler!", "Deine Zeit muss länger als 1 Minute sein und darf nur aus Zahlen bestehen.")
    EndIf

    [/autoit]

    Was habe ich falsch gemacht? :O

    Einmal editiert, zuletzt von DopeJunky (1. März 2011 um 12:14) aus folgendem Grund: Präfix geändert

  • Die Zeile 21 gehört in die zeile 12.
    Kurz gesagt: du musst die Gui erst mit GuiSetState(@SW_SHOW) anzeigen bevor du die Progressbar veränderst.
    Sonst siehst du das ganze erst nach der ganzen Veränderung, wie du ja schon bemerkt hast ^^

  • GuiSetState müsstest du noch benutzen.

    [autoit]

    ; Copyright 2011 master2die [http://www.bafg.net]
    #include <GUIConstants.au3>

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

    MsgBox(64, "Willkommen beim Gamer-Futter-Timer!", "Copyright 2011 masterdie@BAFG.network")
    $zahl = InputBox("Bitte Eingabe tätigen", "Bitte gebe die Zubereitungsdauer an. Eine Angabe in Minuten ist von Nöten.", "10")*60000
    $progress = $zahl/4
    If $zahl > 1 Then
    MsgBox(48,"Timer gestartet","Der Timer wird sich dann bei dir melden :) [MIT DEM CLICK AUF OK STARTET DER TIMER]")
    #Region ### START Koda GUI section ### Form= ;Anfang von Koda GUI sectionG
    GUICreate("Aktueller Status", 469, 26, 193, 125)
    GUICtrlCreateProgress(0, 0, 468, 25) ;Er erstellt eine Statusleiste
    GUISetState()
    GUICtrlSetData(-1, 20) ;Gehe zu 20%
    Sleep($progress) ;Warte, wie bei einer Installation
    GUICtrlSetData(-1, 40) ;Gehe zu 40%
    Sleep($progress) ;Warte
    GUICtrlSetData(-1, 60) ;Gehe zu 60%
    Sleep($progress) ;Warte
    GUICtrlSetData(-1, 80) ;Gehe zu 80%
    Sleep($progress) ;Warte
    GUICtrlSetData(-1, 100) ;Gehe zu 100%
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ### ;Das Ende von Koda Gui section
    ;Sleep($zahl)
    MsgBox(64, "Essen ist fertig", "Deine Mahlzeit ist fertig. Guten Appetit! :)")
    MsgBox(64, "Danke", "Wenn Dir dieses Tool gefallen hat, dann besuche doch mal http://www.bafg.net ;)")
    Else
    MsgBox(16, "Fehler!", "Deine Zeit muss länger als 1 Minute sein und darf nur aus Zahlen bestehen.")
    EndIf

    [/autoit]
  • Hi DopeJunky,

    die Antwort ist ganz einfach. Du erstellt eine GUI mit einer Progressbar in Zeile 10 & 11 und setzt aber den Status (Sichtbarkeit) erst in Zeile 21 mit GUISetState(@SW_SHOW) auf anzeigen. Zwischen Zeile 11 und 21 setzt du jedoch den Fortschritt für die Progressbar.

    Dein Skript berichtigt:

    [autoit]


    ; Copyright 2011 master2die [http://www.bafg.net]
    #include <GUIConstants.au3>

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

    GUICreate("Aktueller Status", 469, 26, 193, 125)
    $progressbar = GUICtrlCreateProgress(0, 0, 468, 25)
    GUISetState(@SW_SHOW)

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

    MsgBox(64, "Willkommen beim Gamer-Futter-Timer!", "Copyright 2011 masterdie@BAFG.network")
    $zahl = InputBox("Bitte Eingabe tätigen", "Bitte gebe die Zubereitungsdauer an. Eine Angabe in Minuten ist von Nöten.", "10")*60000
    If $zahl > 1 Then
    MsgBox(48,"Timer gestartet","Der Timer wird sich dann bei dir melden :) [MIT DEM CLICK AUF OK STARTET DER TIMER]")
    For $i = 1 to $zahl
    GUICtrlSetData($progressbar, $i)
    Sleep(1000)
    Next
    Else
    MsgBox(16, "Fehler!", "Deine Zeit muss länger als 1 Minute sein und darf nur aus Zahlen bestehen.")
    Exit
    Endif

    [/autoit]
  • Dankeschön *_* Kann geschlossen werden ;)

    //EDIT:
    Wo muss ich den "Dein Essen ist fertig"-Text einfügen? Habe es einmal ganz unten eigenfügt, da hat der Timer aber deutlich länger (.ca 2x solange) gebraucht.

    Einmal editiert, zuletzt von DopeJunky (28. Februar 2011 um 17:43) aus folgendem Grund: Edit

  • Wegen eventueller späterer Rückfragen werden Threads hier nicht geschlossen.
    Du könntest ihn aber auf gelöst setzen indem du den ersten Post bearbeitest, gelöst auswählst und das ganze speicherst ;)

  • Da ist auch glaub ich ein Error in der Progressbar, unzwar, wenn ich 10 Minuten eingebe braucht er 10 min, aber bei 100% der Progressbar lädt er einfach weiter. :P

    Edit: Ist BafG nicht die Bundesanstalt für Gewässerkunde oder so ähnlich? xD

    Mit freundlichen Grüßen

    volle

  • Zitat

    //EDIT:
    Wo muss ich den "Dein Essen ist fertig"-Text einfügen? Habe es einmal ganz unten eigenfügt, da hat der Timer aber deutlich länger (.ca 2x solange) gebraucht.

    Eigentlich ganz logisch. An der Stelle an der die Progressbar 100% ist, sprich nach der For-Schleife. In meinem Beispiel zwischen Zeile 15 & 16. (btw.das Script ist nicht getestet).

  • probier mal mit folgendem:

    [autoit]

    ; Copyright 2011 master2die [http://www.bafg.net]
    #include <GUIConstants.au3>
    GUICreate("Aktueller Status", 469, 26, 193, 125)
    $progressbar = GUICtrlCreateProgress(0, 0, 468, 25)
    GUISetState(@SW_SHOW)
    MsgBox(64, "Willkommen beim Gamer-Futter-Timer!", "Copyright 2011 masterdie@BAFG.network")
    $zahl = InputBox("Bitte Eingabe tätigen", "Bitte gebe die Zubereitungsdauer an. Eine Angabe in Minuten ist von Nöten.", "10")*60000
    If $zahl > 1 Then
    MsgBox(48,"Timer gestartet","Der Timer wird sich dann bei dir melden :) [MIT DEM CLICK AUF OK STARTET DER TIMER]")
    For $i = 1 to $zahl
    GUICtrlSetData($progressbar, 100/$zahl*$i)
    Sleep(1000)
    Next
    Else
    MsgBox(16, "Fehler!", "Deine Zeit muss länger als 1 Minute sein und darf nur aus Zahlen bestehen.")
    Exit
    Endif

    [/autoit]


    Zeile 11 angepasst

  • auch nicht :D Die Progressbar bleibt auf 0^^

    Finde es ja gerade sehr ironisch, dass es hier in diesem Forum hochkomplexe Anwendungen gibt, aber wir hier mit einer "einfachen" Progressbar unsere Probleme haben :D

  • Hallo DopeJunky,

    ich würde es mi AdlibRegister lösen:

    Spoiler anzeigen
    [autoit]

    ; Copyright 2011 master2die [http://www.bafg.net]
    #include <GUIConstants.au3>

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

    Global $idProgress

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

    MsgBox(64, "Willkommen beim Gamer-Futter-Timer!", "Copyright 2011 masterdie@BAFG.network")
    $zahl = Number(InputBox("Bitte Eingabe tätigen", "Bitte gebe die Zubereitungsdauer an. Eine Angabe in Minuten ist von Nöten.", "10")) * 60000
    ConsoleWrite($zahl & @CRLF)
    If $zahl > 1 Then
    MsgBox(48, "Timer gestartet", "Der Timer wird sich dann bei dir melden :) [MIT DEM CLICK AUF OK STARTET DER TIMER]")
    #region ### START Koda GUI section ### Form= ;Anfang von Koda GUI sectionG
    GUICreate("Aktueller Status", 469, 26, 193, 125)
    $idProgress = GUICtrlCreateProgress(0, 0, 468, 25) ;Er erstellt eine Statusleiste
    GUISetState(@SW_SHOW)
    AdlibRegister("_IncProgress", $zahl / 100)
    If GUICtrlRead($idProgress) = 100 Then
    MsgBox(64, "Essen ist fertig", "Deine Mahlzeit ist fertig. Guten Appetit! :)")
    MsgBox(64, "Danke", "Wenn Dir dieses Tool gefallen hat, dann besuche doch mal http://www.bafg.net ;)")
    AdlibUnRegister("_IncProgress")
    EndIf
    Else
    MsgBox(16, "Fehler!", "Deine Zeit muss länger als 1 Minute sein und darf nur aus Zahlen bestehen.")
    EndIf

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

    While 1
    if GUIGetMsg() = -3 then Exit
    WEnd
    Func _IncProgress()
    GUICtrlSetData($idProgress, GUICtrlRead($idProgress) + 1) ;um 1% erhöhen
    ConsoleWrite("Zeilt: " & @HOUR & ":" & @MIN & ":" & @SEC & " % fertig =" & GUICtrlRead($idProgress) & @CRLF);nur zum beobachten kann gelöscht werden
    EndFunc ;==>_IncProgress

    [/autoit]

    auch solltest du alle Eingaben auf die GUI verlagern,

    Edit: das könnte dann z.B.: so aussehen:

    Spoiler anzeigen
    [autoit]

    #include <DateTimeConstants.au3>
    #include <GUIConstants.au3>

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

    Opt("MustDeclareVars", 1) ;Variablen müssen deklariert sein

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

    Global $aAdlibTime, $iAdlibTime, $iMsg

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

    GUICreate("Beispiel Timer mit Progress autoBert", 469, 100, 193, 125)
    GUISetFont(12, 1400)
    GUICtrlCreateLabel("&Wartezeit", 20, 2, 80)
    Local $idDtToGo = GUICtrlCreateDate("", 20, 25, 110, 25, $DTS_UPDOWN)
    Local $DTM_SETFORMAT_ = 0x1032
    Local $style = "HH:mm:ss"
    GUICtrlSetData($aAdlibTime, 0)
    GUICtrlSendMsg($idDtToGo, $DTM_SETFORMAT_, 0, $style)
    Global $idBtnStartStop = GUICtrlCreateButton("&Start", 140, 23, 70)
    Global $idProgress = GUICtrlCreateProgress(0, 65, 468, 25) ;Er erstellt eine Statusleiste
    GUISetState(@SW_SHOW)

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

    While 1
    $iMsg = GUIGetMsg()
    Switch $iMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $idBtnStartStop
    If GUICtrlRead($idBtnStartStop) = "&Start" Then
    GUICtrlSetData($idBtnStartStop, "&Stop")
    $aAdlibTime = StringSplit(GUICtrlRead($idDtToGo), ":", 2)
    $iAdlibTime = $aAdlibTime[2] + $aAdlibTime[1] * 60 + $aAdlibTime[0] * 3600
    AdlibRegister("_IncProgress", $iAdlibTime * 10)
    GUICtrlSetState($idDtToGo, $GUI_DISABLE)
    ConsoleWrite($iAdlibTime & @CRLF)
    Else
    GUICtrlSetData($idBtnStartStop, "&Start")
    GUICtrlSetState($idDtToGo, $GUI_ENABLE)
    AdlibUnRegister("_IncProgress")
    EndIf
    EndSwitch
    WEnd

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

    Func _IncProgress()
    Local $iPercent = GUICtrlRead($idProgress) + 1 ;bisherigen Fortschritt auslesen und um 1% erhöhen
    GUICtrlSetData($idProgress, $iPercent) ;Fortschrittsbalken aktalisieren
    ConsoleWrite("Zeit: " & @HOUR & ":" & @MIN & ":" & @SEC & " % fertig =" & $iPercent & @CRLF);nur zum beobachten kann gelöscht werden
    If $iPercent >= 100 Then
    AdlibUnRegister("_IncProgress")
    MsgBox(64, "Essen ist fertig", "Deine Mahlzeit ist fertig. Guten Appetit! :)")
    GUICtrlSetData($idBtnStartStop, "&Start")
    GUICtrlSetState($idDtToGo, $GUI_ENABLE)
    EndIf
    EndFunc ;==>_IncProgress

    [/autoit]

    mfg autoBert

    Einmal editiert, zuletzt von autoBert (1. März 2011 um 01:42)

  • Danke dir, autoBert.

    Bei der ersten Version bleibt der Progress aber auch bei 100% stehen und agiert danach nicht weiter. Die zweite Version ist nicht schlecht, aber ist noch etwas zu "aufwändig" für mich, da ich alles gerne noch selbst weiterentwickeln würde :)

    LG

  • Bei der ersten Version bleibt der Progress aber auch bei 100% stehen und agiert danach nicht weiter.naja mehr als 100% geht halt nicht, hab jetzt die func incProgress genommen und auch noch ein EXIT eingebaut. Das hättest du aber sicher auch alleine hinbekommen:

    Spoiler anzeigen
    [autoit]

    ; Copyright 2011 master2die [http://www.bafg.net]
    #include <GUIConstants.au3>

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

    Global $idProgress

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

    MsgBox(64, "Willkommen beim Gamer-Futter-Timer!", "Copyright 2011 masterdie@BAFG.network")
    $zahl = Number(InputBox("Bitte Eingabe tätigen", "Bitte gebe die Zubereitungsdauer an. Eine Angabe in Minuten ist von Nöten.", "10")) * 60000
    ConsoleWrite($zahl & @CRLF)
    If $zahl > 1 Then
    MsgBox(48, "Timer gestartet", "Der Timer wird sich dann bei dir melden :) [MIT DEM CLICK AUF OK STARTET DER TIMER]")
    #region ### START Koda GUI section ### Form= ;Anfang von Koda GUI sectionG
    GUICreate("Aktueller Status", 469, 26, 193, 125)
    $idProgress = GUICtrlCreateProgress(0, 0, 468, 25) ;Er erstellt eine Statusleiste
    GUISetState(@SW_SHOW)
    AdlibRegister("_IncProgress", $zahl / 100)
    Else
    MsgBox(16, "Fehler!", "Deine Zeit muss länger als 1 Minute sein und darf nur aus Zahlen bestehen.")
    EndIf

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

    While 1
    if GUIGetMsg() = -3 then Exit
    WEnd
    Func _IncProgress()
    Local $iPercent = GUICtrlRead($idProgress) + 1 ;bisherigen Fortschritt auslesen und um 1% erhöhen
    GUICtrlSetData($idProgress, $iPercent) ;Fortschrittsbalken aktalisieren
    ConsoleWrite("Zeit: " & @HOUR & ":" & @MIN & ":" & @SEC & " % fertig =" & $iPercent & @CRLF);nur zum beobachten kann gelöscht werden
    If $iPercent >= 100 Then
    AdlibUnRegister("_IncProgress")
    MsgBox(64, "Essen ist fertig", "Deine Mahlzeit ist fertig. Guten Appetit! :)")
    Exit
    EndIf
    EndFunc ;==>_IncProgress

    [/autoit]