GuiCtrlRead liefert falschen Wert aus

  • Hey Leute,

    ich versuche mich momentan mit Autoit, da das Programm mir echt gefällt. Alle Fragen konnte ich mir bisher durch die SuFu beantworten, jedoch komme ich bei GuiCtrlRead nicht weiter.

    Mein Problem ist folgendes:

    Ich lasse den Anwender in eine Gui InputBox (GuiCtrlCreateInput) ein Wort eintippen, dieses vergleiche ich dann mit einem Array. Das Array beeinhaltet den richtigen Text (hab ich durch eine MsgBox getestet), lediglich liefert mir GuiCtrlRead nur den Wert " 0 " aus. Meine Funktion sieht wie folgt aus:

    [autoit]


    Dim $input6[100] ;ist das array richtig definiert ?
    ...
    $input6 = GUICtrlCreateInput("", @DesktopWidth/4-50, @DesktopHeight/4+200)
    ...
    If GUICtrlRead($input6) == $word2[$testnumber] Then ; Hier vergleiche ich die beiden arrays, jedoch klappt das Ganze nicht, da GuiCtrlRead mir nur den Wert 0 liefert

    [/autoit]

    Ich wär euch sehr dankbar, wenn Ihr mir sagen könntet, wie ich es hinbekomme, dass GuiCtrlRead mir einen vernünftigen Text als Wert ausgibt. :)

    mfg

    sensation

  • Vergleich mal die beiden Variablennamen:
    Einmal Dim'st du $Input6[100]
    Dann erzeugst du für $Input6 ein GUICtrlInput..
    Als ich anfing mit Programmieren (mit FORTRAN IV) war es noch verboten(!!) EinzelVariablen,
    dieselben Namen zu geben wie Arrays, kann sein, daß sich da was geändert hat, für mich sieht das erstmal FALSCH aus.
    hth
    ytwinky

    (Ich) benutze stets die aktuelle (Beta) und SciTE..

  • Hey ytwinky, danke für die Antwort.

    Wenn ich Dim $input6[100] entferne, bekomme ich jedoch immer noch den Wert 0, egal was ich in den Input eintippe. Woran kann es noch liegen?

    mfg

    sensation

  • Hast du mal auf :GUICtrlCreateInput geklickt ?

    [autoit]

    $input6 = GUICtrlCreateInput("", @DesktopWidth/4-50, @DesktopHeight/4+200)

    [/autoit]


    (da erscheint dann die Hilfe, die du dir auch runterladen kannst siehe Links^^)
    Gruß
    ytwinky

    (Ich) benutze stets die aktuelle (Beta) und SciTE..

  • ytwinky:

    Ich hab die Hilfe benutzt und die Parameter dadurch ja setzen können ^^.

    @Oskar:

    Ist natürlich noch nicht perfekt, ich optimiere das ständig, nur komme ich an dem Punkt mit GuiCtrlRead nicht weiter wegen dem Wert 0.

    [autoit]

    Func Asking()
    If $again = 0 Then
    If $nextword = 0 Then
    If $stringside = 0 Then
    If $counter1 < $sizeofcounter1 Then
    $counter1 += 1
    $randomvocable = $word[$counter1]
    $testnumber = $counter1
    Else
    $counter1 = 1
    $randomvocable = $word[$counter1]
    $testnumber = $counter1
    EndIf
    Else
    If $counter2 < $sizeofcounter2 Then
    $counter2 += 1
    $randomvocable = $word2[$counter2]
    $testnumber = $counter2
    Else
    $counter2 = 1
    $randomvocable = $word2[$counter2]
    $testnumber = $counter2
    EndIf
    EndIf
    Else
    If $stringside = 0 Then
    If $counter1 < $sizeofcounter1 Then
    $counter1 += 1
    $randomvocable = $word[$counter1]
    $testnumber = $counter1
    Else
    $counter1 = 1
    $randomvocable = $word[$counter1]
    $testnumber = $counter1
    EndIf
    Else
    If $counter2 < $sizeofcounter2 Then
    $counter2 += 1
    $randomvocable = $word2[$counter2]
    $testnumber = $counter2
    Else
    $counter2 = 1
    $randomvocable = $word2[$counter2]
    $testnumber = $counter2
    EndIf
    EndIf
    EndIf
    EndIf

    $titel6 = GUICreate("Vokabelabfrage", @DesktopWidth, @DesktopHeight+20)
    $label6 = GUICtrlCreateLabel("Tippen Sie bitte die Übersetzung für das folgende Wort ein und beachten Sie die Groß- und Kleinschreibung!:" & @CRLF & @CRLF & $randomvocable, @DesktopWidth/4-50, @DesktopHeight/4)
    $input6 = GUICtrlCreateInput("", @DesktopWidth/4-50, @DesktopHeight/4+200)
    $button61 = GUICtrlCreateButton("Testen", @DesktopWidth/4-50, @DesktopHeight/4+300, 150)
    $button62 = GUICtrlCreateButton("Nächstes Wort", @DesktopWidth/4+150, @DesktopHeight/4+300, 150)
    GUISetState()
    WinSetOnTop($titel6, "", 1)

    While 1
    $operation6 = GUIGetMsg()

    If $operation6 = $GUI_EVENT_CLOSE Then

    ElseIf $operation6 = $button61 Then
    GUIDelete($titel6)
    If $stringside = 0 Then
    MsgBox(0, "..", GUICtrlRead($input6))
    MsgBox(0, "ss", $word2[$testnumber])
    If GUICtrlRead($input6) == $word2[$testnumber] Then
    MsgBox(0, "Super!", "Das eingegebene Wort war korrekt! Die nächste Vokabel wird in 5 Minuten abgefragt!")
    $again = 0
    Asking()
    Else
    MsgBox(0, "Falsch!", "Sie haben das Wort falsch eingegeben! Versuchen Sie es erneut oder klicken Sie auf 'Cancel', um dieses Wort zu überspringen!")
    MsgBox(0, "variablen", "testnumber = " & $testnumber & @CRLF & "counter2 = " & $counter2 & @CRLF & "counter1 = " & $counter1)
    $again = 1
    Asking()
    EndIf

    ElseIf $stringside = 1 Then
    If GUICtrlRead($input6) == $word[$testnumber] Then
    MsgBox(0, "Super!", "Das eingegebene Wort war korrekt! Die nächste Vokabel wird in 5 Minuten abgefragt!")
    $again = 0
    Asking()
    Else
    MsgBox(0, "Falsch!", "Sie haben das Wort falsch eingegeben! Versuchen Sie es erneut oder klicken Sie auf 'Cancel', um dieses Wort zu überspringen!")
    MsgBox(0, "variablen", "testnumber = " & $testnumber & @CRLF & "counter2 = " & $counter2 & @CRLF & "counter1 = " & $counter1)
    $again = 1
    Asking()
    EndIf
    EndIf
    ElseIf $operation6 = $button62 Then
    GUIDelete($titel6)
    $nextword = 1
    Asking()
    EndIf
    WEnd
    EndFunc

    [/autoit]
    • Offizieller Beitrag

    Du machst da zwei gravierende Fehler.
    Zum einen werden immer wieder GUI-Elemente mit den gleichen Variablennamen erzeugt, indem Du die Funktion immer wieder innerhalb der Funktion aufrufst (Rekursion). Zum anderen führt das früher oder später zu einem Absturz von AutoIt, weil die max. Rekursionstiefe erreicht wurde.
    Das solltest Du zuerst mal beheben. Wozu gibt es Schleifen und ContinueLoop/ExitLoop?

  • Wenn ich während einer Schleife abfrage, welcher Button gedrückt wird und bei dem Button auf eine andere Funktion verweise, wie breche ich die Schleife ab, die ich gerade ausgeführt habe, also ich weiß ja mit ExitLoop, aber wohin setze ich dieses? Vor die Verweisung auf eine andere Funktion? Sprich:

    [autoit]


    ExitLoop ;hier würde es ja eig schon abbrechen, und dann könnte ich die funktion nicht mehr abrufen??
    Funktion()

    [/autoit]

    Oder wird das ExitLoop genau nach der Verweisung auf eine Funktion gesetzt ? Sprich:

    [autoit]

    Funktion()
    ExitLoop ; aber dann müsste ich bei der Funktion returnen und könnte von der Funktion keine andere Funktion abrufen ??

    [/autoit]

    Wie mache ich das nun ? ^^

    • Offizieller Beitrag

    Nein, ExitLoop ist zum verlassen einer Schleife (For...Next, While...WEnd, Do...Until). Das verlassen einer Funktion geschieht mit Return.
    Du musst in Deinem Skript aber erstmal die Rekursionsaufrufe entfernen und durch eine Schleife ersetzten. Den Inhalt des Labels kannst Du mit GUICtrlsetData verändern. Das musst Du nicht jedes Mal neu erstellen.

  • Okay, ich verstehe. Danke für den Tipp :)

    Um nicht aus dem Thema zu gleiten, möchte ich wieder auf das GuiCtrlRead-Problem zurück kommen. Wie erreiche ich es, dass er mir nun einen Text als Wert wiedergibt bzw. den richtigen Wert, den ich in eine Gui Input eingebe?

  • Okay, ich teste morgen alles durch und melde mich wieder mit den Ergebnissen. Danke heute erstmal für die Tipps.

  • Ich habe das Script mal ohne die Function Asking() getestet und das GUI liefert fehlerfrei den eingegebenen Wert zurück..
    Es hat nur deshalb etwas gedauert, weil ich das Script erstmal lauffähig kriegen mußte, bevor ich auf die Idee kam, die Function einfach wegzulassen..
    Viel Spaß bei Reparieren ;)
    Gruß
    ytwinky

    (Ich) benutze stets die aktuelle (Beta) und SciTE..

  • Danke für die Tipps Leute, ich bin endlich weitergekommen^^

    Das Problem war GuiDelete($titel). Es war vor dem GuiCtrlRead($input) und nach dem GuiDelete($titel) konnte GuiCtrlRead nur noch eine 0 ausspucken.

    Also jetzt klappt es, das Script ist aber noch nicht fertig, wenn es Fehler gibt, melde ich mich wieder.

    Danke für den Top Service ! :)

    mfg

    sensation