GUI bei Fehler anzeigen

  • Hallo zusammen

    Ich steh momentan einwenig auf dem Schlauch :D

    Ich habe ein GUI. Wenn man beim GUI auf den Button Los klickt werden verschiedene Operationen ausgeführt. Falls eine Operation schief geht gebe ich eine MsgBox mit einem Fehler auf. (Flag 0). Im Moment habe ich nach der MsgBox ein exit drin. Also sobald er auf OK klickt beendet sich das Skript.

    Nun, ist es möglich (z.B: über eine Funktion) das Menü welches im Hintergrund ist aufzurufen anstatt das ganze Skript zu beenden?

    Vielen Dank

    Gruss,
    eXpress

  • [autoit]


    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #Region ### START Koda GUI section ### Form=
    $Form2 = GUICreate("Form2", 413, 305, 302, 218)
    $Button1 = GUICtrlCreateButton("Button1", 168, 136, 75, 25, 0)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    if MsgBox(0, 'Testtitel', 'Klicke auf OK um zum Menü zu gelangen') = 1 Then
    #exit
    #return
    #.....
    EndIf
    #Hier kommt noch gaaaaaanz viel Code
    EndSwitch
    WEnd

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

    Ich hab hier mal was kleines erstellt. Wie ihr seht soll wenn man auf OK klickt zum GUI zurückgekehrt werden. Wenn ich aber return oder exit aufrufe wird das Skript beendet. Wenn man es so ausführt wie oben wird das Menü logischweise angezeigt, da ich ja nach dem If keinen Code mehr habe.

  • Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #Region ### START Koda GUI section ### Form=
    $Form2 = GUICreate("Form2", 413, 305, 302, 218)
    $Button1 = GUICtrlCreateButton("Button1", 168, 136, 75, 25, 0)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    if MsgBox(0, 'Testtitel', 'Klicke auf OK um zum Menü zu gelangen') = 1 Then
    ContinueLoop
    EndIf
    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit]
  • Hi

    Das funktioniert bei allen Message Boxen in der Schleife :) Ich habe aber Funktionen in externen Dateien welche auch MessageBoxen habem. Dort kriege ich dann natürlich den Fehler, dass ich ContinueLoop nicht verwenden darf da ich nicht in einer Schleife bin.

    Gibt es da auch eine Lösung für?

  • Hi

    Das funktioniert bei allen Message Boxen in der Schleife :) Ich habe aber Funktionen in externen Dateien welche auch MessageBoxen habem. Dort kriege ich dann natürlich den Fehler, dass ich ContinueLoop nicht verwenden darf da ich nicht in einer Schleife bin.

    Gibt es da auch eine Lösung für?

    Lösngen gibt es sicher dafür sieht aber nach "mass-Schnederei" aus und das geht ohne komplettes Skript nicht.
    Da diese Funktionen ja auch aus der Schleife heraus gestartet werden solltest du im Fehlerfall

    [autoit]

    return

    [/autoit]

    und

    [autoit]

    seterror

    [/autoit]

    verwenden und nach dem Aufruf auf Fehler überprüfen,

    mfg (Auto)Bert

  • Hi

    Das versteht ich jetzt nicht ganz wie das geht.

    Also, wie schon gesagt habe ich ein Skript das 4 Checkboxen hat. Diese kann der Benutzer an oder abwählen. Für jede Checkbox habe ich eine au3 Datei erstellt (also 4 Dateien) welche ich im case $go (go ist der Button) wenn die Checkbox aktiv ist include. Und genau bei diesen Dateien stehe ich im Moment an.

  • Skript 1:

    [autoit]


    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #Region ### START Koda GUI section ### Form=
    $Form2 = GUICreate("Form2", 413, 305, 302, 218)
    $Button1 = GUICtrlCreateButton("Button1", 168, 136, 75, 25, 0)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    #include "function1.au3"
    EndSwitch
    WEnd

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

    Funktion1

    [autoit]


    $var1 = 5
    if $var1 = 5 Then
    MsgBox(0+16, 'Fehler', 'Fehlerbeschreibung')
    ; Wenn der User auf OK drückt sollte das Menü angezeigt werden.
    EndIf
    ; ganz viel Code
    MsgBox(0+64, 'OK', 'Keine Fehler')

    [/autoit]

    Das ist nun mal ein simples Beispiel welches meinen Fehler reproduziert.

  • Hi,

    kurze Frage,

    warum machst du das über #include und so kompliziert.
    Verwende doch ganz einfach Funktionen!

    Beispiel:

    [autoit]

    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #Region ### START Koda GUI section ### Form=
    $Form2 = GUICreate("Form2", 413, 305, 302, 218)
    $Button1 = GUICtrlCreateButton("Button1", 168, 136, 75, 25, 0)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    Funktion_1()
    EndSwitch
    WEnd

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

    Func Funktion_1()
    $var1 = 5
    if $var1 = 5 Then
    MsgBox(0+16, 'Fehler', 'Fehlerbeschreibung')
    ; Wenn der User auf OK drückt sollte das Menü angezeigt werden.
    EndIf
    ; ganz viel Code
    MsgBox(0+64, 'OK', 'Keine Fehler')

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

    Endfunc

    [/autoit]

    Edit: Kleiner Tippfehler, hab das Func vergessen

    Gruß

    Prajoss

    "Never touch a running System!"

  • Nach 5x durchlesen hab ich das Problem begriffen (glaube ich ^^)

    [autoit]

    Case $Button1
    if MsgBox(0, 'Testtitel', 'Klicke auf OK um zum Menü zu gelangen') = 1 Then
    ;hier kommt der Code hin der ausgeführt werden soll, wenn OK gedrückt wurde, also das Menü
    else
    ;hier kommt der Code hin, wenn auf EXIT (in der Msgbox) geklickt wird
    EndIf

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

    ;was ich aber noch nicht verstanden habe, WANN soll
    ; #Hier kommt noch gaaaaaanz viel Code
    ;ausgeführt werden?

    [/autoit]

    oder etwa...

    [autoit]

    Case $Button1
    $a=_ funktion($var)
    if $a=1 or @error then ;es wurde ein Fehler in der Funktion gefunden
    ;Fehlerbehandlung
    else
    ;kein Fehler in der Funktion...
    endif
    endswitch

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

    Func _funktion($var)
    ;code oder abfrage der funktionsparameter
    ;es ist ein Fehler aufgetreten
    if @error or $var=1 then
    msgbox(0,"Fehler in Funktion _funktion()","Es wurde $var=1 angegeben!")
    return 1;kehrt zum Menü zurück, Funktion gibt 1 für fehler zurück, oder seterror() benutzen
    else
    ; #Hier kommt noch gaaaaaanz viel Code, im Falle, daß kein Fehler aufgetreten ist
    EndIf
    return 0 ;funktion gibt 0 im Erfolgsfall zurück, oder seterror() benutzen also return seterror(x,y,z)
    endfunc

    [/autoit]

    ciao
    Andy


    "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
    "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

    Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt...X-Y-Problem

    4 Mal editiert, zuletzt von Andy (5. August 2010 um 11:35)

  • Die includes habe ich gemacht da mein "Funktions Skripte" doch schon ziemlich gut sind und die case Methode dann ziemlich unübersichtlich wird ;)

    Prajoss

    Zeile 26 wird aber immer ausgeführt.

    Ich versuche nun noch einmal zu erklären was ich genau will.

    Ich habe ein GUI. Irgendwann geht bei diesem GUI eine MsgBox mit einem OK Button drauf. Wenn man auf diesen OK Button drückt soll die MsgBox zugehen, Das Skript nicht mehr weiter ausgeführt werden und wieder das GUI am Anfang geöffnet werden.