wieder mal die schleife...

  • Hallo an alle!
    Ich hab mir 999999 mal die Erklärung zu den while... wend schleifen durchgelesen und bin zu dem schluss gekommen, dass es einfacher gewesen wäre, den goto Befehl noch zu behalten... naja egal
    Zu meinem Problem:

    fenster1 öffnet über Button1 ein fenster2. schließe ich fenster2, kann ich auf buton1 klicken wie ich will, es passiert nichts mehr.

    (Bei ";~ eigener key wird verwendet-----------------------" wird das zweite fenster geöffnet.

    Spoiler anzeigen


    while 1
    $msg = GUIGetMsg ()
    Select
    Case $msg = $button1
    $data = guictrlread ($combo)
    Select
    case $data = "gespeicherte Keys"
    msgbox (48, "noch kein key ausgewählt!")
    case $data <> "eigenen Key verwenden"
    run ("notepad.exe")
    sleep (1000)
    send ($data)
    case $data = "eigenen Key verwenden"
    ;~ eigener key wird verwendet-----------------------
    guicreate ("eigener Key",200,100)
    GUICtrlCreateLabel ("Tippe hier deinen Key ein:",10,10)
    $input1 = GUICtrlCreateInput ("",10,30,180)
    $button2 = GUICtrlCreateButton ("Weiter >",110,60,70)
    $button3 = GUICtrlCreateButton ("< Zurück",20,60,70)
    Guisetstate ()
    while 1
    $msg = GUIGetMsg ()
    Select
    case $msg = $button2
    $data2 = guictrlread ($input1)
    run ("notepad.exe")
    sleep (1000)
    send ($data2)
    Case $msg = $button3
    guidelete ()
    case $msg = $gui_event_close
    ExitLoop
    EndSelect
    WEnd
    ;~ ----------------------------------------------------
    EndSelect
    case $msg = $gui_event_close
    ExitLoop
    EndSelect
    WEnd


    Bitte um schnelle Hilfe!

    mfg
    Bootsector

  • wie mach ich denn aus einer endlosschleife eine schleife? und was sind beispiele für abbruchbedingungen?

  • so ich hab jetz die while schleife durch do until ersetzt. funktioniert soweit auch ganz gut.
    wenn ich jetz aber fenster 2 durch das kreuz rechts oben schließe um wieder zu fenster eins zu kommen, schließt sich das ganze script und nicht nur fenster 2. ich denke mal das liegt an der until bedingung. wie kann ich die umändern, sodass es geht? oder gibts noch eine andere möglichkeit ein fenster durch das kreuz zu schließen außer mit $gui_event_close?

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>

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

    guicreate ("test",200,200)
    $button1 = GUICtrlCreateButton ("ok",10,10,40,20)

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

    GUISetState ()

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

    Do
    $msg = GUIGetMsg ()
    Select
    case $msg = $button1
    guicreate ("fenster2",200,200)
    $button2 = GUICtrlCreateButton ("zurück" ,10,10,60,20)
    $button3 = GUICtrlCreateButton ("weiter" ,80,10,40,20)

    GUISetState ()
    do
    $msg = GUIGetMsg ()
    Select
    case $msg = $button2
    GUIDelete ()
    EndSelect

    until $msg = $button2 or $msg = $gui_event_close

    EndSelect

    until $msg = $gui_event_close

    [/autoit]

    Einmal editiert, zuletzt von Bootsector (20. März 2008 um 10:21)

  • Hallo Bootsector,

    die Schleifen sind so in Ordnung. Dein Problem ist die $GUI_EVENT_CLOSE Message.
    In Deinem Script unterscheidest Du nicht, von welchem Fenster die Message verarbeitet werden soll. Wenn also $GUI_EVENT_CLOSE gesendet wird, beendest Du beide Fenster mit einer Message. Du könntest also den Advanced Mode von GUIGetMsg benutzen, um das sendende Fenster zu bestimmen.

    Ich habe es mal anders gelöst:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>

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

    guicreate ("test",200,200)
    $button1 = GUICtrlCreateButton ("ok",10,10,40,20)

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

    GUISetState ()

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

    Do
    $msg = GUIGetMsg ()
    Select
    case $msg = $button1
    guicreate ("fenster2",200,200)
    $button2 = GUICtrlCreateButton ("zurück" ,10,10,60,20)
    $button3 = GUICtrlCreateButton ("weiter" ,80,10,40,20)

    GUISetState ()
    do
    $msg = GUIGetMsg ()
    Select
    case $msg = $button2
    GUIDelete ()
    case $msg = $gui_event_close
    GUIDelete ()
    EndSelect

    until WinExists ("fenster2") = 0
    case $msg = $gui_event_close
    GUIDelete ()
    EndSelect

    until WinExists ("test") = 0

    [/autoit]

    Gruß
    TrueMu

  • mit winexists hab ichs auch schonmal versucht, aber ohne parameter :) , also "= 0"
    "= 1" steht dann wahrscheinlich dafür, dass es existiert und die null dass es nicht existiert oder was?

    aber funktioniert einwandfrei, danke!

    • Offizieller Beitrag

    Hallo,

    das Beispiel ist fehlerhaft:

    • Starte mal das Programm, öffne Fenster2 dann verschiebe Fenster2 und drücke auf das X von Fenster1. Obwohl das X von Fenster1 gedrückt wurde schliesst sich Fenster2.
    • Ausserdem wird das Fenster2 in der Schleife immer wieder neu erstellt!

    Besser macht man es so:

    • Erst alle Fenster am Anfang des Programms definieren.
    • GUIGetMsg in den advanced-Modus schalten, dann wird ein Array zurückgegeben das unter anderem auch die ID des Fensters enthält.
    Beispiel
    [autoit]

    #include <GUIConstants.au3>

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

    $GUI1 = GUICreate("test", 200, 200)
    $button1 = GUICtrlCreateButton("ok", 10, 10, 40, 20)

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

    $GUI2 = GUICreate("fenster2", 200, 200)
    $button2 = GUICtrlCreateButton("zurück", 10, 10, 60, 20)
    $button3 = GUICtrlCreateButton("weiter", 80, 10, 40, 20)

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

    GUISetState(@SW_SHOW, $GUI1)

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

    While 1
    $msg = GUIGetMsg(1)
    Select
    Case $msg[0] = $button1
    GUISetState(@SW_SHOW, $GUI2)

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

    Case $msg[0] = $button2
    GUISetState(@SW_HIDE, $GUI2)

    Case $msg[0] = $gui_event_close
    Switch $msg[1]
    Case $GUI1
    ExitLoop

    Case $GUI2
    GUISetState(@SW_HIDE, $GUI2)
    EndSwitch
    EndSelect
    WEnd

    [/autoit]