Buttonklick erkenne trotz Schleife in Unterfunktion

  • Hallo,

    irgendwie stehe ich auf dem Schlauch und komme nicht weiter. Ich habe eine GUI gebaut, die einen Button hat. Beim Klicken auf den Button wird eine Funktion aufgerufen die in einer Schleife weitere Befehle abarbeitet.

    Ich möchte nun, dass wenn ich während die Schleife läuft auf den Button klicke die Schleife beendet wird und dann wieder durch Klicken auf den Button neu gestartet werden kann.

    [autoit]

    $GUIWidth = 620
    $GUIHeight = 380

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

    $FormUpdater = GUICreate("User Files Updaten", $GUIWidth, $GUIHeight, 192, 114, $WS_CAPTION)

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

    $ProgressLeft = 16
    $ProgressBar1 = GUICtrlCreateProgress($ProgressLeft, 320, $GUIWidth - 2 * $ProgressLeft, 22, $PBS_SMOOTH)
    $ProgressbarLabel = GUICtrlCreateLabel('0%', $ProgressLeft, 324, $GUIWidth - 2 * $ProgressLeft, 14, $SS_CENTER) ; Prozentanzeige innerhalb der Progressbar
    GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT) ; Transparenter Hintergrund für das Label

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

    $ButtonCommand = GUICtrlCreateButton("Start", 520, $GUIHeight - 8 - 25, 91, 25, $WS_GROUP)
    $LabelHeader = GUICtrlCreateLabel("ELCAD Benutzerverwaltung aktualisierung", 16, 8, 602, 33)
    GUICtrlSetFont(-1, 18, 800, 0, "MS Sans Serif")
    $EditForm = GUICtrlCreateEdit("", 16, 48, 593, 265, $WS_VSCROLL + $ES_WANTRETURN + $ES_AUTOHSCROLL + $ES_READONLY)

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

    $hEdit = GUICtrlGetHandle($EditForm)
    GUICtrlSetData(-1, "Projektsuche")
    GUICtrlSetFont(-1, 12, 400, 0, "MS Sans Serif")
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    $a = 1

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit

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

    Case $ButtonCommand
    Global $BtnID = $nMsg
    MsgBox(0, "", $nMsg)
    If GUICtrlRead($ButtonCommand) = "Start" Then
    GUICtrlSetData($ButtonCommand, "Abbrechen")
    MasterFunc()
    GUICtrlSetData($ButtonCommand, "Schliessen")
    Else
    Exit
    EndIf
    EndSwitch
    WEnd
    ...
    Func MasterFunc()

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

    $Temp = GUICtrlRead($EditForm)
    GUICtrlSetData($EditForm, $Temp & @CRLF & "Projektsuche gestartet")
    _GUICtrlEdit_LineScroll($hEdit, 0, _GUICtrlEdit_GetLineCount($hEdit))
    $MasterUserDate = StringLeft(FileGetTime($MasterUserDatFile, 0, 1), 8)

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

    $FolderList = _FileListToRekursiv($LocalProjectFolder, "*.pro", 2)
    $Temp = GUICtrlRead($EditForm)
    GUICtrlSetData($EditForm, $Temp & @CRLF & "Projektsuche abgeschlossen")
    _GUICtrlEdit_LineScroll($hEdit, 0, _GUICtrlEdit_GetLineCount($hEdit))

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

    For $i = 1 To $FolderList[0]

    ; HIER WIRD DAS ERGEBNIS VON _FileListToRekursiv abgearbeitet ....

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

    GUICtrlSetData($ProgressBar1, 100 / $FolderList[0] * $i)
    GUICtrlSetData($ProgressbarLabel, Round(100 / $FolderList[0] * $i, 0) & '%') ; neuen Wert für das Label schreiben

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

    If CheckButton() = 0 Then
    $Temp = GUICtrlRead($EditForm)
    GUICtrlSetData($EditForm, $Temp & @CRLF & @CRLF & "---- Abbruch durch Benutzer! ---- " & $FolderList[$i])
    _GUICtrlEdit_LineScroll($hEdit, 0, _GUICtrlEdit_GetLineCount($hEdit))
    GUICtrlSetData($ButtonCommand, "Start")
    ExitLoop
    EndIf

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

    Next

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

    EndFunc ;==>MasterFunc

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

    Func CheckButton()

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

    $nMsg = GUIGetMsg()
    MsgBox(0, "", $nMsg)
    MsgBox(0, "", $ButtonCommand)

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

    If $nMsg = $ButtonCommand Then
    If GUICtrlRead($ButtonCommand) = "Abbrechen" Then
    Return 0
    Else
    Return 1
    EndIf
    EndIf

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

    EndFunc ;==>CheckButton

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

    Kennt jemand eine Möglichkeit das zu realisieren?

    Vielen Dank schon mal für eure Antworten!!!

    Gruß
    Steffen

  • Danke für den Tip.

    Habe nun den Aufruf der Unterfunktion mittels GUISetOnEvent($GUI_EVENT_PRIMARYDOWN, "CheckButton") angepasst.
    Wird die GUI gestartet und klicke ich auf den Button wird die Unterfunktion gestartet und in der Schleife die Befehle abgearbeitet.
    Klicke ich nun aber nochmals auf den Button müsste doch eigentlich nochmal die Funktion "CheckButton" aufgerufen werden. Das passiert aber nicht. Ich kann auf den Button klicken wir ich will, die Funtion wird nicht nochmal gestartet.

    Hier nochmal mein Code:

    [autoit]

    Global $RunFLag = 1
    #Region ### START Koda GUI section ### Form=I:\I0603_ECAD_Austauschdaten\ELCAD\Command.auc\AutoIt\ELCADUserUpdate\FormELCADUserUpdater.kxf
    $GUIWidth = 620
    $GUIHeight = 380
    Local $GUITitel = "User Files Updaten"
    $FormUpdater = GUICreate($GUITitel, $GUIWidth, $GUIHeight, 192, 114)

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

    GUISetOnEvent($GUI_EVENT_CLOSE, "SpecialEvents")
    GUISetOnEvent($GUI_EVENT_MINIMIZE, "SpecialEvents")
    GUISetOnEvent($GUI_EVENT_RESTORE, "SpecialEvents")
    GUISetOnEvent($GUI_EVENT_PRIMARYDOWN, "CheckButton")
    $ProgressLeft = 16
    $ProgressBar1 = GUICtrlCreateProgress($ProgressLeft, 320, $GUIWidth - 2 * $ProgressLeft, 22, $PBS_SMOOTH)
    $ProgressbarLabel = GUICtrlCreateLabel('0%', $ProgressLeft, 324, $GUIWidth - 2 * $ProgressLeft, 14, $SS_CENTER) ; Prozentanzeige innerhalb der Progressbar
    GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT) ; Transparenter Hintergrund für das Label

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

    $ButtonCommand = GUICtrlCreateButton("Start", 520, $GUIHeight - 8 - 25, 91, 25, $WS_GROUP)

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

    $LabelHeader = GUICtrlCreateLabel("ELCAD Benutzerverwaltung aktualisierung", 16, 8, 602, 33)
    GUICtrlSetFont(-1, 18, 800, 0, "MS Sans Serif")
    $EditForm = GUICtrlCreateEdit("", 16, 48, 593, 265, $WS_VSCROLL + $ES_WANTRETURN + $ES_AUTOHSCROLL + $ES_READONLY)

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

    $hEdit = GUICtrlGetHandle($EditForm)
    GUICtrlSetData(-1, "Projektsuche")
    GUICtrlSetFont(-1, 12, 400, 0, "MS Sans Serif")
    GUISetState(@SW_SHOW)

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

    While 1

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

    Sleep(250)
    WEnd

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

    Func MasterFunc()

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

    $Temp = GUICtrlRead($EditForm)
    GUICtrlSetData($EditForm, $Temp & @CRLF & "Projektsuche gestartet")
    _GUICtrlEdit_LineScroll($hEdit, 0, _GUICtrlEdit_GetLineCount($hEdit))
    $MasterUserDate = StringLeft(FileGetTime($MasterUserDatFile, 0, 1), 8)

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

    $FolderList = _FileListToRekursiv($LocalProjectFolder, "*.pro", 2)
    $Temp = GUICtrlRead($EditForm)
    GUICtrlSetData($EditForm, $Temp & @CRLF & "Projektsuche abgeschlossen")
    _GUICtrlEdit_LineScroll($hEdit, 0, _GUICtrlEdit_GetLineCount($hEdit))

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

    For $i = 1 To $FolderList[0]

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

    ; Hier werden die Befehle angearbeitet ........

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

    GUICtrlSetData($ProgressBar1, 100 / $FolderList[0] * $i)
    GUICtrlSetData($ProgressbarLabel, Round(100 / $FolderList[0] * $i, 0) & '%') ; neuen Wert für das Label schreiben

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

    If $RunFLag = 0 Then
    $Temp = GUICtrlRead($EditForm)
    GUICtrlSetData($EditForm, $Temp & @CRLF & @CRLF & "---- Abbruch durch Benutzer! ---- " & $FolderList[$i])
    _GUICtrlEdit_LineScroll($hEdit, 0, _GUICtrlEdit_GetLineCount($hEdit))
    GUICtrlSetData($ButtonCommand, "Start")
    ExitLoop
    Else
    MsgBox(0, "", "Runflag = 1", 1)
    EndIf

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

    Next

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

    EndFunc ;==>MasterFunc

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

    Func CheckButton()
    $BtnText = GUICtrlRead($ButtonCommand) ; Text des Button einlesen

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

    If $BtnText = "Start" Then ; Wenn der Buttontext = Start, dann
    GUICtrlSetData($ButtonCommand, "Abbrechen") ; Buttontext auf Abbrechen setzen
    $RunFLag = 1 ; RunFlag auf 1 Setzen (Schleife soll weiterlaufen)
    MasterFunc() ; Unterfunktion aufrufen

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

    ElseIf $BtnText = "Abbrechen" Then ; Ist der Buttontext = Abbrechen, dann
    $RunFLag = 0; RunFlag auf 0 Setzen (Schleife soll BEENDET werden)

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

    Else ; Sonstiger Buttontext (z.B: Schliessen)
    Exit
    EndIf

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

    EndFunc ;==>CheckButton

    [/autoit]
  • Du musst, wenn Du den GUIOnEventMode verwenden möchtest, auch die Zeile, die ich in meinem letzten Post aufgeführt habe, am Anfang Deines Scripts einfügen. Sonst befindet sich Deine GUI im GuiGetMsgMode.
    Außerdem würde ich Dir empfehlen, die verschiedenen Controls selbst ebenfalls mit Funktionen zu verknüpfen.

    [autoit]


    ;die Erstellung der GUI
    $Button = GUICtrlCreateButton("Test", 0, 0, 75, 75)
    GUICtrlSetOnEvent(-1, "_Test")
    Func _Test ()
    ;hier kommt der Code der Funktion
    EndFunc

    [/autoit]
  • Hab ich auch gemacht, der Code ist nur nicht vollständig hochgeladen, da es sonst zu unübersichtlich wird.

    Opt("GUIOnEventMode", 1)

    ist definitiv am Anfang des Scripts enthalten!

    Aber Danke, dass hätte ich auch leicht vergessen können!

    Was mir aufgefallen ist, auch GUI über X schliessen oder minimieren nicht funktionieren während der Schleife in der Unterfunktion nicht.

    Gruß
    Steffen

  • Um die GUI über das Kreuz in der rechten oberen Ecke des Fensters beenden zu können, müsstest Du folgende Zeilen hinzufügen:

    [autoit]


    #include-once
    #include <GUIConstants.au3>

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

    ;Erstellen der GUI
    GUISetOnEvent($GUI_EVENT_CLOSE, "_Beenden")

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

    Func _Beenden ()
    Exit
    EndFunc

    [/autoit]
  • Auch der OnEvent Mode löst das Problem nicht, das ist schlichtweg falsch. Hier eine Demo GUI die in der Console genau zeigt was passiert. Auch im OnEvent Mode wird der Button Druck erst registriert nachdem die Schleife/Funktion verlassen wurde, nicht während sich das Script noch in der Schleife befindet:


    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>

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

    Global $stop = 0

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

    Opt("GUIOnEventMode", 1) ; Wechsle in den OnEvent Modus
    $mainwindow = GUICreate("Hallo Welt", 200, 100)
    $counter = GUICtrlCreateLabel("Ich mache nix!", 30, 10)
    $okbutton = GUICtrlCreateButton("Start", 70, 50, 60)

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

    GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")
    GUICtrlSetOnEvent($okbutton, "OKButton")

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

    GUISetState(@SW_SHOW)

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

    While 1
    Sleep(1000) ; Im Leerlauf bummeln
    WEnd

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

    Func OKButton()
    if $stop = 0 Then
    ConsoleWrite(@CRLF & "Es wurde start gedrückt" & @CRLF)
    GUICtrlSetData($okbutton,"Stop")
    $stop = 1
    endlosschleife()
    Else
    ConsoleWrite(@CRLF & "Es wurde stop gedrückt" & @CRLF)
    GUICtrlSetData($okbutton,"Start")
    GUICtrlSetData($counter,"Ich mache nix!")
    $stop = 0
    EndIf
    EndFunc

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

    Func CLOSEClicked()
    Exit
    EndFunc

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

    Func endlosschleife()
    Local $i = 1
    ConsoleWrite(@CRLF & "Funktion endlosschleife wurde aufgerufen" & @CRLF)
    While $stop = 1
    GUICtrlSetData($counter,$i)
    if $i = 10 then
    ConsoleWrite(@CRLF & "Schleife wurde nach 10 sekunden automatisch verlassen, nicht über den button!" & @CRLF)
    ExitLoop
    EndIf
    $i+=1
    Sleep(1000)
    WEnd
    ConsoleWrite(@CRLF & "Schleife wurde verlassen, funktion endlosschleife wird nun beendet..." & @CRLF)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit]
  • Da hast du recht - und habe ich auch. Bie der GUI definition habe ich den Aufruf integriert

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

    GUISetOnEvent($GUI_EVENT_CLOSE, "SpecialEvents")
    GUISetOnEvent($GUI_EVENT_MINIMIZE, "SpecialEvents")
    GUISetOnEvent($GUI_EVENT_RESTORE, "SpecialEvents")

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

    Func SpecialEvents()
    Select
    Case @GUI_CtrlId = $GUI_EVENT_CLOSE
    ;MsgBox(0, "Schliessen gedrückt", "ID=" & @GUI_CtrlId & " WinHandle=" & @GUI_WinHandle)
    Exit

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

    Case @GUI_CtrlId = $GUI_EVENT_MINIMIZE
    ;MsgBox(0, "Fenster minimiert", "ID=" & @GUI_CtrlId & " WinHandle=" & @GUI_WinHandle)

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

    Case @GUI_CtrlId = $GUI_EVENT_RESTORE
    ;MsgBox(0, "Fenster wiederhergestellt", "ID=" & @GUI_CtrlId & " WinHandle=" & @GUI_WinHandle)

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

    EndSelect
    EndFunc ;==>SpecialEvents

    [/autoit]

    So langsam glaube ich, dass kriege ich so nicht hin. Muss es dann halt über eine HotKeySet machen - oder hast du oder jemand anders noch eine Idee?

    Gruß
    Steffen

  • Hallo s.koni,

    das ganze lässt sich auch im GuiGetMsg-Modus (den du ja anscheinend bevorzugst) lösen:

    Spoiler anzeigen
    [autoit]

    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <ProgressConstants.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #Include <GuiEdit.au3>

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

    #Include <File.au3> ;wieder öschen

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

    $GUIWidth = 620
    $GUIHeight = 380

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

    $FormUpdater = GUICreate("User Files Updaten", $GUIWidth, $GUIHeight, 192, 114, $WS_CAPTION)

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

    $ProgressLeft = 16
    $ProgressBar1 = GUICtrlCreateProgress($ProgressLeft, 320, $GUIWidth - 2 * $ProgressLeft, 22, $PBS_SMOOTH)
    $ProgressbarLabel = GUICtrlCreateLabel('0%', $ProgressLeft, 324, $GUIWidth - 2 * $ProgressLeft, 14, $SS_CENTER) ; Prozentanzeige innerhalb der Progressbar
    GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT) ; Transparenter Hintergrund für das Label

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

    $ButtonCommand = GUICtrlCreateButton("Start", 520, $GUIHeight - 8 - 25, 91, 25, $WS_GROUP)
    $LabelHeader = GUICtrlCreateLabel("ELCAD Benutzerverwaltung aktualisierung", 16, 8, 602, 33)
    GUICtrlSetFont(-1, 18, 800, 0, "MS Sans Serif")
    $EditForm = GUICtrlCreateEdit("", 16, 48, 593, 265, $WS_VSCROLL + $ES_WANTRETURN + $ES_AUTOHSCROLL + $ES_READONLY)

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

    $hEdit = GUICtrlGetHandle($EditForm)
    GUICtrlSetData(-1, "Projektsuche")
    GUICtrlSetFont(-1, 12, 400, 0, "MS Sans Serif")
    GUISetState(@SW_SHOW)
    #endregion ### END Koda GUI section ###
    Global $MasterUserDatFile
    $a = 1

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

    Func _eventHandler($nMsg)
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit

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

    Case $ButtonCommand
    Global $BtnID = $nMsg
    MsgBox(0, "", $nMsg)
    $sAction = GUICtrlRead($ButtonCommand)
    Switch $sAction
    Case "Start"
    GUICtrlSetData($ButtonCommand, "Abbrechen")
    MasterFunc()
    GUICtrlSetData($ButtonCommand, "Schliessen")
    Case Else
    Exit
    EndSwitch
    EndSwitch
    EndFunc ;==>_eventHandler

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

    While 1
    $nMsg = GUIGetMsg()
    _eventHandler($nMsg)
    WEnd

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

    Func MasterFunc()

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

    $Temp = GUICtrlRead($EditForm)
    GUICtrlSetData($EditForm, $Temp & @CRLF & "Projektsuche gestartet")
    _GUICtrlEdit_LineScroll($hEdit, 0, _GUICtrlEdit_GetLineCount($hEdit))
    $MasterUserDate = StringLeft(FileGetTime($MasterUserDatFile, 0, 1), 8)

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

    ;$FolderList = _FileListToRekursiv($LocalProjectFolder, "*.pro", 2) wieder ferigeben
    $FolderList = _FileListToArray(@ScriptDir) ;wieder öschen
    $Temp = GUICtrlRead($EditForm)
    GUICtrlSetData($EditForm, $Temp & @CRLF & "Projektsuche abgeschlossen")
    _GUICtrlEdit_LineScroll($hEdit, 0, _GUICtrlEdit_GetLineCount($hEdit))

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

    For $i = 1 To $FolderList[0]

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

    ; HIER WIRD DAS ERGEBNIS VON _FileListToRekursiv abgearbeitet ....

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

    GUICtrlSetData($ProgressBar1, 100 / $FolderList[0] * $i)
    GUICtrlSetData($ProgressbarLabel, Round(100 / $FolderList[0] * $i, 0) & '%') ; neuen Wert für das Label schreiben
    _eventHandler(GUIGetMsg())
    Next

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

    EndFunc ;==>MasterFunc

    [/autoit]

    mfg autoBert

  • Bleibt aber für mich trotzdem noch die Frage wie man das im OnEvent Mode realisieren könnte. Guigetmsg() innerhalb der fraglichen Funktion/Schleife ist im OnEvent Mode ja nicht möglich, da dort guigetmsg immer 0 als return wert besitzt, in meinem Beispielscript funktioniert es auch nicht wenn man das event nochmals neu innerhalb der Funktion oder gar Schleife mit GUICtrlSetOnEvent(..) festlegt.

  • Moin,

    solange das Skript so übersichtlich bleibt:

    GUIOnEventMode
    [autoit]

    #include <GuiConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <ListBoxConstants.au3>

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

    Global $RunMain = False

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

    Opt("GUIOnEventMode", 1)
    $hGUI = GUICreate("GUI")
    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
    $idLB = GUICtrlCreateList("", 20, 20, 360, 320, BitOR($WS_BORDER, $WS_VSCROLL))
    $idBtn = GUICtrlCreateButton("Start", 20, 360, 170)
    GUICtrlSetOnEvent(-1, "_BtnStart")
    GUISetState()

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

    While True
    Sleep(100)
    WEnd
    ; ===============================================================================================================================
    Func _Exit()
    Exit
    EndFunc
    ; ===============================================================================================================================
    Func _BtnStart()
    Local $Caption = GUICtrlRead($idBtn)
    Switch $Caption
    Case "Start"
    $RunMain = True
    GUICtrlSetData($idBtn, "Abbruch")
    AdlibRegister("_Main", 10)
    Case "Abbruch"
    $RunMain = False
    GUICtrlSetData($idBtn, "Start")
    EndSwitch
    EndFunc
    ; ===============================================================================================================================
    Func _Main()
    AdlibUnRegister("_Main")
    Local $I = 0
    Local $MaxI = 100
    GUICtrlSetData($idLB, "|Gleich geht's los!")
    Sleep(1000)
    While $RunMain And ($I < $MaxI)
    $I += 1
    GUICtrlSetData($idLB, "Aktion " & $I & " von " & $MaxI)
    GUICtrlSendMsg($idLB, $LB_SETCARETINDEX, $I, 0)
    Sleep(100)
    WEnd
    If $RunMain Then
    GUICtrlSetData($idLB, "Fertig!")
    Else
    GUICtrlSetData($idLB, "Abbruch durch Benutzer!")
    EndIf
    $RunMain = False
    GUICtrlSetData($idBtn, "Start")
    GUICtrlSendMsg($idLB, $LB_SETCARETINDEX, GUICtrlSendMsg($idLB, $LB_GETCOUNT, 0, 0) - 1, 0)
    EndFunc

    [/autoit]
  • Zitat

    . Guigetmsg() innerhalb der fraglichen Funktion/Schleife ist im OnEvent Mode ja nicht möglich, da dort guigetmsg immer 0 als return wert besitzt,


    Einfach OnEvent-Mode bei der Nutzung von GUIGetMsg kurzzeitig deaktivieren..

    [autoit]


    ; Some Code for OnEvent here...

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

    Func OnEventFunc()
    Local $iOpt = Opt("GUIOnEventMode", 0) ; turn off On-Event
    While GUIGetMsg() <> $cButtonWeiter ; use GuiGetMsg()
    WEnd
    Opt("GUIOnEventMode", $iOpt) ; Set On-Event to the old state.
    EndFunc

    [/autoit]

    Übrigens: Wenn du es mit AdlibRegister machst, kannst du jede Funktion mit jedem Inhalt zu jedem Zeitpunkt deiner Wahl ausführen - und das ohne nervige Beschränkungen. Hab das Script von misterspeed mal angepasst:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>

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

    Global $stop = 0

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

    Opt("GUIOnEventMode", 1) ; Wechsle in den OnEvent Modus
    $mainwindow = GUICreate("Hallo Welt", 200, 100)
    $counter = GUICtrlCreateLabel("Ich mache nix!", 30, 10)
    $okbutton = GUICtrlCreateButton("Start", 70, 50, 60)

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

    GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")
    GUICtrlSetOnEvent($okbutton, "OKButton")

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

    GUISetState(@SW_SHOW)

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

    While 1
    Sleep(1000) ; Im Leerlauf bummeln
    WEnd

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

    Func OKButton()
    If $stop = 0 Then
    ConsoleWrite(@CRLF & "Es wurde start gedrückt" & @CRLF)
    GUICtrlSetData($okbutton, "Stop")
    $stop = 1
    _CallFunc("endlosschleife")
    Else
    ConsoleWrite(@CRLF & "Es wurde stop gedrückt" & @CRLF)
    GUICtrlSetData($okbutton, "Start")
    GUICtrlSetData($counter, "Ich mache nix!")
    $stop = 0
    EndIf
    EndFunc ;==>OKButton

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

    Func CLOSEClicked()
    Exit
    EndFunc ;==>CLOSEClicked

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

    Func endlosschleife()
    Local $i = 1
    ConsoleWrite("Funktion endlosschleife wurde aufgerufen" & @CRLF)
    While $stop = 1
    GUICtrlSetData($counter, $i)
    If $i = 10 Then
    ConsoleWrite(@CRLF & "Schleife wurde nach 10 sekunden automatisch verlassen, nicht über den button!" & @CRLF)
    ExitLoop
    EndIf
    $i += 1
    Sleep(1000)
    WEnd
    ConsoleWrite(@CRLF & "Schleife wurde verlassen, funktion endlosschleife wird nun beendet..." & @CRLF)
    EndFunc ;==>endlosschleife

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

    Func _CallFunc($sFunc = "")
    ; Calls a function using AdlibRegister
    Local $iAdlib = 0, $sCallFunc
    _CallFuncHelper('GET', $iAdlib, $sCallFunc)

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

    If $iAdlib = 0 Then
    $sCallFunc = $sFunc
    $iAdlib = 1
    AdlibRegister('_CallFunc', 15)
    AdlibRegister($sCallFunc, 10)
    _CallFuncHelper('SET', $iAdlib, $sCallFunc)
    Else
    AdlibUnRegister('_CallFunc')
    AdlibUnRegister($sCallFunc)
    $iAdlib = 0
    $sCallFunc = ''
    _CallFuncHelper('SET', $iAdlib, $sCallFunc)
    EndIf
    EndFunc ;==>_CallFunc

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

    Func _CallFuncHelper($sWhat, ByRef $iAdlib, ByRef $sCallFunc)
    Local Static $iState = 0, $sFunc = ''
    If $sWhat = 'SET' Then
    $iState = Number($iAdlib)
    $sFunc = $sCallFunc
    Else
    $iAdlib = Number($iState)
    $sCallFunc = $sFunc
    EndIf
    EndFunc ;==>_CallFuncHelper

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


    Zitat


    jemand anders noch eine Idee?

    Ja, GUIRegisterMsg()

    Spoiler anzeigen
    [autoit]

    #include <WindowsConstants.au3>

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

    ; Create GUI
    $hGUI = GUICreate("",240,90)
    $hButtonGo = GUICtrlCreateButton("Starte Funktion + Schleife", 20, 20, 200, 20)
    $hButtonHey = GUICtrlCreateButton("Führe Befehl aus während Schleife", 20, 50, 200, 20)

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

    ; Get Handles of Buttons & Register Window-Messages.
    $hButtonGo = GUICtrlGetHandle($hButtonGo)
    $hButtonHey = GUICtrlGetHandle($hButtonHey)
    GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
    GUIRegisterMsg($WM_SYSCOMMAND, "WM_SYSCOMMAND")

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

    ; Show GUI an become idle.
    GUISetState()
    While 1
    Sleep(1000)
    WEnd

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

    Func Funktion()
    Local $x = 10, $y
    ToolTip("Beginne Funktion", Default, Default, "Arbeite...")
    Sleep(1000)
    For $i = 1 To 1000
    $x += $i
    $y = Mod($x, $i)
    ToolTip("Durchgang #" & $i & @CRLF & "Wert: " & $y, Default, Default, "Arbeite...")
    Sleep(25)
    Next
    ToolTip("Beende Funktion", Default, Default, "Arbeite...")
    Sleep(1000)
    EndFunc ;==>Funktion

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

    Func WM_COMMAND($hWnd, $nMsg, $wParam, $lParam)
    ; Fängt u.a. 'Button-Clicks' ab.
    ;
    ; Sent when the user selects a command item from a menu, when a control sends a notification
    ; message to its parent window, or when an accelerator keystroke is translated.
    ; -> http://msdn.microsoft.com/en-us/library/…v=vs.85%29.aspx
    Switch $lParam
    Case $hButtonGo
    ; Ein normaler Funktionsaufruf würde nicht funktionieren - hier müssen wir etwas rumtricksen.
    _CallFunc('Funktion')
    Case $hButtonHey
    MsgBox(0, "", "Hallo :)")
    EndSwitch
    Return 'GUI_RUNDEFMSG'
    EndFunc ;==>WM_COMMAND

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

    Func WM_SYSCOMMAND($hWnd, $nMsg, $wParam, $lParam)
    ; Fängt Minimieren, Maximieren, Close etc. ab.
    ;
    ; A window receives this message when the user chooses a command from the Window menu
    ; (formerly known as the system or control menu) or when the user chooses the maximize button,
    ; minimize button, restore button, or close button.
    ; -> http://msdn.microsoft.com/en-us/library/…v=vs.85%29.aspx
    Local Const $SC_CLOSE = 0xF060
    If $wParam = $SC_CLOSE Then Exit
    EndFunc ;==>WM_SYSCOMMAND

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

    Func _CallFunc($sFunc = "")
    ; Calls a function using AdlibRegister
    Local $iAdlib = 0, $sCallFunc
    _CallFuncHelper('GET', $iAdlib, $sCallFunc)

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

    If $iAdlib = 0 Then
    $sCallFunc = $sFunc
    $iAdlib = 1
    AdlibRegister('_CallFunc', 15)
    AdlibRegister($sCallFunc, 10)
    _CallFuncHelper('SET', $iAdlib, $sCallFunc)
    Else
    AdlibUnRegister('_CallFunc')
    AdlibUnRegister($sCallFunc)
    $iAdlib = 0
    $sCallFunc = ''
    _CallFuncHelper('SET', $iAdlib, $sCallFunc)
    EndIf
    EndFunc ;==>_CallFunc

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

    Func _CallFuncHelper($sWhat, ByRef $iAdlib, ByRef $sCallFunc)
    Local Static $iState = 0, $sFunc = ''
    If $sWhat = 'SET' Then
    $iState = Number($iAdlib)
    $sFunc = $sCallFunc
    Else
    $iAdlib = Number($iState)
    $sCallFunc = $sFunc
    EndIf
    EndFunc ;==>_CallFuncHelper

    [/autoit]
  • @ misterspeed:

    Zitat

    "Anstatt die GUI ständig abzufragen, um herauszufinden ob etwas passiert ist, lässt du im OnEvent Modus die GUI zeitweise dein Skript anhalten und eine vordefinierte Funktion aufrufen, um das Ereignis zu behandeln. Wenn zum Beispiel ein Nutzer auf Button1 klickt, hält die GUI dein Hauptskript an und ruft eine vorher von dir definierte Funktion auf, die für Button1 zuständig ist. Wenn diese Funktion abgearbeitet ist, wird das Hauptskript fortgesetzt."

  • Danke Großvater und SEuBo. Hatte mir schon gedacht, dass man das wohl am ehesten noch mit adlibregister lösen kann. Den oneventmode temporär abschalten ist natürlich auch interessant, wobei die adlib Lösung wohl besser sein dürfte.

    Aber kleine Frage noch an Großvater:

    Verstehe ich das richtig, dass dein Script nur dann funktioniert, wenn der verbleibende Code der Funktion _btnstart nach dem adlibregister in weniger als 10ms ausgeführt wird? Also die adlibregister Funktion erst starten darf wenn sich das Script wieder in der GUI Hauptschleife befindet. Tests mit einem sleep direkt nach adlibregister haben mir das jedenfalls so bestätigt, denn bei einem sleep(10) funktioniert es schon nicht mehr, da sich das Script noch in der Funktion _btnstart befindet wenn die adlib funktion aufgerufen wird. Wählt man hingegen den adlib timer größer als das sleep funktioniert es wieder. Wäre es nicht sinnvoller die Funktion direkt per return adlibregister(...) zu verlassen um Probleme mit eventuell zeitintensiven weiteren Abfragen innerhalb der btnstart funktion zu vermeiden?

    Ob dieses Problem auch bei SEuBo besteht weiss ich nicht, das hab ich mir noch nicht angesehn und auf den ersten Blick auch nicht 100% verstanden.

  • Ob dieses Problem auch bei SEuBo besteht weiss ich nicht, das hab ich mir noch nicht angesehn und auf den ersten Blick auch nicht 100% verstanden.

    Höchstwahrscheinlich.
    Mein Script macht so ziemlich das selbe - es ruft auch mit AdlibRegister die Funktion mit der Schleife auf, nachdem die OnEvent Funktion beendet wurde.

    Der einzige unterschied zu Großvaters Script ist wohl, dass ich das ganze über die Funktion _CallFunc() mache, damit man nicht in jeder Funktion, die man aufruft, ein AdlibUnRegister braucht. Die _CallFuncHelper ist nur dafür da, um die Variablen $iAdlib und $sCallFunc zu speichern. Scheinbar funktionieren Static-Variablen in Adlib-Funktionen nicht so wie Sie sollten. Deswegen brauchte ich da eine Zweite Funktion, die die Static's speichert.