Probleme beim ausführen einer Function die einem button zugeordnet ist

  • hi. Ich bin relativ neu im umgang mit auotit und habe hier gleich mein erstes Problem. Ich habe auf dem standart windows exit button eine function die eine gui startet die dann nochmal fragt ob man wirklich beenden will. Mein Problem ist, dass der Button "Beenden", der angezeigt wird nachdem man auf "das rote x" drückt , die funktion die eigentlich mit ihm verknüpft ist nicht startet.

    danke im vorraus


    #include <GUIConstantsEx.au3>
    #include <MsgBoxConstants.au3>

    Main()

    Func Main()
    Opt("GUICoordMode", 2)
    Opt("GUIResizeMode", 1)
    Opt("GUIOnEventMode", 1)

    GUICreate("Speed Up v1.0")
    GUISetOnEvent($GUI_EVENT_CLOSE, "SpecialEvents")


    GUISetState(@SW_SHOW)

    ; erhaltung des fensters
    While 1
    Sleep(10)
    WEnd
    EndFunc ;==>Example


    ;Func Help()
    ;msgbox(0,"Speed Up v1.0 Hilfe","Speed Up ist ein Programm mit dem man einige ausgewählte Programme per Knopfdruck entweder direkt schliessen oder neustarten kann.")
    ;EndFunc

    Func SpecialEvents()
    Select
    Case @GUI_CtrlId = $GUI_EVENT_CLOSE
    Opt("GUICoordMode", 2)
    Opt("GUIResizeMode", 1)
    Opt("GUIOnEventMode", 1)

    GUICreate("Sind sie sicher?",400,150)
    GUICtrlCreateLabel("Wollen sie das Programm wirklich beenden oder nur minimieren?",58,20)
    GUICtrlCreateButton("Beenden",-300,10,70,40)
    GUICtrlSetOnEvent(-1, "Finalexit")


    GUISetState(@SW_SHOW)

    ; erhaltung des fensters
    While 1
    Sleep(10)
    WEnd

    EndSelect


    EndFunc

    Func Finalexit()
    GUIDelete()
    exit()
    EndFunc

  • Bei OnEvent Modus brauchst du nur eine Hauptschleife.

    korigierte Version:

    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>
    #include <MsgBoxConstants.au3>
    Opt("GUICoordMode", 2)
    Opt("GUIResizeMode", 1)
    Opt("GUIOnEventMode", 1)

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

    Main()

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

    While 1
    Sleep(10)
    WEnd

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

    Func Main()
    Global $MainGUI = GUICreate("Speed Up v1.0")
    GUISetOnEvent($GUI_EVENT_CLOSE, "SpecialEvents")
    GUISetState(@SW_SHOW)
    EndFunc ;==>Example

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

    Func SpecialEvents()
    Global $SecoundGUI = GUICreate("Sind sie sicher?",400,150)
    GUICtrlCreateLabel("Wollen sie das Programm wirklich beenden oder nur minimieren?",58,20)
    GUICtrlCreateButton("Beenden",-300,10,70,40)
    GUICtrlSetOnEvent(-1, "Finalexit")
    GUISetState(@SW_SHOW)
    EndFunc

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

    Func Finalexit()
    exit
    EndFunc

    [/autoit]

    Für solche Messages würde ich jedoch keine seperate GUI erstellen, dass geht auch über eine normale Messagesbox.

    bsp.

    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>
    #include <MsgBoxConstants.au3>
    Opt("GUICoordMode", 2)
    Opt("GUIResizeMode", 1)
    Opt("GUIOnEventMode", 1)

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

    Main()

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

    While 1
    Sleep(10)
    WEnd

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

    Func Main()
    Global $MainGUI = GUICreate("Speed Up v1.0")
    GUISetOnEvent($GUI_EVENT_CLOSE, "SpecialEvents")
    GUISetState(@SW_SHOW)
    EndFunc ;==>Example

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

    Func SpecialEvents()
    If MsgBox(36, 'Beenden?', 'Wollen sie das Programm wirklich beenden?','',$MainGUI) = 6 Then exit
    EndFunc

    [/autoit]
  • Insbesondere dies ist falsch:
    @GUI_CtrlId = $GUI_EVENT_CLOSE
    $GUI_EVENT_CLOSE ist der Messagecode, den dein Fenster empfängt, wenn der User sagt: beende dich. Das gilt auch für alt+F4 sowie den rechtsklick in der taskleiste und fenster-schließen. Das hat nichts mit einer Control-ID zu tun.Diese Events, die du mit GUISetOnEvent() setzt, heißen nur: führe diese Funktion aus, wenn das Event ausgelöst wird. Daher: Hier keine Macros für CTRL-IDs nutzen. Das gilt auch für das Minimize und Maximize. Wenn du mit einem Tastenkürzel minimierst wird das ebenfalls ausgeführt.
    Allgemeiner Tipp: Wenn du sowas hast, immer die Bedinung ausgeben lassen.
    z.B.:

    [autoit]


    ;...
    Func SpecialEvents()
    ConsoleWrite("Select 1:"&@GUI_CtrlId&" = "&$GUI_EVENT_CLOSE&@crlf);Falls inner Schleife, oder in Funktionen, die oft ausgeführt werden
    MsgBox(48,"Debug","Select 1:"&@GUI_CtrlId&" = "&$GUI_EVENT_CLOSE);Falls ne kleine Box nicht stört
    Select
    Case @GUI_CtrlId = $GUI_EVENT_CLOSE[/i]
    ;...

    [/autoit]

    Dann findet man den Fehler oft recht schnell.