Textabfrage GUICtrlread

  • Hallo zusammen,

    ich habe folgende Frage:

    [autoit]

    If Not GUICtrlRead($Name) = "Ralf" Then
    MsgBox(16,"FEHLER","Namen nicht bekannt!")
    ContinueLoop
    EndIf

    [/autoit]

    Wo liegt der Fehler? Ich möchte mehrere Namen überprüfen lassen und nur dann weiter, wenn einer der Namen richtig eingegeben wurde.

    wie kann ich mehre Namen überprüfen, und warum funktionert das so nicht, wie ich das gemacht habe?

    Vielen Dank!

    2 Mal editiert, zuletzt von Sirius (21. Dezember 2013 um 16:03)

  • Hallo Sirius,

    versuch es mal so:

    [autoit]

    $sName = GUICtrlRead($Input1)
    If $sName = "Ralf" Then
    MsgBox(0,"Richtig","Der Name ist bekannt")
    Else
    MsgBox(0,"Falsch","Der Name ist nicht bekannt")
    EndIf

    [/autoit]

    Ich hoffe ich konnte dir weiterhelfen.

    LG F4R

    Ein Spoiler im Spoiler im Spoiler...

    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen

    Die geheime Nachricht ist "Baum" !

  • Um dich einmal auf deinen Fehler aufmerksam zu machen:
    Das Schüsselwort Not wird noch vor dem Vergleich interpretiert.
    Das bedeutet, dass zuerst Not GUICtrlRead($Name) ausgeführt wird (was entweder True oder False ergibt) und das Ergebnis mit "Ralf" verglichen wird.
    Folgende beide Möglichkeiten existieren demnach:
    True = "Ralf"
    False = "Ralf"

    Dies lässt sich ganz leicht mit Klammern umgehen:
    Not (GUICtrlRead($Name) = "Ralf")

  • @Make-Grafik, man lernt echt jeden Tag etwas dazu :) Das wusste ich jedenfalls noch nicht.
    Ich habe solche Abfragen immer mit ElseIf etc. geschrieben.

    Ein Spoiler im Spoiler im Spoiler...

    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen

    Die geheime Nachricht ist "Baum" !

  • Vielen Dank Make-Grafik.
    Genau das war das Problem. Ich habe mir gedacht, dass Not an dieser Stelle falsch sein muss, aber ich wusste nicht, wie ich es anders machen sollte. :)

  • Hallo hab doch nochmal ne Frage zu dem Thema.
    Könnte ich mit Iniread arbeiten?
    Ich erstelle eine .ini wo alle Namen aufgelistet sind.

    [autoit]


    If Not (GUICtrlRead($Name) = "Ralf") Then
    MsgBox(16,"FEHLER","Namen nicht bekannt!")
    ContinueLoop
    EndIf

    [/autoit]

    Jetzt soll da, wo "Ralf" steht, die .ini nach dem Namen durchsucht werden. Wenn der Name nicht in die .ini existiert dann Fehlermeldung.
    Hab leider noch nie mit Iniread gearbeitet, weil ich Anfänger bin.

    Oder gibt es eine andere Möglichkeit sowas umzusetzten?

    Geht sowas?

    Vielen Dank!

  • Es gibt genug Möglichkeiten irgendetwas irgendwie umzusetzen. ^^
    Es kommt eigentlich immer auf’s Vorhaben an.

    Um mal deine Frage bezüglich der *.ini Datei zu beantworten:
    Natürlich lässt sich dies mit *.ini Dateien realisieren. Dafür brauchst du im Grunde nur die Funktion IniReadSection(). Du legst die *.ini Datei an und speicherst alle Namen beispielweise unter den Sektionsnamen „Name“. Die Key’s (Schlüssel) kannst du dir dann aussuchen. Im Nachhinein kannst du dann ganz einfach in einer Schleife überprüfen ob der gewünschte Name dabei ist:

    Spoiler anzeigen
    [autoit]

    $sINI = 'example.ini'
    $avName = IniReadSection($sINI, 'Name')

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

    $bIsName = False
    For $i = 1 To $avName[0][0]
    If Not (GUICtrlRead($id) = $avName[$i][1]) Then $bIsName = True
    Next

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

    If $bIsName Then
    ; Wenn Name drinne ist dann diesen Code ausführen...
    EndIf

    [/autoit]
  • Ich versteh im Ganzen nicht, was da passiert. Ich weiß auch nicht, wie ich die .ini aufbauen muss. Wie gesagt, ich bin Anfänger.

    Namen.ini

    [Namen]
    1=Ralf
    2=Peter
    3=Nadine

    ist das so richtig?

    Ich versteh auch nicht, wie ich das jetzt umschreiben soll. Also von meinem:

    [autoit]

    If Not (GUICtrlRead($Name) = "Ralf") Then
    MsgBox(16,"FEHLER","Namen nicht bekannt!")
    ContinueLoop
    EndIf

    [/autoit]

    auf das, was du gemacht hast.

  • [autoit]

    ; Eine INI Datei ist immer folgendermaßen aufgebaut:
    ; [section]
    ; key=value

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

    ; section - Dies darfst du dir als eine Art Überschirft vorstellen.
    ; key - Der key entspricht einer Variable in AutoIt. Mit dem key kannst du auf die Werte zugreifen.
    ; value - Der eigentliche Wert

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

    ; Mit IniReadSectionNames können alle Sektionen aus der INI ausgelesen werden.
    ; Mit IniReadSection können alle key's und value's aus einer Sektion ausgelesen werden.
    ; Mit IniRead kann ein bestimmter Wert aus einer Bestimmten Sektion ausgelesen werden.

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

    $sINI = 'example.ini' ; Name der INI Datei
    $avName = IniReadSection($sINI, 'Name') ; Hier wird die Sektion [Name] aus der INI ausgelesen.
    ; Es wird ein 2 dimensionales Array zurück gegeben was folgendermaßen aufgebaut ist:
    ; [0] [1]
    ; [0] Anzahl der Elemente 0
    ; [1] Name des key Der Wert
    ; [2] Name des key Der Wert
    ; [3] Name des key Der Wert

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

    ; Beispiel für folgende INI:
    ; [Namen]
    ; 1=Ralf
    ; 2=Peter
    ; 3=Nadine

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

    ; [0] [1]
    ; [0] 3 0
    ; [1] 1 Ralf
    ; [2] 2 Peter
    ; [3] 3 Nadine

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

    ; Man kann sich ein 2 dimensionales Array als eine Tabelle vorstellen...

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

    $bIsName = False ; Initalisierung der Variable (Name wurde ja nich nicht gefunden)
    For $i = 1 To $avName[0][0] ; Alle Elemente von 1 bis n durchgehen. (In der oberen INI wäre dies bis 3.)
    If Not (GUICtrlRead($id) = $avName[$i][1]) Then $bIsName = True ; Wenn Inhalt des Input Control's dem Inhalt des Controls entspricht,
    ; dann die Variable auf True setzen um anzugeben dass sichd er Name in der INI befindet.
    Next

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

    If $bIsName Then
    ; Wenn Name drinne ist dann diesen Code ausführen...
    EndIf

    [/autoit]

    Am besten schaust du dir einmal Array's an. Ich vermute dass dort dein Verständnisproblem liegt...

  • Ich würde eher zu einer Möglichkeit mit nur einem Key (und ohne Arrays) tendieren...
    Es gibt doch bestimmt ein Zeichen, welches in den Benutzernamen nie vorkommt?
    Ich nehme als Beispiel mal das Pipe-Zeichen | ( AltGr + < ).

    Dann baust du deine config.ini wie folgt auf:

    Code
    [users]
    userlist=chesstiger|Make-Grafik|Tux|Ralf

    Im Code dann wiederum:

    [autoit]


    $sINI = "config.ini"
    $sUsersAllowed = "|" & IniRead($sINI, "users", "userlist", "") & "|"

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

    $sUserLogin = InputBox("", "Benutzername?")

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

    If Not StringInStr($sUsersAllowed, "|" & $sUserLogin & "|") Then
    MsgBox(0, "", "Benutzer nicht bekannt!")
    Exit
    EndIf

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

    MsgBox(0, "", "Login erfolgreich!")

    [/autoit]

    Die Spielerei mit den Pipe-Zeichen in Zeile 2 und 6 muss sein, da sonst bei der gegebenen Userliste ein Login mit "chess" möglich wäre, obwohl dort nur "chesstiger" steht (StringInStr gibt natürlich dann einen positiven Wert zurück). Daher überprüfen wir, ob vor und nach dem Benutzernamen ein | steht. ^^

    Die Lösung mit Arrays wäre evtl. eleganter, aber auch aufwändiger, und performance-lastiger.

    lg