Frage zu Bugfix MehrfachCounter

  • Hi BugFix hat da im August letztes Jahr mal nen Bsp. für jemanden gemacht.

    Das habe ich mir mal angesehen und finde das superpraktisch für meine Adminsaächelchen.

    Habe nur ein mini Problem mit den Schleifen usw.

    Das ist aber bekannt hier das ich des wohl nie gebacken bekomme :(


    Naja, also meine Frage hierzu :

    [autoit]


    #include <guiconstants.au3>
    #include <Date.au3>
    Global $arBt[8][2], $arIn[8][3], $arCounter[8][2], $y = 10, $input
    GUICreate('test')
    For $i = 0 To UBound($arBt) -1
    $arBt[$i][0] = GUICtrlCreateButton('set Time', 10, $y, 60, 20)
    $arIn[$i][0] = GUICtrlCreateInput('', 80, $y, 40, 20)
    $arCounter[$i][0] = GUICtrlCreateLabel('', 140, $y+3, 80, 17)
    $arBt[$i][1] = GUICtrlCreateButton('Reset', 240, $y, 60, 20)
    GUICtrlSetState($arBt[$i][1], $GUI_DISABLE)
    $y += 30
    Next
    GUISetState()
    Do
    $msg = GUIGetMsg()
    _SetCounter()
    For $i = 0 To UBound($arBt) -1
    If $msg = $arBt[$i][0] Then
    $arCounter[$i][1] = 1
    $input = GUICtrlRead($arIn[$i][0])
    If $input = '' Then ContinueLoop
    If StringInStr($input, ':') Then
    $input = StringSplit($input, ':')
    $input = $input[1]*60 + $input[2]
    EndIf
    $arIn[$i][1] = $input * 60
    $arIn[$i][2] = _NowCalc()
    GUICtrlSetState($arBt[$i][0], $GUI_DISABLE)
    GUICtrlSetState($arBt[$i][1], $GUI_ENABLE)
    ElseIf $msg = $arBt[$i][1] Then
    GUICtrlSetState($arBt[$i][0], $GUI_ENABLE)
    GUICtrlSetState($arBt[$i][1], $GUI_DISABLE)
    GUICtrlSetData($arCounter[$i][0], '')
    GUICtrlSetData($arIn[$i][0], '')
    $arIn[$i][1] = 0
    EndIf
    Next
    Until $msg = $GUI_EVENT_CLOSE
    Func _SetCounter()
    Local $sec
    For $i = 0 To UBound($arCounter) -1
    If $arCounter[$i][1] <> 1 Then ContinueLoop
    If $arIn[$i][1] = 0 Then ContinueLoop
    $sec = $arIn[$i][1] - _DateDiff("s", $arIn[$i][2], _NowCalc())
    Select
    Case $sec < 60
    GUICtrlSetData($arCounter[$i][0], StringFormat('%02u', $sec) & ' s')
    Case $sec < 60*60
    GUICtrlSetData($arCounter[$i][0], StringFormat('%02u', Floor($sec/60)) & ':' & _
    StringFormat('%02u', Mod($sec,60)) & ' min')
    Case $sec < 60*60*24
    GUICtrlSetData($arCounter[$i][0],StringFormat('%02u', Floor($sec/3600)) & ':' & _
    StringFormat('%02u', Floor(Mod($sec,3600)/60)) & ':' & _
    StringFormat('%02u', Mod(Mod($sec,3600),60)) & ' h')
    EndSelect
    If $sec = 0 Then
    SoundPlay(@WindowsDir & '\Media\tada.wav')
    $arCounter[$i][1] = 0
    EndIf
    Next
    EndFunc

    [/autoit]


    Egal bei welchem Feld der Counter auf 0 geht es passiert immer das gleiche.

    Nun würde ich gerne bei jedem Feld etwas anderes nach Time ausführen.


    Wie muss ich das zusammenpacken ?

    Sollte ich das in ein Array packen und mir dort die Infos holen oder wie müsste ich das machen ?


    Vielen dank für eure Hilfe.

    5 Mal editiert, zuletzt von Observer (8. Juni 2009 um 08:02)

  • Spoiler anzeigen
    [autoit]


    Func _SetCounter()
    Local $sec
    For $i = 0 To UBound($arCounter) - 1
    If $arCounter[$i][1] <> 1 Then ContinueLoop
    If $arIn[$i][1] = 0 Then ContinueLoop
    $sec = $arIn[$i][1] - _DateDiff("s", $arIn[$i][2], _NowCalc())
    Select
    Case $sec < 60
    GUICtrlSetData($arCounter[$i][0], StringFormat('%02u', $sec) & ' s')
    Case $sec < 60 * 60
    GUICtrlSetData($arCounter[$i][0], StringFormat('%02u', Floor($sec / 60)) & ':' & _
    StringFormat('%02u', Mod($sec, 60)) & ' min')
    Case $sec < 60 * 60 * 24
    GUICtrlSetData($arCounter[$i][0], StringFormat('%02u', Floor($sec / 3600)) & ':' & _
    StringFormat('%02u', Floor(Mod($sec, 3600) / 60)) & ':' & _
    StringFormat('%02u', Mod(Mod($sec, 3600), 60)) & ' h')
    EndSelect
    If $sec = 0 Then
    if GUICtrlRead($arCounter[0][0]) = "00 s" then MsgBox(1, "", "Counter 0 beendet")
    if GUICtrlRead($arCounter[1][0]) = "00 s" then MsgBox(1, "", "Counter 1 beendet")
    ;usw.
    $arCounter[$i][1] = 0
    EndIf
    Next
    EndFunc ;==>_SetCounter

    [/autoit]

    So würds schonmal gehen.
    Das geht aber noch besser, schließlich werden so immer alle Labels abgefragt.

  • Switcht doch einfach am Ende $i:

    Spoiler anzeigen
    [autoit]

    If $sec = 0 Then
    SoundPlay(@WindowsDir & '\Media\tada.wav')
    $arCounter[$i][1] = 0
    Switch $i
    Case 0
    MsgBox(0,"","0")
    Case 1
    MsgBox(0,"","1")
    Case 2
    MsgBox(0,"","2")
    Case Else
    MsgBox(0,"", "Und so weiter!...")
    EndSwitch
    EndIf

    [/autoit]
  • lol, darauf hätte ich ja auch kommen müssen :(


    Na ich lerne das schon noch irgendwann ! :)


    Danke euch für euere Beispiele.


    Edit : Noch ein Problem, wenn ich hier noch eine 2te Gui erstelle die ich dann Steuern will, warum macht er mir diese erst auf wenn ich diesen Counter 1xschliesse.

    Allerdings bleibt der Counter trotzdem offen !

    Weis mir da jemand nen Rat ?

    Einmal editiert, zuletzt von Observer (7. Juni 2009 um 11:52)

  • Sorry für Doppelpost, aber ich müsste wissen wieso die 2te Gui nicht bleibt.


    Spoiler anzeigen

    #include <guiconstants.au3>
    #include <Date.au3>

    Global $arBt[8][2], $arIn[8][3], $arCounter[8][2], $y = 10, $input
    $Gui1 = GUICreate('test')

    For $i = 0 To UBound($arBt) -1
    $arBt[$i][0] = GUICtrlCreateButton('set Time', 10, $y, 60, 20)
    $arIn[$i][0] = GUICtrlCreateInput('', 80, $y, 40, 20)
    $arCounter[$i][0] = GUICtrlCreateLabel('', 140, $y+3, 80, 17)
    $arBt[$i][1] = GUICtrlCreateButton('Reset', 240, $y, 60, 20)
    GUICtrlSetState($arBt[$i][1], $GUI_DISABLE)
    $y += 30
    Next
    GUISetState()

    Do
    $msg = GUIGetMsg()
    _SetCounter()
    For $i = 0 To UBound($arBt) -1
    If $msg = $arBt[$i][0] Then
    $arCounter[$i][1] = 1
    $input = GUICtrlRead($arIn[$i][0])
    If $input = '' Then ContinueLoop
    If StringInStr($input, ':') Then
    $input = StringSplit($input, ':')
    $input = $input[1]*60 + $input[2]
    EndIf
    $arIn[$i][1] = $input * 60
    $arIn[$i][2] = _NowCalc()
    GUICtrlSetState($arBt[$i][0], $GUI_DISABLE)
    GUICtrlSetState($arBt[$i][1], $GUI_ENABLE)
    ElseIf $msg = $arBt[$i][1] Then
    GUICtrlSetState($arBt[$i][0], $GUI_ENABLE)
    GUICtrlSetState($arBt[$i][1], $GUI_DISABLE)
    GUICtrlSetData($arCounter[$i][0], '')
    GUICtrlSetData($arIn[$i][0], '')
    $arIn[$i][1] = 0
    EndIf
    Next
    Until $msg = $GUI_EVENT_CLOSE

    $Gui2 = GUICreate('Test2')
    $GUI_Button_Login = GUICtrlCreateButton("Login", 50, 50, 100, 30)

    While 1
    $msg = GUIGetMsg()
    Select
    Case $msg = $GUI_EVENT_CLOSE
    ExitLoop
    Case $msg = $GUI_Button_Login
    Sleep(20)
    EndSelect

    WEnd


    GUISetState()

    Func _SetCounter()
    Local $sec
    For $i = 0 To UBound($arCounter) -1
    If $arCounter[$i][1] <> 1 Then ContinueLoop
    If $arIn[$i][1] = 0 Then ContinueLoop
    $sec = $arIn[$i][1] - _DateDiff("s", $arIn[$i][2], _NowCalc())
    Select
    Case $sec < 60
    GUICtrlSetData($arCounter[$i][0], StringFormat('%02u', $sec) & ' s')
    Case $sec < 60*60
    GUICtrlSetData($arCounter[$i][0], StringFormat('%02u', Floor($sec/60)) & ':' & _
    StringFormat('%02u', Mod($sec,60)) & ' min')
    Case $sec < 60*60*24
    GUICtrlSetData($arCounter[$i][0],StringFormat('%02u', Floor($sec/3600)) & ':' & _
    StringFormat('%02u', Floor(Mod($sec,3600)/60)) & ':' & _
    StringFormat('%02u', Mod(Mod($sec,3600),60)) & ' h')
    EndSelect
    If $sec = 50 Then

    $arCounter[$i][1] = 0
    Switch $i
    Case 0
    MsgBox(0,"1","0")
    Case 1
    MsgBox(0,"2","1")
    Case 2
    MsgBox(0,"3","2")
    Case Else
    MsgBox(0,"4", "Und so weiter!...")
    EndSwitch

    EndIf
    Next
    EndFunc


    Thx für eure Hilfen !

  • Hallo Observer,

    weil du GuiSetState erst nach der 2. MsgLoop-Schleife eingefügt hast,

    so wird sie angezeigt, nachdem die 1. Gui beendet wurde.

    Spoiler anzeigen
    [autoit]

    #include <guiconstants.au3>
    #include <Date.au3>

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

    Global $arBt[8][2], $arIn[8][3], $arCounter[8][2], $y = 10, $input
    $Gui1 = GUICreate('test')

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

    For $i = 0 To UBound($arBt) - 1
    $arBt[$i][0] = GUICtrlCreateButton('set Time', 10, $y, 60, 20)
    $arIn[$i][0] = GUICtrlCreateInput('', 80, $y, 40, 20)
    $arCounter[$i][0] = GUICtrlCreateLabel('', 140, $y + 3, 80, 17)
    $arBt[$i][1] = GUICtrlCreateButton('Reset', 240, $y, 60, 20)
    GUICtrlSetState($arBt[$i][1], $GUI_DISABLE)
    $y += 30
    Next
    GUISetState()

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

    Do
    $msg = GUIGetMsg()
    _SetCounter()
    For $i = 0 To UBound($arBt) - 1
    If $msg = $arBt[$i][0] Then
    $arCounter[$i][1] = 1
    $input = GUICtrlRead($arIn[$i][0])
    If $input = '' Then ContinueLoop
    If StringInStr($input, ':') Then
    $input = StringSplit($input, ':')
    $input = $input[1] * 60 + $input[2]
    EndIf
    $arIn[$i][1] = $input * 60
    $arIn[$i][2] = _NowCalc()
    GUICtrlSetState($arBt[$i][0], $GUI_DISABLE)
    GUICtrlSetState($arBt[$i][1], $GUI_ENABLE)
    ElseIf $msg = $arBt[$i][1] Then
    GUICtrlSetState($arBt[$i][0], $GUI_ENABLE)
    GUICtrlSetState($arBt[$i][1], $GUI_DISABLE)
    GUICtrlSetData($arCounter[$i][0], '')
    GUICtrlSetData($arIn[$i][0], '')
    $arIn[$i][1] = 0
    EndIf
    Next
    Until $msg = $GUI_EVENT_CLOSE

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

    $Gui2 = GUICreate('Test2')
    $GUI_Button_Login = GUICtrlCreateButton("Login", 50, 50, 100, 30)
    GUISetState()

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

    While 1
    $msg = GUIGetMsg()
    Select
    Case $msg = $GUI_EVENT_CLOSE
    ExitLoop
    Case $msg = $GUI_Button_Login
    Sleep(20)
    EndSelect

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

    WEnd

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

    Func _SetCounter()
    Local $sec
    For $i = 0 To UBound($arCounter) - 1
    If $arCounter[$i][1] <> 1 Then ContinueLoop
    If $arIn[$i][1] = 0 Then ContinueLoop
    $sec = $arIn[$i][1] - _DateDiff("s", $arIn[$i][2], _NowCalc())
    Select
    Case $sec < 60
    GUICtrlSetData($arCounter[$i][0], StringFormat('%02u', $sec) & ' s')
    Case $sec < 60 * 60
    GUICtrlSetData($arCounter[$i][0], StringFormat('%02u', Floor($sec / 60)) & ':' & _
    StringFormat('%02u', Mod($sec, 60)) & ' min')
    Case $sec < 60 * 60 * 24
    GUICtrlSetData($arCounter[$i][0], StringFormat('%02u', Floor($sec / 3600)) & ':' & _
    StringFormat('%02u', Floor(Mod($sec, 3600) / 60)) & ':' & _
    StringFormat('%02u', Mod(Mod($sec, 3600), 60)) & ' h')
    EndSelect
    If $sec = 50 Then

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

    $arCounter[$i][1] = 0
    Switch $i
    Case 0
    MsgBox(0, "1", "0")
    Case 1
    MsgBox(0, "2", "1")
    Case 2
    MsgBox(0, "3", "2")
    Case Else
    MsgBox(0, "4", "Und so weiter!...")
    EndSwitch

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

    EndIf
    Next
    EndFunc ;==>_SetCounter

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

    mfg (Auto)Bert

  • Jo so funzt das wenn die erste beendet wurde, aber das ist ja mein Problem.

    Sie sollte Funktionieren und gut isses :)


    Also ich möchte die nacher per Button mit @SW_Hide and Show bearbeiten können.

    Nur bekomme ich genau dass nicht hin :(


    Edit : Ahhh ich habs, hätte ich dein Post gleich richtig gelesen hätte ich nicht nochmal gefragt :(


    Thx


    Kannst mir da bitte erklären wieso das so ist ?


    Vielen dank !

  • Ich versuchs mal ^^
    Also eine Gui überlebt immer nur solange du mindestens 1 Endlosschleife laufen hast... nachdem du nun über $GUI_EVENT_CLOSE die erste verlassen hast, wird deine zweite Gui erstellt, angezeigt und das Script geht in die zweite Endlosschleife. Da die 1ste Gui nicht irgendwie gelöscht/gehidet wurde läuft diese auch in der zweiten Endlosschleife weiter... Doch in der zweiten Schleife ist garkein Control-Handling für die erste Gui, deswegen ist diese im Prinzip so unnötig!

  • Hm, ich muss immer erst eine der Guis schliessen ehe der Counter funzt.

    Wieso das denn ?

    Verstehe ja was du meinst, nur wie mache ich das beide laufen ?

    In der einen soll ja der Counter laufen und bei zeiten Aktiv werden.

    In der Anderen Gui möchte ich ja Aktionen per Buttons auslösen usw.


    Thx

  • Weiß zwar nicht, warum du die 2te Gui erst erstellen willst, wenn du auf Exit geklickt hast :pinch: , aber hier:

    Spoiler anzeigen
    [autoit]

    #include <guiconstants.au3>
    #include <Date.au3>

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

    Opt("GuiOnEventMode",1)
    Global $arBt[8][2], $arIn[8][3], $arCounter[8][2], $y = 10, $input
    $Gui1 = GUICreate('test')
    GuiSetOnEvent($GUI_EVENT_CLOSE, "_guiCreate")
    For $i = 0 To UBound($arBt) - 1
    $arBt[$i][0] = GUICtrlCreateButton('set Time', 10, $y, 60, 20)
    GuiCtrlSetOnEvent(-1, "_set")
    $arIn[$i][0] = GUICtrlCreateInput('', 80, $y, 40, 20)
    $arCounter[$i][0] = GUICtrlCreateLabel('', 140, $y + 3, 80, 17)
    $arBt[$i][1] = GUICtrlCreateButton('Reset', 240, $y, 60, 20)
    GuiCtrlSetOnEvent(-1, "_reset")
    GUICtrlSetState($arBt[$i][1], $GUI_DISABLE)
    $y += 30
    Next
    GUISetState()

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

    While 1
    sleep(100)
    _SetCounter()
    Wend

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

    Func _set()
    $i = Int(@Gui_CtrlId/4)
    ConsoleWrite($i)
    $arCounter[$i][1] = 1
    $input = GUICtrlRead($arIn[$i][0])
    If $input = '' Then return
    If StringInStr($input, ':') Then
    $input = StringSplit($input, ':')
    $input = $input[1] * 60 + $input[2]
    EndIf
    $arIn[$i][1] = $input * 60
    $arIn[$i][2] = _NowCalc()
    GUICtrlSetState($arBt[$i][0], $GUI_DISABLE)
    GUICtrlSetState($arBt[$i][1], $GUI_ENABLE)
    EndFunc

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

    Func _reset()
    $i = Int(@Gui_CtrlId/4)-1
    ConsoleWrite($i)
    GUICtrlSetState($arBt[$i][0], $GUI_ENABLE)
    GUICtrlSetState($arBt[$i][1], $GUI_DISABLE)
    GUICtrlSetData($arCounter[$i][0], '')
    GUICtrlSetData($arIn[$i][0], '')
    $arIn[$i][1] = 0
    EndFunc

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

    Func _guiCreate()
    $Gui2 = GUICreate('Test2')
    $GUI_Button_Login = GUICtrlCreateButton("Login", 50, 50, 100, 30)
    GUISetState()
    GuiSetOnEvent($GUI_EVENT_CLOSE, "_exit", $Gui1)
    GuiSetOnEvent($GUI_EVENT_CLOSE, "_exit", $Gui2)
    EndFunc

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

    Func _Exit()
    Exit
    EndFunc

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

    Func _SetCounter()
    Local $sec
    For $i = 0 To UBound($arCounter) - 1
    If $arCounter[$i][1] <> 1 Then ContinueLoop
    If $arIn[$i][1] = 0 Then ContinueLoop
    $sec = $arIn[$i][1] - _DateDiff("s", $arIn[$i][2], _NowCalc())
    Select
    Case $sec < 60
    GUICtrlSetData($arCounter[$i][0], StringFormat('%02u', $sec) & ' s')
    Case $sec < 60 * 60
    GUICtrlSetData($arCounter[$i][0], StringFormat('%02u', Floor($sec / 60)) & ':' & _
    StringFormat('%02u', Mod($sec, 60)) & ' min')
    Case $sec < 60 * 60 * 24
    GUICtrlSetData($arCounter[$i][0], StringFormat('%02u', Floor($sec / 3600)) & ':' & _
    StringFormat('%02u', Floor(Mod($sec, 3600) / 60)) & ':' & _
    StringFormat('%02u', Mod(Mod($sec, 3600), 60)) & ' h')
    EndSelect
    If $sec = 50 Then
    $arCounter[$i][1] = 0
    Switch $i
    Case 0
    MsgBox(0, "1", "0")
    Case 1
    MsgBox(0, "2", "1")
    Case 2
    MsgBox(0, "3", "2")
    Case Else
    MsgBox(0, "4", "Und so weiter!...")
    EndSwitch

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

    EndIf
    Next
    EndFunc ;==>_SetCounter

    [/autoit]

    Achja hab n bisschen was umgeschriebn, sollte besser so laufen!

  • Das habt ihr alle etwas falsch verstanden.

    Die 2te soll nicht bei Exit erstellt werden, sondern sie wird jetzt nachdem ich das mit dem Guisetstate() verstanden habe erstellt.

    Nur muss ich derzeit einmal bei einer der Guis auf das Rote Kreuz zum schliessen klicken und sie bleibt offen, erst nach dem Klick funktioniert die andere Gui.


    Also sagen wir mal ich habe 2 solche TimerGuis.

    Nur bei einer läuft die zeit und das erst nachdem ich auf einer der beiden Guis das rote kreuz klickte.

    Warum ist das so ?


    Thx

  • Tut mir leid ich habe deine Frage schon wieder nicht verstanden und wie ich das so sehe hat das auch kein anderer verstanden...

    Sag mal bitte wann die 2te Gui erstellt werden soll!

  • Hallo Observer,

    ich hoffe dass ich dich richtig verstanden habe. Da du dich auf BugFix Beispiel beziehst hab ich auf diesem aufbauend eine 2. Gui zum Einloggen erstellt:

    Spoiler anzeigen
    [autoit]

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

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

    Local $sec, $min, $hr, $day, $sec2, $min2, $hr2, $day2
    Global $end, $start, $Sekunden, $end2, $start2, $Sekunden2, $s1 = 0, $s2 = 0
    Global $Adlib = False, $EndAdlib = 0, $Count1 = False, $Count2 = False
    ;~ Global $INIPath = 'Pfad.INI'

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

    $gui = GUICreate('CountDown',-1,-1,10,10)
    $hafterTimer1Gui = GUICreate("after Timer 1",-1,-1,-1,-1,-1,-1,$gui)
    $GUI_Button_Login = GUICtrlCreateButton("Login", 50, 50, 100, 30)
    GUISwitch($gui)
    GUICtrlCreateLabel('Tage', 15, 18, 60, 17)
    $iD = GUICtrlCreateInput('', 80, 15, 20, 20, $ES_NUMBER)
    GUICtrlCreateLabel('Stunden', 15, 48, 60, 17)
    $iH = GUICtrlCreateInput('', 80, 45, 20, 20, $ES_NUMBER)
    GUICtrlCreateLabel('Minuten', 15, 78, 60, 17)
    $iM = GUICtrlCreateInput('', 80, 75, 20, 20, $ES_NUMBER)
    GUICtrlCreateLabel('Sekunden', 15, 108, 60, 17)
    $iS = GUICtrlCreateInput('', 80, 105, 20, 20, $ES_NUMBER)
    $bt = GUICtrlCreateButton('Start', 140, 15, 50, 20)
    $iDown = GUICtrlCreateInput('', 200, 15, 80, 20, $ES_READONLY)

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

    GUICtrlCreateLabel('Tage', 15, 153, 60, 17)
    $iD2 = GUICtrlCreateInput('', 80, 150, 20, 20, $ES_NUMBER)
    GUICtrlCreateLabel('Stunden', 15, 183, 60, 17)
    $iH2 = GUICtrlCreateInput('', 80, 180, 20, 20, $ES_NUMBER)
    GUICtrlCreateLabel('Minuten', 15, 213, 60, 17)
    $iM2 = GUICtrlCreateInput('', 80, 210, 20, 20, $ES_NUMBER)
    GUICtrlCreateLabel('Sekunden', 15, 243, 60, 17)
    $iS2 = GUICtrlCreateInput('', 80, 240, 20, 20, $ES_NUMBER)
    $bt2 = GUICtrlCreateButton('Start', 140, 150, 50, 20)
    $iDown2 = GUICtrlCreateInput('', 200, 150, 80, 20, $ES_READONLY)

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

    GUISetState()

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

    While True
    $msg = GUIGetMsg(1)
    switch $msg[1]
    Case $gui
    Switch $msg[0]
    Case $bt
    If GUICtrlRead($iD) = '' Then
    $day = 0
    Else
    $day = GUICtrlRead($iD)
    EndIf
    If GUICtrlRead($iH) = '' Then
    $hr = 0
    Else
    $hr = GUICtrlRead($iH)
    EndIf
    If GUICtrlRead($iM) = '' Then
    $min = 0
    Else
    $min = GUICtrlRead($iM)
    EndIf
    If GUICtrlRead($iS) = '' Then
    $sec = 0
    Else
    $sec = GUICtrlRead($iS)
    EndIf
    $Sekunden = $sec + $min*60 + $hr*3600 + $day*86400
    ; oder Restsekunden aus INI einlesen:
    ; $Sekunden = IniRead($INIPath, 'Restzeit', 'Count1', 0)
    $end = _DateAdd('s', $Sekunden, _NowCalc())
    GUICtrlSetState($bt, $GUI_DISABLE)
    $Count1 = True
    If Not $Adlib Then
    $EndAdlib = 0
    AdlibEnable('SetCounter', 1000)
    $Adlib = True
    EndIf
    If $Count2 Then $EndAdlib = 0 ; wenn anderer Counter läuft, muß Zähler für Ende Null sein
    Case $bt2
    If GUICtrlRead($iD2) = '' Then
    $day2 = 0
    Else
    $day2 = GUICtrlRead($iD2)
    EndIf
    If GUICtrlRead($iH2) = '' Then
    $hr2 = 0
    Else
    $hr2 = GUICtrlRead($iH2)
    EndIf
    If GUICtrlRead($iM2) = '' Then
    $min2 = 0
    Else
    $min2 = GUICtrlRead($iM2)
    EndIf
    If GUICtrlRead($iS2) = '' Then
    $sec2 = 0
    Else
    $sec2 = GUICtrlRead($iS2)
    EndIf
    $Sekunden2 = $sec2 + $min2*60 + $hr2*3600 + $day2*86400
    ; oder Restsekunden aus INI einlesen:
    ; $Sekunden2 = IniRead($INIPath, 'Restzeit', 'Count2', 0)
    $end2 = _DateAdd('s', $Sekunden2, _NowCalc())
    GUICtrlSetState($bt2, $GUI_DISABLE)
    $Count2 = True
    If Not $Adlib Then
    $EndAdlib = 0
    AdlibEnable('SetCounter', 1000)
    $Adlib = True
    EndIf
    If $Count1 Then $EndAdlib = 0 ; wenn anderer Counter läuft, muß Zähler für Ende Null sein
    Case $GUI_EVENT_CLOSE
    ;~ IniWrite($INIPath, 'Restzeit', 'Count1', $s1)
    ;~ IniWrite($INIPath, 'Restzeit', 'Count2', $s2)
    Exit
    EndSwitch
    Case $hafterTimer1Gui
    Switch $msg[0]
    Case $GUI_EVENT_CLOSE
    GUISetState(@SW_HIDE,$hafterTimer1Gui)
    Case $GUI_Button_Login
    MsgBox(0,"Jetzt würde eingeloggt","Zeit kann während MsgBox nicht aktualisiert werden!",10,$hafterTimer1Gui)
    ;auf Login-Button reagieren
    EndSwitch
    EndSwitch
    WEnd

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

    Func SetCounter()
    If $Count1 Then
    $s1 = _DateDiff('s', _NowCalc(), $end)
    GUICtrlSetData($iDown, _FormatSec($s1))
    If $s1 = 0 Then
    $EndAdlib += 1
    GUICtrlSetState($bt, $GUI_ENABLE)
    GuiSetState(@SW_SHOW,$hafterTimer1Gui)
    $Count1 = False
    EndIf
    EndIf
    If $Count2 Then
    $s2 = _DateDiff('s', _NowCalc(), $end2)
    GUICtrlSetData($iDown2, _FormatSec($s2))
    If $s2 = 0 Then
    $EndAdlib += 1
    GUICtrlSetState($bt2, $GUI_ENABLE)
    $Count2 = False
    EndIf
    EndIf
    If $EndAdlib = 2 Then
    AdlibDisable() ; beide Counter abgelaufen
    $Adlib = False
    EndIf
    EndFunc

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

    Func _FormatSec($secShow)
    Select
    Case $secShow < 60
    Return StringFormat('%02u', $secShow) & ' s'
    Case $secShow < 60*60
    Return StringFormat('%02u', Floor($secShow/60)) & ':' & _
    StringFormat('%02u', Mod($secShow,60)) & ' min'
    Case $secShow < 60*60*24
    Return StringFormat('%02u', Floor($secShow/3600)) & ':' & _
    StringFormat('%02u', Floor(Mod($secShow,3600)/60)) & ':' & _
    StringFormat('%02u', Mod(Mod($secShow,3600),60)) & ' h'
    Case Else
    Return 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'
    EndSelect
    EndFunc

    [/autoit]

    mfg (Auto)Bert

  • Fast richtig, ist ein gutes Beispiel für mich für diese Adlib geschichte.Danke dir.

    Allerdings noch immer nciht das was cih meine :)


    Ich versuche es nochmal.


    1.) Beide Guis werden beim Start erstellt.

    2.) Gui 2 beinhaltet den Counter.

    3.) Gui 1 ist mit Buttons Combo und diversen Labels und werten aus Ini dateien bestückt.

    4.) Wenn bei Gui 2 (Counter) 1 Wert abgelaufen ist, soll eine Funktion von Gui 1 (Main) aufgerufen werden, indem ein Button oder ein Wert aus einer Combo gelesen wird und dann button gedrückt wird.

    5.) Wenn bei Gui 2 (Counter) der nächste wert auf 0 ist soll wiederum eine Funktion ausgeführt werden.

    6.) Der Wert der Counter soll wieder zurückgesetzt werden und der Timer von neuem beginnen.


    Das ist was geschehen sollte.


    Mein Problem ist, das ich beim erstellen der beiden Guis schon schwierigkeiten habe.


    1.) Nachdem ich beide Guis erstellt habe funktionieren diese erst wenn ich einmal eine der Guis schliesse :(

    2.) Wenn ich die Zeit zurücksetzen will auf einen Startwert geht er nicht mehr von vorne los.


    Ich möchte mir damit für meine diversen Server die ich im Geschäft betreue ne Logtime erstellen.

    Also immer nach ablauf bestimmter zeiten soll die Logdatei vom ERP System und vom Printserver usw. gelesen und weggespeichert werden.

    So bleibt das Systemlaufwerk schön frei.

    Beim Printserver sollen noch die Queue einträge die hängen bleiben, immer nach bestimmter zeit geprüft und gegebenenfalls gelöscht werden.

    Beim ERP system sollen immer die Printdateien diverser Member (Systemaccounts) eingeloggt werden und die Logs wegschreiben.

    Das wäre eine feine sache für meine Arbeit.


    Also Gui so zum Klicken habe ich das schon.

    Nur umbauen mit Counter wäre genial.

    Da könnte ich nen extra Pc mit den Guis laufen lassen und diese Arbeiten erledigen lassen.


    Auf meiner Workstation Scanne ich diverse Verzeichnisse nach neuen Dateien, wie z.B. Odette (Automotive VDA4905) ab.

    Da bekomme ich immer Mails wenn neue da sind um diese dann in das ERP ein zu lesen.

    Auch das könnte ich dann per Counter mit erledigen und somit meien Workstation entlasten.


    Hoffe das war jetzt etwas besser erklärt.


    Edit : Ich will nicht das Script von euch erstellt bekommen.

    Ich müsste nur wissen wie das mit dem Counter und den Guis geregelt wird.

    Denn rest bekomme ich hin.

    Bzw. teilweise hab ich das ja schon.

    Eben wie gesagt noch nie mit 2 Guis gearbeitet und dann jetzt gleich dieses Problem damit.


    P.s: Ist es evtl. sinnvoller das mit 2 Scripts zu machen ?

    Also ne Gui mit Counter wo ich dann das Andere Script anspreche ?

    Finde es halt innerhalb eines Scriptes besser weil ich da dann alle Controls direkt ansprechen kann.


    Wie ist eure Erfahrung mit sowas ?

    MfG

    Einmal editiert, zuletzt von Observer (7. Juni 2009 um 16:58)

  • Hui langer Post.. hab nur den Anfang gelesen (=> faul :D), aber du hast einen kleinen Denkfehler:
    Wenn du 2 Guis hast, hast du nich 2 unterschiedliche Programme oder so.. du kannst problemlos alle Controls von allen Guis bedienen, da du ja die jeweiligen Handles in den Variablen speicherst...

    Spoiler anzeigen
    [autoit]

    #include <guiconstants.au3>
    #include <windowsconstants.au3>
    #include <Date.au3>

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

    Opt("GuiOnEventMode",1)
    Global $arBt[8][2], $arIn[8][3], $arCounter[8][2], $y = 10, $input
    $Gui1 = GUICreate('test')
    For $i = 0 To UBound($arBt) - 1
    $arBt[$i][0] = GUICtrlCreateButton('set Time', 10, $y, 60, 20)
    GuiCtrlSetOnEvent(-1, "_set")
    $arIn[$i][0] = GUICtrlCreateInput('', 80, $y, 40, 20)
    $arCounter[$i][0] = GUICtrlCreateLabel('', 140, $y + 3, 80, 17)
    $arBt[$i][1] = GUICtrlCreateButton('Reset', 240, $y, 60, 20)
    GuiCtrlSetOnEvent(-1, "_reset")
    GUICtrlSetState($arBt[$i][1], $GUI_DISABLE)
    $y += 30
    Next

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

    $Gui2 = GUICreate('Test2')
    $GUI_Button_Login = GUICtrlCreateInput("Login", 50, 50, 100, 30)

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

    GuiSetOnEvent($GUI_EVENT_CLOSE, "_exit", $Gui1)
    GuiSetOnEvent($GUI_EVENT_CLOSE, "_exit", $Gui2)
    GUISetState(@SW_SHOW,$Gui2)
    GUISetState(@SW_SHOW,$Gui1)

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

    While 1
    sleep(100)
    _SetCounter()
    Wend

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

    Func _set()
    $i = Int(@Gui_CtrlId/4)
    ConsoleWrite($i)
    $arCounter[$i][1] = 1
    $input = GUICtrlRead($arIn[$i][0])
    If $input = '' Then return
    If StringInStr($input, ':') Then
    $input = StringSplit($input, ':')
    $input = $input[1] * 60 + $input[2]
    EndIf
    $arIn[$i][1] = $input * 60
    $arIn[$i][2] = _NowCalc()
    GUICtrlSetState($arBt[$i][0], $GUI_DISABLE)
    GUICtrlSetState($arBt[$i][1], $GUI_ENABLE)
    EndFunc

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

    Func _reset()
    $i = Int(@Gui_CtrlId/4)-1
    ConsoleWrite($i)
    GUICtrlSetState($arBt[$i][0], $GUI_ENABLE)
    GUICtrlSetState($arBt[$i][1], $GUI_DISABLE)
    GUICtrlSetData($arCounter[$i][0], '')
    GUICtrlSetData($arIn[$i][0], '')
    $arIn[$i][1] = 0
    EndFunc

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

    Func _Exit()
    Exit
    EndFunc

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

    Func _SetCounter()
    Local $sec
    For $i = 0 To UBound($arCounter) - 1
    If $arCounter[$i][1] <> 1 Then ContinueLoop
    If $arIn[$i][1] = 0 Then ContinueLoop
    $sec = $arIn[$i][1] - _DateDiff("s", $arIn[$i][2], _NowCalc())
    Select
    Case $sec < 60
    GUICtrlSetData($arCounter[$i][0], StringFormat('%02u', $sec) & ' s')
    Case $sec < 60 * 60
    GUICtrlSetData($arCounter[$i][0], StringFormat('%02u', Floor($sec / 60)) & ':' & _
    StringFormat('%02u', Mod($sec, 60)) & ' min')
    Case $sec < 60 * 60 * 24
    GUICtrlSetData($arCounter[$i][0], StringFormat('%02u', Floor($sec / 3600)) & ':' & _
    StringFormat('%02u', Floor(Mod($sec, 3600) / 60)) & ':' & _
    StringFormat('%02u', Mod(Mod($sec, 3600), 60)) & ' h')
    EndSelect
    If $sec = 0 Then
    $arCounter[$i][1] = 0
    Switch $i
    Case 0
    GuiCtrlSetData($GUI_Button_Login, "Timer 0 abgelaufen!")
    Case 1
    GuiCtrlSetData($GUI_Button_Login, "Timer 1 abgelaufen!")
    Case 2
    GuiCtrlSetData($GUI_Button_Login, "Timer 2 abgelaufen!")
    Case Else
    GuiCtrlSetData($GUI_Button_Login, "und so weiter!")
    EndSwitch

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

    EndIf
    Next
    EndFunc ;==>_SetCounter

    [/autoit]
  • Hm, ok dein Beispiel ist schon besser.

    Allerdings ist da kein Denkfehler von mir :)

    Ich weis das 2 Guis ein Prog sind wenn sie zusammen aufgerufen werden.


    Nur ging es mir eben um die Frage ob es sinnvoller ist zwecks der Timer geschichte das in 2 Scripten zu machen.


    Aber seis drum.


    Hast fast alles damit beantwortet bis auf eines, wie kann ich den Counter wenn er seine Funktion ausgeführt hat dazu bewegen die selbe eingegebene Ablaufzeit wiederholt durch zu gehen ?


    Also von sich aus ohne Interaktion von mir :)


    Danke dir für dein Script, ist wie gesagt schon fast das was ich brauche dafür.


    Soll aber Praktischerweie ne Art Repeat haben.

    Edit : Hat sich doch erledigt.
    Brauch ja nur _SetCounter() die daten übergeben für $i usw. also _SetCounter($i) bzw. _SetCounter($i,$Default)
    $Default mit dem Default Zeitwert füllen und das dann entsprechend abarbeiten.


    Thx

    Einmal editiert, zuletzt von Observer (8. Juni 2009 um 08:04)