Schleifen behaken sich

  • Moin moin,

    habe da irgenwie einen Knoten in der Birne.
    Bekomme es nicht hin das beim Beenden von "test2 " die " main " wieder ihre funktionen macht.

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    Opt("GUIOnEventMode", 1)
    Global $Radio1, $Radio2, $Form2
    main()
    Func main()
    #Region ### START Koda GUI section ### Form=
    $Form2 = GUICreate("Test", 117, 150, 302, 218)
    $Label1 = GUICtrlCreateLabel("Testmain", 32, 8, 47, 17)
    $Group1 = GUICtrlCreateGroup("Funktion", 10, 32, 97, 41)
    $Radio1 = GUICtrlCreateRadio("An", 18, 48, 41, 17)
    GUICtrlSetState(-1, $GUI_CHECKED)
    $Radio2 = GUICtrlCreateRadio("Aus", 59, 48, 41, 17)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $Button1 = GUICtrlCreateButton("OK", 18, 80, 75, 25)
    $Button2 = GUICtrlCreateButton("Beenden", 18, 112, 75, 25)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###
    GUICtrlSetOnEvent($Button1, "test1")
    GUICtrlSetOnEvent($Button2, "endmain")
    GUISetOnEvent($GUI_EVENT_CLOSE, "endmain")
    While 1
    Sleep(50)
    WEnd
    EndFunc;==>main

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

    Func test1(); ich weiss das man das auch als If...else hätte machen können ist nur zur veranschaulichung
    If $Radio1 And BitAND(GUICtrlRead($Radio1), $GUI_CHECKED) = $GUI_CHECKED Then
    MsgBox(0,"Test", "Nur zu Testzwecken")
    Endif

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

    If $Radio2 And BitAND(GUICtrlRead($Radio2), $GUI_CHECKED) = $GUI_CHECKED Then
    test2()
    Endif
    EndFunc;==>test

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

    Func test2()
    Opt("GUIOnEventMode", 0); ohne dem geht gar nichts mehr
    #Region ### START Koda GUI section ### Form=
    $Form2 = GUICreate("Testform2", 125, 206, 302, 218)
    $Label1 = GUICtrlCreateLabel("Testform2", 8, 8, 51, 17)
    $Button1 = GUICtrlCreateButton("Beenden", 24, 168, 75, 25)
    $Button2 = GUICtrlCreateButton("OK", 24, 136, 75, 25)
    $Label2 = GUICtrlCreateLabel("", 32, 80, 51, 20, $SS_SUNKEN)
    GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
    GUICtrlSetColor(-1, 0x0000FF)
    $Input1 = GUICtrlCreateInput("", 24, 32, 73, 21)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    GUICtrlSetOnEvent($Button1, "endtest2")
    GUICtrlSetOnEvent($Button2, "endtest2")
    GUISetOnEvent($GUI_EVENT_CLOSE, "endmain")

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

    While 1 * sleep(10)
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    endtest2()
    Case $Label2
    $neu = GUICtrlRead($Input1)
    GUICtrlSetData($Label2, $neu)
    EndSwitch
    WEnd
    EndFunc;==>test2

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

    Func endtest2()
    GUIDelete($Form2)
    EndFunc;==>endtest2

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

    Func endmain()
    Exit
    EndFunc;==>endmain

    [/autoit]


    Ist nur ein Testskript was aufzeigen soll wie ich das meine da es genau den Fehler wiedergibt.
    Hoffe mal das ich mich dieses mal wenigstens verständlich machen konnte. :rolleyes:


    mfg
    oh-ha

    Es gibt drei Wahrheiten: deine Wahrheit, meine Wahrheit und die Wahrheit

    2 Mal editiert, zuletzt von oh-ha (20. November 2011 um 11:31)

  • Wieso nimmst du in Test 2 OnEvent Mode raus und setzte es aber trotzdem und fragst dann noch GUIGetrMsg ab?

    Und soviele Funktionen würde ich niemals nacheinander aufrufen, da kommt man doch viel zu schnell durcheinander.

  • Moin,

    entweder nutzt du Opt("GUIOnEventMode", 1) oder nicht

    schmeiss die schleifen raus - du brauchst nur eine globale

    Spoiler anzeigen

    While 1
    WEnd

    und dann arbeitest du mit GUICtrlSetOnEvent.

    Oder - du arbeitest klassisch und verwendest Select Case - aber das mischen der Formen ist mist

  • moin BadBunny

    ist genau das was ich nicht verstehe.
    Hatte ja als Kommentar " Zeile 40 " ja geschrieben das es ohne dem gar nicht geht.
    Ist nur ein Test Skript das dem meinigen sehr nahe kommt zumindest was den Fehler betrifft.
    Arbeite halt gerne über Funktionen. Bin mir bis jetzt auch nicht ins Gehege gekommen was die Übersicht betrifft.

    mfg
    oh-ha

    Es gibt drei Wahrheiten: deine Wahrheit, meine Wahrheit und die Wahrheit

  • Hallo oh-ha,

    du hast 2 Lösungsmöglchkeiten:

    • alles im OnEvent Mode:
      Spoiler anzeigen
      [autoit]

      #include <ButtonConstants.au3>
      #include <GUIConstantsEx.au3>
      #include <StaticConstants.au3>
      #include <WindowsConstants.au3>
      Opt("GUIOnEventMode", 1)
      Global $Radio1, $Radio2, $Form2
      main()
      Func main()
      #Region ### START Koda GUI section ### Form=
      $Form2 = GUICreate("Test", 117, 150, 302, 218)
      $Label1 = GUICtrlCreateLabel("Testmain", 32, 8, 47, 17)
      $Group1 = GUICtrlCreateGroup("Funktion", 10, 32, 97, 41)
      $Radio1 = GUICtrlCreateRadio("An", 18, 48, 41, 17)
      GUICtrlSetState(-1, $GUI_CHECKED)
      $Radio2 = GUICtrlCreateRadio("Aus", 59, 48, 41, 17)
      GUICtrlCreateGroup("", -99, -99, 1, 1)
      $Button1 = GUICtrlCreateButton("OK", 18, 80, 75, 25)
      $Button2 = GUICtrlCreateButton("Beenden", 18, 112, 75, 25)
      GUISetState(@SW_SHOW)
      #EndRegion ### END Koda GUI section ###
      GUICtrlSetOnEvent($Button1, "test1")
      GUICtrlSetOnEvent($Button2, "endmain")
      GUISetOnEvent($GUI_EVENT_CLOSE, "endmain")
      While 1
      Sleep(50)
      WEnd
      EndFunc;==>main

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

      Func test1(); ich weiss das man das auch als If...else hätte machen können ist nur zur veranschaulichung
      If $Radio1 And BitAND(GUICtrlRead($Radio1), $GUI_CHECKED) = $GUI_CHECKED Then
      MsgBox(0,"Test", "Nur zu Testzwecken")
      Endif

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

      If $Radio2 And BitAND(GUICtrlRead($Radio2), $GUI_CHECKED) = $GUI_CHECKED Then
      test2()
      Endif
      EndFunc;==>test

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

      Func test2()
      ;Opt("GUIOnEventMode", 0); ohne dem geht gar nichts mehr
      #Region ### START Koda GUI section ### Form=c:\users\jpjono\desktop\comag für sehbehinderte\formen\forum testform2.kxf
      $Form2 = GUICreate("Testform2", 125, 206, 302, 218)
      $Label1 = GUICtrlCreateLabel("Testform2", 8, 8, 51, 17)
      $Button1 = GUICtrlCreateButton("Beenden", 24, 168, 75, 25)
      $Button2 = GUICtrlCreateButton("OK", 24, 136, 75, 25)
      $Label2 = GUICtrlCreateLabel("", 32, 80, 51, 20, $SS_SUNKEN)
      GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
      GUICtrlSetColor(-1, 0x0000FF)
      $Input1 = GUICtrlCreateInput("", 24, 32, 73, 21)
      GUISetState(@SW_SHOW)
      #EndRegion ### END Koda GUI section ###

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

      GUICtrlSetOnEvent($Button1, "endtest2")
      GUICtrlSetOnEvent($Button2, "endtest2")
      GUISetOnEvent($GUI_EVENT_CLOSE, "endmain")
      #cs
      While 1 * sleep(10)
      $nMsg = GUIGetMsg()
      Switch $nMsg
      Case $GUI_EVENT_CLOSE
      endtest2()
      Case $Label2
      $neu = GUICtrlRead($Input1)
      GUICtrlSetData($Label2, $neu)
      EndSwitch
      WEnd
      #ce

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

      EndFunc;==>test2

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

      Func endtest2()
      GUIDelete($Form2)
      EndFunc;==>endtest2

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

      Func endmain()
      Exit
      EndFunc;==>endmain

      [/autoit]
    • 2. Gui im GuiGetMsg-Mode, dann musst du danach aber auch wieder den OnEvent-Mode anschalten.
      Spoiler anzeigen
      [autoit]

      #include <ButtonConstants.au3>
      #include <GUIConstantsEx.au3>
      #include <StaticConstants.au3>
      #include <WindowsConstants.au3>
      Opt("GUIOnEventMode", 1)
      Global $Radio1, $Radio2, $Form2
      main()
      Func main()
      #Region ### START Koda GUI section ### Form=
      $Form2 = GUICreate("Test", 117, 150, 302, 218)
      $Label1 = GUICtrlCreateLabel("Testmain", 32, 8, 47, 17)
      $Group1 = GUICtrlCreateGroup("Funktion", 10, 32, 97, 41)
      $Radio1 = GUICtrlCreateRadio("An", 18, 48, 41, 17)
      GUICtrlSetState(-1, $GUI_CHECKED)
      $Radio2 = GUICtrlCreateRadio("Aus", 59, 48, 41, 17)
      GUICtrlCreateGroup("", -99, -99, 1, 1)
      $Button1 = GUICtrlCreateButton("OK", 18, 80, 75, 25)
      $Button2 = GUICtrlCreateButton("Beenden", 18, 112, 75, 25)
      GUISetState(@SW_SHOW)
      #EndRegion ### END Koda GUI section ###
      GUICtrlSetOnEvent($Button1, "test1")
      GUICtrlSetOnEvent($Button2, "endmain")
      GUISetOnEvent($GUI_EVENT_CLOSE, "endmain")
      While 1
      Sleep(50)
      WEnd
      EndFunc ;==>main

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

      Func test1(); ich weiss das man das auch als If...else hätte machen können ist nur zur veranschaulichung
      If $Radio1 And BitAND(GUICtrlRead($Radio1), $GUI_CHECKED) = $GUI_CHECKED Then
      MsgBox(0, "Test", "Nur zu Testzwecken")
      EndIf

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

      If $Radio2 And BitAND(GUICtrlRead($Radio2), $GUI_CHECKED) = $GUI_CHECKED Then
      test2()
      EndIf
      EndFunc ;==>test1

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

      Func test2()
      $bOnEvent = Opt("GUIOnEventMode", 0) ;auf GuiGetMsg-Mode umschalten und specihern welcher Modus vorher aktiv war
      #Region ### START Koda GUI section ### Form=c:\users\jpjono\desktop\comag für sehbehinderte\formen\forum testform2.kxf
      $Form2 = GUICreate("Testform2", 125, 206, 302, 218)
      $Label1 = GUICtrlCreateLabel("Testform2", 8, 8, 51, 17)
      $Button1 = GUICtrlCreateButton("Beenden", 24, 168, 75, 25)
      $Button2 = GUICtrlCreateButton("OK", 24, 136, 75, 25)
      $Label2 = GUICtrlCreateLabel("", 32, 80, 51, 20, $SS_SUNKEN)
      GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
      GUICtrlSetColor(-1, 0x0000FF)
      $Input1 = GUICtrlCreateInput("", 24, 32, 73, 21)
      GUISetState(@SW_SHOW)
      #EndRegion ### END Koda GUI section ###

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

      While 1 * Sleep(10)
      $nMsg = GUIGetMsg()
      Switch $nMsg
      Case $GUI_EVENT_CLOSE, $Button1, $Button2
      ExitLoop
      Case $Label2
      $neu = GUICtrlRead($Input1)
      GUICtrlSetData($Label2, $neu)
      EndSwitch
      WEnd
      GUIDelete($Form2)
      Opt("GUIOnEventMode", $bOnEvent) ;den Modus einschalten der vorher aktiv war

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

      EndFunc ;==>test2

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

      Func endmain()
      Exit
      EndFunc ;==>endmain

      [/autoit]

      mfg autoBert

  • Ahhhhhhhh jetzt ja

    Danke dir autoBert das mit den speichern vom Modus war es.

    mfg
    oh-ha

    Es gibt drei Wahrheiten: deine Wahrheit, meine Wahrheit und die Wahrheit

  • Wie schon geschrieben solltest du entweder nur den OnEvent-Mode oder den Message-Loop-Modus verwenden.
    Ein(e) GUI brauchst du auch nicht zu löschen. Besser ist es alle GUIs am Anfang nur einmal zu erstellen und dann jeweils anzeigen/verstecken lassen.
    Einen größeren Fehler den du machst ist das du für beide Variablen die das Handle der jeweiligen GUI beinhalten den selben Namen nimmst ($Form2). Da du die 2. Variable aber nicht als local kennzeichnest wird sie automatisch als Dim $Form2 deklariert - nicht gut. Denn nun wird in dem Fall die äußere (globale) schon vorhandene $Form2 damit überschrieben. Zur Verdeutlichung ein kleines Beispiel:

    [autoit]

    Global $Form2 = 5

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

    Irgendwas()
    MsgBox(0,"","Das ist nun $Form2: " & $Form2)

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

    Func Irgendwas()
    $Form2 = 10
    EndFunc

    [/autoit]


    Ansonsten hier mein Vorschlag wie du dein Vorhaben umsetzen kannst:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    Opt("GUIOnEventMode", 1)

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

    #region GUIs erstellen
    Global $Radio1, $Radio2, $Form1, $Form2, $Label2
    ; Form 1:
    $Form1 = GUICreate("Test", 117, 150, 302, 218)
    GUISetOnEvent($GUI_EVENT_CLOSE, "endmain")
    GUICtrlCreateLabel("Testmain", 32, 8, 47, 17)
    GUICtrlCreateGroup("Funktion", 10, 32, 97, 41)
    $Radio1 = GUICtrlCreateRadio("An", 18, 48, 41, 17)
    GUICtrlSetState(-1, $GUI_CHECKED)
    $Radio2 = GUICtrlCreateRadio("Aus", 59, 48, 41, 17)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    GUICtrlCreateButton("OK", 18, 80, 75, 25)
    GUICtrlSetOnEvent(-1, "test1")
    GUICtrlCreateButton("Beenden", 18, 112, 75, 25)
    GUICtrlSetOnEvent(-1, "endmain")

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

    ; Form 2:
    $Form2 = GUICreate("Testform2", 125, 206, 302, 218)
    GUISetOnEvent($GUI_EVENT_CLOSE, "endmain")
    GUICtrlCreateLabel("Testform2", 8, 8, 51, 17)
    GUICtrlCreateButton("Beenden", 24, 168, 75, 25)
    GUICtrlSetOnEvent(-1, "endtest2")
    GUICtrlCreateButton("OK", 24, 136, 75, 25)
    GUICtrlSetOnEvent(-1, "endtest2")
    GUICtrlCreateLabel("", 32, 80, 51, 20, $SS_SUNKEN)
    GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
    GUICtrlSetColor(-1, 0x0000FF)
    GUICtrlSetOnEvent(-1, "InputTest")
    $Input1 = GUICtrlCreateInput("", 24, 32, 73, 21)
    #endregion GUIs erstellen

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

    ; Endlossschleife:
    SwitchGUI($Form1, $Form2)
    While 1
    Sleep(50)
    WEnd

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

    Func InputTest()
    GUICtrlSetData(@GUI_CtrlId, GUICtrlRead($Input1))
    EndFunc ;==>InputTest

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

    Func test1()
    If $Radio1 And BitAND(GUICtrlRead($Radio1), $GUI_CHECKED) = $GUI_CHECKED Then MsgBox(0, "Test", "Nur zu Testzwecken")
    If $Radio2 And BitAND(GUICtrlRead($Radio2), $GUI_CHECKED) = $GUI_CHECKED Then SwitchGUI($Form2, $Form1)
    EndFunc ;==>test1

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

    Func endtest2()
    SwitchGUI($Form1, $Form2)
    EndFunc ;==>endtest2

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

    Func endmain()
    Exit
    EndFunc ;==>endmain

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

    Func SwitchGUI($GUIShow, $GUIClose)
    GUISetState(@SW_HIDE, $GUIClose)
    GUISetState(@SW_SHOW, $GUIShow)
    GUISetState(@SW_ENABLE, $GUIShow)
    GUISwitch($GUIShow)
    EndFunc

    [/autoit]


    Achte am besten in Zukunft darauf nur Variablen zu deklarieren welche du auch wirklich brauchst, diesen eindeutige Namen zu geben und diese immer nur explizit mit Global oder Local zu deklarieren (je nachdem wie sie verwendet werden soll).

  • Das mit den selben Namen für die Variablen " Form2 " ist nur beim Testskript so.
    Da ist mir beim erstellen mit Koda wohl ein Fehler unterlaufen. :whistling:
    In meinen normalen Skript haben die alle einen unterschiedlichen Namen.


    mfg
    oh-ha

    Es gibt drei Wahrheiten: deine Wahrheit, meine Wahrheit und die Wahrheit