Grundprobleme mit GuiCtrlSetOnEvent

  • Hey, ich habe es bisher noch bei KEINEM meiner Programme geschafft, das umzusetzen... Oo Vielleicht könnt ihr mir helfen :=)...
    Habe mal ein gaaaaanz einfaches Grundscript aufgebaut, dass mein Problem verdeutlicht...
    Und ich will nicht mit einem Switch arbeiten, nein... ;)

    Problem -> Sobald meine Gui aus der "Anfangsschleife" raus ist und in eine Funktionsschleife übergeht, kann ich NICHTS mehr in meiner GUI "nutzen"...
    Bei allen Programmen, egal, was ich schon versucht habe... Ich hoffe, ihr könnt mir anhand des Beispielscripts helfen :)...

    [autoit]


    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>

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

    Opt("GUIOnEventMode", 1)

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

    $var = 0

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

    #Region ### START Koda GUI section ### Form=
    $Form2 = GUICreate("Form2", 285, 105, 302, 218)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_exit")
    $Button1 = GUICtrlCreateButton("Start", 24, 40, 97, 25, $WS_GROUP)
    GUICtrlSetOnEvent($Button1, "_start")
    $Button2 = GUICtrlCreateButton("Ergebnis", 144, 40, 97, 25, $WS_GROUP)
    GUICtrlSetOnEvent($Button2, "_erg")
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    Func _start()
    While 1
    $var += 1
    Sleep (500)
    if $var = 5 OR $var = 10 OR $var = 15 OR $var = 20 Then MsgBox(64, "...", "Siehste, er zählt...!")
    Wend
    EndFunc

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

    Func _erg()
    MsgBox(64, "", $var)
    EndFunc

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

    Func _exit()
    Exit
    EndFunc

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

    While 1
    Sleep (50)
    Wend

    [/autoit]


    Mir hat jemand gesagt, dass der Befehl nur in der HAUPTSchleife klappt und ich daher das GANZE Script in die Hauptschleife packen muss und nur mit Wahrheitswerten arbeiten kann, die halt in FUnktionen durch GuiCtrlOnEvent gesetzt werden...

    Ist das so richtig? Gibts da ne alternative Lösung?


    LG

    LG

    4 Mal editiert, zuletzt von Acanis (10. Januar 2010 um 11:26)

    • Offizieller Beitrag
    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>

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

    Opt("GUIOnEventMode", 1)
    $Do = False
    $var = 0

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

    #Region ### START Koda GUI section ### Form=
    $Form2 = GUICreate("Form2", 285, 105, 302, 218)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_exit")
    $Button1 = GUICtrlCreateButton("Start", 24, 40, 97, 25, $WS_GROUP)
    GUICtrlSetOnEvent($Button1, "_start")
    $Button2 = GUICtrlCreateButton("Ergebnis", 144, 40, 97, 25, $WS_GROUP)
    GUICtrlSetOnEvent($Button2, "_erg")
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    Func _start()
    $Do = True
    $var = 1
    EndFunc

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

    Func _erg()
    MsgBox(64, "", $var)
    EndFunc

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

    Func _exit()
    Exit
    EndFunc

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

    While 1
    If $Do Then
    While 1
    $var += 1
    Sleep (500)
    if $var = 5 OR $var = 10 OR $var = 15 OR $var = 20 Then MsgBox(64, "...", "Siehste, er zählt...!")
    WEnd
    EndIf
    Wend

    [/autoit] [autoit][/autoit] [autoit][/autoit]
  • Ja, danke... Aber das ist ja die Frage...

    Kann ich das NUR lösen, wenn ich das in die Hauptschleife packe?...

    Denn habe einige Scripte, mit mehr als 15 Funktionen... Muss ich die nu alle so umschreiben, dass die in einer Schleife sind? ;(


    LG

    • Offizieller Beitrag

    Du mußt die Funktion die bei GuiCtrlSetOnEvent aufgerufen wird, so schnell wie möglich beenden, weil sost die GUI blockiert wird.

  • Hmmm, danke... Also kann ich da nur ganz fixe Funktionen drin lassen? :)

    Aber dann kann ich auch gleich eig. alles ausgliedern...

    Habe jetzt z.B. aus ->

    [autoit]

    Func _save()
    IniWrite(@ScriptDir & "/Data/config.ini", "LogIn", "Username", GUICtrlRead($Login1))
    IniWrite(@ScriptDir & "/Data/config.ini", "LogIn", "Password", _StringEncrypt(1, GUICtrlRead($Login2), "****"))
    EndFunc

    [/autoit][autoit]


    Func _save()
    $f_save = True
    EndFunc

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

    ;########## _save ##########
    if $f_save Then
    IniWrite(@ScriptDir & "/Data/config.ini", "LogIn", "Username", GUICtrlRead($Login1))
    IniWrite(@ScriptDir & "/Data/config.ini", "LogIn", "Password", _StringEncrypt(1, GUICtrlRead($Login2), "****"))
    $f_save = False
    EndIf
    ;########## _save ##########

    [/autoit]

    (In der Hauptschleife halt...)

    gemacht... Das sollte dann doch eig. gut und nur 1x'ig (wie ein Button halt) funktionieren, oder?^^

    Oder sollte man sowas schon in Funktionen lassen?^^

    Der soll sich halt einfach nur den Usernamen und das PW für mein Script merken... *hm*


    LG

    • Offizieller Beitrag

    Wenn die Funktionen nicht Zeitintensiv sind kannst du sie auch als solche belassen. Was du nicht machen kannst, sind Sachen gleichzeitig auszuführen. Ich hab dir mal ein Beispiel gemacht wie du Funktionen aufrufen kannst, aber die Gui trotzdem reagiert.

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>

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

    Opt("GUIOnEventMode", 1)

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

    $var = 0

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

    #Region ### START Koda GUI section ### Form=
    $Form2 = GUICreate("Form2", 285, 105, 302, 218)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_exit")
    $Button1 = GUICtrlCreateButton("Start1", 24, 40, 97, 25, $WS_GROUP)
    GUICtrlSetOnEvent($Button1, "_start")
    $Button2 = GUICtrlCreateButton("Start2", 144, 40, 97, 25, $WS_GROUP)
    GUICtrlSetOnEvent($Button2, "_erg")
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    Func _start()
    AdlibRegister("Test1",50)
    EndFunc

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

    Func _erg()
    AdlibRegister("Test2",50)
    EndFunc

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

    Func _exit()
    Exit
    EndFunc

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

    While 1
    Sleep (50)
    Wend

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

    Func test1()

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

    AdlibUnRegister("Test1")
    GUICtrlSetState($Button2,$GUI_DISABLE)
    For $i = 1 To 10000
    ConsoleWrite("Counter 1:"&$i & @CRLF)
    Next
    GUICtrlSetState($Button2,$GUI_ENABLE)
    EndFunc

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

    Func test2()
    GUICtrlSetState($Button1,$GUI_DISABLE)
    AdlibUnRegister("Test2")
    For $i = 1 To 10000
    ConsoleWrite("Counter 2:"&$i & @CRLF)
    Next
    GUICtrlSetState($Button1,$GUI_ENABLE)
    EndFunc

    [/autoit]


    Wenn du jetzt Test1 oder Test2 drückst wird die Funktion ausgeführt, auch mehrmals wenn der Button öfter gedrückt wurde. Aber nur nacheinanader. Ob das Sinnvoll ist läßt sich aber bezweifeln. Solange eine Funktion läuft könntest du auch den Button für diese Funktion deaktivieren.

  • Klappt leider nicht... Oo

    Adlibregister und unregister gibt es doch gar nicht mehr, oder? oO


    LG

  • Achso, ja, danke xD... Nu geht es :) *peinlich*

    Ist auf jeden Fall schon interessant *hmmm*...^^


    LG

  • Zitat

    Hmmm, danke... Also kann ich da nur ganz fixe Funktionen drin lassen?
    Aber dann kann ich auch gleich eig. alles ausgliedern...

    Ja, genau das ist der Sinn. Generell ist es problematisch, bei Verwendung von GuiCtrlSetOnEvent() mit Messageboxen zu arbeiten, ohne die Msgbox als Taskmodal (Flag 8192) zu benutzen.
    Das Problem ist ja nicht die Dauer der Funktion, sondern daß du während der Laufzeit der Funktion diese oder eine andere Funktion wieder startest.
    Wenn man also zeitintensive Funktionen benutzt, dann sollte man sich z.B. Funktionen _DisableGUI() und _EnableGUI() schreiben, welche verhindern, daß man die GUI bzw deren Elemente benutzen kann, solange die zeitintensive Funktion läuft.

    [autoit]

    func _dasdauertziemlichlange()
    _DisableGUI() ; verhindert Zugriff auf die GUI

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

    ;zeitintensive Tätigkeit des Programms

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

    _EnableGUI() ;ermöglicht Zugriff auf die Elemente der GUI
    endfunc

    [/autoit]
  • Hm, danke...^^


    Und wie löse ich das am Besten, wenn ich eine "Funktion" habe, die ich eig. 12x wieder genau so nutzen muss?!...
    Die aber zeitaufwendig ist...

    Bin da grade beim Umschreiben dran... Aber bevor der Rest des Scripts weiter geht, muss das komplett erledigt sein :)...


    Wie regelt man sowas dann gut? 12x die Func ins Script hauen?...


    LG