Anfänger frage zu GUI und While Schleife

  • Hallo zusammen,

    ich habe mich mal an einer GUI probiert nur leider ohne Erfolg. Habe mir eine kleine GUI erstellt wo 2 input felder sind und ein start und exit Button.

    Wenn der Start Button gedrückt wird soll er das eigentliche Script starten was auch den inhalt von der Anzahl Input Box benötigt.

    Nur funktioniert es nicht ganz bzw. die 2te While Schleife funkioniert nicht ganz.
    Wenn ich bei Anzahl 10 eingebe kommt die MsgBox "Die Schleife läuft noch 1 mal durch"

    Wo mache ich den Fehler?

    Danke und Gruß
    Norman


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

    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>

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

    Global $input_anz, $input_pw

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

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 371, 146, 192, 124)
    $input_anz = GUICtrlCreateInput("", 56, 40, 97, 21)
    $Label1 = GUICtrlCreateLabel("Anzahl", 72, 16, 36, 17)
    $Label2 = GUICtrlCreateLabel("PW", 235, 18, 22, 17)
    $input_pw = GUICtrlCreateInput("", 208, 40, 89, 21, BitOR($GUI_SS_DEFAULT_INPUT,$ES_PASSWORD))
    $Button1 = GUICtrlCreateButton("START", 32, 88, 89, 33)
    $Button2 = GUICtrlCreateButton("Exit", 208, 88, 89, 33)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    If GUICtrlRead($input_anz) And GUICtrlRead($input_pw) Then
    _start2()
    Else
    MsgBox(64, "Fehler" , "FEHLER")

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

    EndIf
    Case $Button2
    Exit

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

    EndSwitch
    WEnd
    Func _start2()

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

    While $input_anz >= 1
    $input_anz -= 1
    Sleep (1000)

    ; -------------------------- If Abfrage um darzustellen wie oft die Schleife noch läuft ----------------
    If $input_anz = 0 Then ; Wenn $input_anz gleich 0 kommt folgende MsgBox.

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

    MsgBox (0, "Anzahl", "Anzahl = " & $input_anz , 3)
    Exit
    ElseIf $input_anz = 1 Then ; Wenn $input_anz gleich 1 kommt folgende MsgBox
    MsgBox(64, "INFO", "Die Schleife wird noch " & $input_anz & " durchlaufen", 3)
    EndIf
    ; --------------------------- If Abfrage Ende -------------------------------
    WEnd
    Sleep(1000)
    Exit
    EndFunc

    [/autoit][autoit][/autoit][autoit][/autoit]
  • Die Meldung "Die Schleife läuft noch 1 mal durch" wird von dir erzeugt wenn $input_anz = 1 ist also wird da immer nur diese Meldung kommen. Schreibst du ja sogar noch im Kommentar.

    Einfach nur $input_anz ist allerdings nicht der Wert des Input Feldes. So Wie es jetzt ist, ist $input_anz immer == 3 wenn das Input gefüllt ist. Du musst

    [autoit]

    GuiCtrlRead

    [/autoit]


    verwenden um an den Wert aus dem input zu kommen.

    Ich glaube was du erreichen wolltest ist das hier:

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>

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

    Global $input_anz, $input_pw

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

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 371, 146, 192, 124)
    $input_anz = GUICtrlCreateInput("", 56, 40, 97, 21)
    $Label1 = GUICtrlCreateLabel("Anzahl", 72, 16, 36, 17)
    $Label2 = GUICtrlCreateLabel("PW", 235, 18, 22, 17)
    $input_pw = GUICtrlCreateInput("", 208, 40, 89, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_PASSWORD))
    $Button1 = GUICtrlCreateButton("START", 32, 88, 89, 33)
    $Button2 = GUICtrlCreateButton("Exit", 208, 88, 89, 33)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    If GUICtrlRead($input_anz) And GUICtrlRead($input_pw) Then
    _start2()
    Else
    MsgBox(64, "Fehler", "FEHLER")

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

    EndIf
    Case $Button2
    Exit

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

    EndSwitch
    WEnd
    Func _start2()
    $input_anz_base = GUICtrlRead($input_anz)
    $input_anz = GUICtrlRead($input_anz)
    While $input_anz >= 1
    $input_anz -= 1

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

    ; -------------------------- If Abfrage um darzustellen wie oft die Schleife noch läuft ----------------
    If $input_anz = 0 Then ; Wenn $input_anz gleich 0 kommt folgende MsgBox.
    MsgBox(0, "Anzahl", "Anzahl = " & $input_anz_base, 3)
    Exit
    EndIf
    MsgBox(64, "INFO", "Die Schleife wird noch " & $input_anz & " durchlaufen", 3)
    ; --------------------------- If Abfrage Ende -------------------------------
    WEnd
    EndFunc ;==>_start2

    [/autoit]

    EDIT: Und wieder mal war name22 schneller :D gebs zu des is Absicht ^^

  • Func _start2()
    $input_anz_base = GUICtrlRead($input_anz)
    $input_anz = GUICtrlRead($input_anz)


    Perfekt. Danke für eure Hilfe.

    @Milla

    Könntest Du mir das noch erklären?

    $input_anz_base bekommt den Wert von $input_anz?

    Und $input_anz bekommt wieder seinen eigenen wert durch GUICtrlRead?

    Habe ich das richtig verstanden?

  • Beide Variablen bekommen den selben Wert, $input_anz_base ist lediglich dazu da um in der MsgBox am ende die korrekte Anzahl an Durchläufen anzeigen zu können da die Variable $input_anz ja runtergezählt wird. Man könnte natürlich auch am Ende einfach das Inputfeld nochmals auslesen aber wenn der Benutzer während der Laufzeit den Wert ändert steht in der MsgBox am Schluss etwas falsches.

    Eigentlich sollte man auch nicht die Variable $input_anz verwenden da diese ja schon dem Inputfeld zugeordnet ist.
    Am besten du machst daraus $anz und $anz_base oder sowas.

    Einmal editiert, zuletzt von Milla (16. Juli 2011 um 17:20)

  • Meinst Du das so?

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

    Func _start2()
    $input_anz_base = GUICtrlRead($input_anz)
    $anz = GUICtrlRead($input_anz)

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



    Gruß
    Norman

  • Ja zb, weil $input_anz eben das Control des Inputfeldes hat also hauptsache irgendetwas anderes