Stringübername auf andere Form mit Try/Catch Abfang

  • Servous,

    ich habe ein Problem und zwar wenn ich auf den Knopf (bei mindestens ein leeres Input) drücke Stürzt/hängt sich auf mein Programm auf.

    Ich habe schon verschiedene Try/Catchs Methoden Versucht aber keines half -- Ist hier überhaupt Try/Catch sinnvoll oder reichen normale IF-Abfragen?

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    ;------------------------------------------------------------------------------------------------------------------
    $Form1 = GUICreate("Form1", 149, 119, 235, 157)
    $Button1 = GUICtrlCreateButton("Button1", 32, 80, 75, 25, $WS_GROUP)
    $Input1 = GUICtrlCreateInput("", 16, 16, 121, 21)
    $Input2 = GUICtrlCreateInput("", 16, 48, 121, 21)
    GUISetState(@SW_SHOW)
    ;------------------------------------------------------------------------------------------------------------------
    $Form2 = GUICreate("Form1", 413, 305, 348, 133)
    $Edit1 = GUICtrlCreateEdit("", 16, 8, 377, 273)
    GUISetState(@SW_HIDE)
    ;------------------------------------------------------------------------------------------------------------------
    Func Uebernahme()
    While Not @error ;Try

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

    If Guictrlread($Input1) <> "" Then
    $sBla = "text" & Guictrlread($Input1) &"text"
    EndIf
    WEnd
    Guictrlsetdata($Edit1, $sBla)
    EndFunc

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

    While 1
    $nMsg = GUIGetMsg(1)
    Switch $nMsg[1] ; window-handle
    Case $Form1 ;hier kommt alles zur 1ten gui rein

    Switch $nMsg[0]
    Case $GUI_EVENT_CLOSE
    Exit

    Case $Button1
    Uebernahme()
    GUISetState(@SW_HIDE, $Form1);frmMain->visible = false
    GUISetState(@SW_SHOW, $Form2);frmInfo->visible = true
    EndSwitch

    Case $Form2 ; hier kommt alles zur 2ten gui rein
    Switch $nMsg[0]
    Case $GUI_EVENT_CLOSE
    GuiCtrlSetData($Edit1, "")
    GUISetState(@SW_SHOW, $Form1) ;frmMain->visible = true
    GUISetState(@SW_HIDE, $Form2) ;frmInfo->visible = false
    EndSwitch
    EndSwitch
    WEnd

    [/autoit]

    Danke im Vorraus.

    Grüße myrix

    Es gibt keine blöde Fragen, es gibt nur blöde antworten !

    Einmal editiert, zuletzt von myrix (19. August 2010 um 12:42)

  • Die Schleife in der Funktion ist auch nicht wirklich nötig.

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    ;------------------------------------------------------------------------------------------------------------------
    $Form1 = GUICreate("Form1", 149, 119, 235, 157)
    $Button1 = GUICtrlCreateButton("Button1", 32, 80, 75, 25, $WS_GROUP)
    $Input1 = GUICtrlCreateInput("", 16, 16, 121, 21)
    $Input2 = GUICtrlCreateInput("", 16, 48, 121, 21)
    GUISetState(@SW_SHOW)
    ;------------------------------------------------------------------------------------------------------------------
    $Form2 = GUICreate("Form1", 413, 305, 348, 133)
    $Edit1 = GUICtrlCreateEdit("", 16, 8, 377, 273)
    GUISetState(@SW_HIDE)
    ;------------------------------------------------------------------------------------------------------------------
    Func Uebernahme()
    If GUICtrlRead($Input1) <> "" And GUICtrlRead($Input2) <> "" Then
    GUICtrlSetData($Edit1, "text" & GUICtrlRead($Input1) & "|" & GUICtrlRead($Input2) & "text")
    GUISetState(@SW_HIDE, $Form1);frmMain->visible = false
    GUISetState(@SW_SHOW, $Form2);frmInfo->visible = true
    EndIf
    EndFunc ;==>Uebernahme

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

    While 1
    $nMsg = GUIGetMsg(1)
    Switch $nMsg[1] ; window-handle
    Case $Form1 ;hier kommt alles zur 1ten gui rein

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

    Switch $nMsg[0]
    Case $GUI_EVENT_CLOSE
    Exit

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

    Case $Button1
    Uebernahme()
    EndSwitch

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

    Case $Form2 ; hier kommt alles zur 2ten gui rein
    Switch $nMsg[0]
    Case $GUI_EVENT_CLOSE
    GUICtrlSetData($Edit1, "")
    GUISetState(@SW_SHOW, $Form1) ;frmMain->visible = true
    GUISetState(@SW_HIDE, $Form2) ;frmInfo->visible = false
    EndSwitch
    EndSwitch
    WEnd

    [/autoit]
  • Danke euch beiden erstmal.

    Ich dachte ja nur bei C/C++ wurde uns beigebracht um Fehler abzufangen nimm Try/Catch

    Es gibt keine blöde Fragen, es gibt nur blöde antworten !

  • Es gibt kein Try and Catch in AutoIt da es auch keine Exceptions gibt. (zumindestens nicht nativ)
    Bei C++ kann man damit in einem kompletten Block entweder gezielte Exceptions abfangen oder alle.
    Was du hingegen versuchst mit @error und einer Endlosschleife zusammenzubauen ahmt nicht die Funktionsweise von Try/Catch nach.
    @error bezieht sich immer nur auf den letzten Funktionsaufruf und wird vom nächsten Funktionsaufruf wieder überschrieben.
    Du kannst daher mit @error nie einen ganzen Block abfragen.
    Hier wird stattdessen immer an potentiell "gefährlichen" Stellen, wie du schon sagtest, eine If-Abfrage genommen welche die Plausabilität von Variablen, den Rückgabewert von Funktionen, das @error-Makro etc. überprüft.

  • Die Frage ist so alt wie die Programmiererei : ^^
    Arbeitet man den "Fehler" in der Funktion ab, oder unterbricht die Funktion und gibt einen Fehlercode zurück?
    Die meisten werden wohl mittlerweile Fehlercodes zurückgeben, auf die man dann aussserhalb der Funktion reagiert.

    [autoit]

    return seterror(15,33,"Drecksfehlerverdammtergrmblfx##") ;gibt an den Aufrufer der Funktion den Sting zurück, setzt @error=15 und @extended=33

    [/autoit]