Automatisches Auslesen von Inputbox

  • Guten Morgen =),


    ich stehe mal wieder vor einem Problem.

    Folgendes:
    Ich habe eine GUI, mit 3x Inputfeldern, 1x ComboBox und 3 Button (siehe Anhang).

    Wenn ich nun, wie im Bild, die oberen beiden Felder und unten links das Feld gefüllt habe und den Button "Ausleihen" betätige, dann wird, wie im Bild alles "ausgegraut" bis auf der Button "OK und das rechte Inputfeld.

    Meine Frage wäre jetzt, wie ich es schaffe, dass wenn das rechte Inputfeld 7 zeichen enthält (auf keinen Fall mehr oder weniger) automatisch der Button "Ok" gedrückt wird und seine Funktion ausgeführt wird ?(
    Wichtig dabei ist, dass wirklich die GUI so aussehen muss, wie auf dem Bild, bevor der gewünschte Schritt entretten darf.


    Wenn Quellcode benötigt werden sollte poste ich den gerne auf Anfrage :)

  • Guten Morgen,

    versuche doch in der while schleife dauernd die Inputbox abzufragen und die Stringlänge mithilfe von StringLen($InputBox) zu ermitteln.

    Dann machst du ne Abfrage: If StringLen($InputBox) = 7 then $okaybutton / okaybutton()

    weiß halt net wie dein Quelltext aussieht.
    Müssste aber so realisierbar sein denke ich.

    ~~MBI~~

    _______________________________

    everything is possible with AutoIT

    ___________________________

  • Hey Danke für deine schnelle Antwort,


    hier mal der ganze relevante Quellcode:

    [autoit]


    ;~ #include <Function.au3>
    #include <User_Interface.au3>
    #include <Date.au3>

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

    ;~ --Voreinstellungen--------------------------------------------------------------------------------------------------------------------------------------------------------
    ;~ GUICtrlSetState ($Rueckgabe,$GUI_Disable)
    ;~ GUICtrlSetState ($Ausleihen,$GUI_Disable)
    GUICtrlSetState ($Techniker,$GUI_FOCUS)
    DirCreate(@ScriptDir&"\Daten")
    $Date = Date()
    $Pfad_Techniker = @ScriptDir&"\Daten\Techniker.ini"
    $datenbankpfad = @ScriptDir&"\USB_Stick_Datenbank.accdb"
    $Ausgeliehen_Stick = @ScriptDir&"\Daten\Temp\Ausgeliehene_Sticks.ini"
    $Ausgeliehen_Datum_Name_Stick_Box = @ScriptDir&"\Daten\Lend_Date"&$Date&".ini"
    $Rueckgabe_Stick = @ScriptDir&"\Daten\Rueckgabe_Sticks.ini"
    $Rueckgabe_Datum_Name_Stick_Box = @ScriptDir&"\Daten\Return_Date"&$Date&".ini"
    @WorkingDir
    $Overview = @ScriptDir&"\Daten\Temp\Overview.ini"
    $tabellenname = "Stickuebersicht"
    $Spalte = "ID"
    $Spalte1 = "Box"
    $Spalte2 = "Stick"
    $Spalte3 = "User"
    $time = 0

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

    ;~ ###############################Voreinstellungen########################################

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

    ComboBox_fill($Pfad_Techniker,"Techniker",$Techniker,"neuen Techniker")

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

    ;~ #######################################################################################
    While 1

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

    ;~ ###############################Programm################################################
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit

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

    ;~ --Techniker hinzufügen---------------------------------------------------------------------------------------------------------------------------------------------------
    Case $Techniker_Add
    Passwort("AdminTC",$Konsole_Techniker_Add)
    Case $End_Add
    Cancel($Konsole_Techniker_Add)
    Case $Add_Button
    Add($Neuer_Techniker_Add,$Kennwort_Input,$Kennwort_Input2,$Pfad_Techniker,"Techniker",$Techniker,"neuen Techniker")

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

    ;~ --Techniker entfernen----------------------------------------------------------------------------------------------------------------------------------------------------
    Case $Techniker_Delete
    $ArrayDelete = IniReadSection(@ScriptDir&"\Daten\Techniker.ini","Techniker")
    If @error = 0 Then
    Passwort("AdminTC",$Konsole_Techniker_Delete)
    Techniker_ListView($ListView_Delete,$Pfad_Techniker,"Techniker")
    Elseif @error = 1 Then
    MsgBox(0+64,"Fehler","Vorgang kann nicht ausgeführt werden.",2)
    EndIf
    Case $Cancel_Delete
    Cancel($Konsole_Techniker_Delete)
    Case $Delete_Techniker
    $ArrayDelete = IniReadSection(@ScriptDir&"\Daten\Techniker.ini","Techniker")
    Techniker_Delete($ListView_Delete,$Pfad_Techniker,"Techniker",$Pfad_Techniker)
    _GUICtrlComboBox_ResetContent($Techniker)
    If FileExists($Pfad_Techniker) Then
    Global $Array = IniReadSection($Pfad_Techniker,"Techniker")
    If Not @error Then
    _GUICtrlComboBox_ResetContent($Techniker)
    $LastIndex = $Array[0][0]
    For $i = 1 To $LastIndex Step 1
    _GUICtrlComboBox_AddString($Techniker, $Array[$i][0])
    Next
    IniReadSection($Pfad_Techniker,"Techniker")
    Else
    Sleep(500)
    GUISetState(@SW_Hide, $Konsole_Techniker_Delete)
    EndIf
    EndIf
    ;~ --Return---------------------------------------------------------------------------------------------------------------------------
    Case $Return
    ComboBox_fill($Pfad_Techniker,"Techniker",$Techniker,"neuen Techniker")
    GUICtrlSetState($Techniker,$GUI_Enable)
    GUICtrlSetState($Kennwort,$GUI_Enable)
    GUICtrlSetState($StickBox,$GUI_Enable)
    GUICtrlSetState($Sticknummer,$GUI_Disable)
    GUICtrlSetState($Ausleihen,$GUI_Enable)
    GUICtrlSetState($Rueckgabe,$GUI_Enable)
    GUICtrlSetState($OK,$GUI_Disable)
    GUICtrlSetData($Kennwort,"")
    GUICtrlSetData($Sticknummer,"")
    GUICtrlSetData($StickBox,"")
    GUICtrlSetState($Techniker,$GUI_FOCUS)

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

    ;~ --Authentifizierung-----------------------------------------------------------------------------------------------------------------------------------------------------
    Case $Ausleihen
    $sTechniker = GUICtrlRead($Techniker)
    $sKennwort = GUICtrlRead($Kennwort)
    $sStickBox = GUICtrlRead($StickBox)
    ;~ $sSticknummer = GUICtrlRead($Sticknummer)

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

    If $sKennwort = "" And $sTechniker = "" And $sStickBox = "" Then
    MsgBox(0+64,"Fehler","Zum Fortfahren Techniker auswählen, Kennwort eingeben und Stick-Box eingeben.",4)
    $Enter = 0
    ElseIf $sKennwort = "" Then
    MsgBox(0+64,"Fehler","Zum Fortfahren Kennwort eingeben.",3)
    ElseIf $sTechniker = "" Then
    MsgBox(0+64,"Fehler","Zum Fortfahren Techniker auswählen.",3)
    ElseIf $sStickBox = "" Then
    MsgBox(0+64,"Fehler", "Zum Fortfahren Stickbox eingeben.",3)
    ElseIf $sKennwort <> "" And $sTechniker <> "" And $sStickBox <> "" Then
    $Search = _ArraySearch($Array,$sTechniker)
    $Search2 = _ArraySearch($Array, $sKennwort,$Search,$Search)
    $query1 = "SELECT * FROM "&$tabellenname&" WHERE Box = '"&$sStickBox&"'"
    $strData = String(_ReadOneFld($query1, $datenbankpfad, $Spalte))
    ;~ MsgBox(0,"",$strData)
    If $strData = True Then
    If $Search = $Search2 Then
    SplashTextOn("Anmeldung","Anmeldung erfolgreich.", 230,50)
    Sleep(100)
    GUICtrlSetState($Techniker,$GUI_Disable)
    GUICtrlSetState($Kennwort,$GUI_Disable)
    GUICtrlSetState($StickBox,$GUI_Disable)
    GUICtrlSetState($Sticknummer,$GUI_Enable)
    GUICtrlSetState($Ausleihen,$GUI_Disable)
    GUICtrlSetState($Rueckgabe,$GUI_Disable)
    GUICtrlSetState($OK,$GUI_Enable)
    GUICtrlSetState($Sticknummer,$GUI_FOCUS)
    SplashOff()
    Else
    MsgBox(0+16,"Authentifizierungsfehler", "Kennwort stimmt nicht mit Techniker überein."&@CRLF&"Bitte erneut eingeben.",5)
    EndIf
    ElseIf $strData = False Then
    MsgBox(0+64,"Fehler","Diese Stickbox exestiert nicht. Bitte Eingabe überprüfen.",5)
    GUICtrlSetState($StickBox,$GUI_FOCUS)
    EndIf
    EndIf

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

    so und danach müsste das passieren, was ich vorhabe, ich weiß aber nicht, wie ich das machen soll. Wenn ich dieses oben unter das while schreibe, dann ist es ja rund um die uhr in der Ausführung

  • Einfach nach dem alles augegraut wurde eine IF Abfrage einbauen:

    [autoit]

    if StringLen(GUICtrlRead($input)) = 7 Then
    GUICtrlSendMsg($ok_button, $BM_CLICK, 0, 0)
    EndIf

    [/autoit]


    Wenn der Inhalt der Inputbox passt musst du nur noch eine Msg an dein Button schicken. Die Funktion die dann deinem Button zugewiesen ist, wird durchgeführt.

    Damit der Button aber nicht immer wieder angeklickt wird, da die ifabfrage immer true ist (die 7 Zeichen in der Inputbox stehen ja immer noch drin musst du noch etwas einbauen, so dass die If Abfrage auf false gesetzt wird.
    Eventuell einfach die Inputbox leeren, wenn nicht mehr benötigt.

    ===========================================
    Friedrich Schiller - Einfachheit ist das Resultat der Reife.

  • So wie du es oben hattest dürfte es nicht funktionieren. Weil du den inhalt der Inputbox benötigst. Deshalb GUICtrlRead :)

    Edit: du hast es ja davor in die Variable geschrieben. Nur die falsche Variable aufgerufen. Es fehlte ein s unten bzw. ein s oben war zu viel :P

    ===========================================
    Friedrich Schiller - Einfachheit ist das Resultat der Reife.

    • Offizieller Beitrag

    Man sollte das auslagern und die Änderung im Inputfeld überwachen.
    Bsp.

    Spoiler anzeigen
    [autoit]

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

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

    $hGui = GUICreate('Test')
    $input = GUICtrlCreateInput('', 10,10,150,20)
    $hIn = GUICtrlGetHandle($input)
    GUISetState()

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

    GuiRegisterMsg($WM_COMMAND, 'WM_COMMAND')

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

    Do
    Until GUIGetMsg() = -3

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

    Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
    Local $hWndFrom, $iIDFrom, $iCode, $hWndEdit
    $hWndFrom = $ilParam
    $iCode = BitShift($iwParam, 16) ; Hi Word
    Switch $hWndFrom
    Case $hIn
    Switch $iCode
    Case $EN_CHANGE ; Sent when the user has taken an action that may have altered text in an edit control
    Select
    Case StringLen(GUICtrlRead($input)) = 7
    GUICtrlSetStyle($input, $ES_READONLY)
    ConsoleWrite('7 Zeichen eingegeben' & @LF)
    EndSelect
    EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_COMMAND

    [/autoit]
  • OK ich muss doch nochmal stören:

    Ich hab folgendes gecoded:

    [autoit]


    While 1
    While 2
    $sStickbox = GUICtrlRead($StickBox)
    $SticknummerS = GUICtrlRead($Sticknummer)

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

    If StringLen($SticknummerS) = 7 Then
    ;~ Sleep(500)
    $Send = GUICtrlSendMsg($OK,$BM_Click,0,0)
    MsgBox(0,"",$Send)
    If $Send = 0 then MsgBox(0,0,"")
    ExitLoop
    ElseIf StringLen($SticknummerS) < 7 Then
    ExitLoop
    EndIf
    WEnd

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

    $nMsg = GUIGetMsg()
    Switch $nMsg
    ;~ Case StringLen($SticknummerS) = 7
    ;~ $Send = GUICtrlSendMsg($OK,$BM_Click,0,0)
    Case $GUI_EVENT_CLOSE
    Exit

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

    Case $OK
    $sStick = String(GUICtrlRead($Sticknummer))
    ;~ MsgBox(0,"Stick",$iStick)
    $sBox = String(GUICtrlRead($StickBox))
    ;~ MsgBox(0,"Box",$iBox)
    ;~ $iName = String(GUICtrlRead($Techniker2))
    ;~ MsgBox(0,"Name",$iName)
    ;~ MsgBox(0,"Alles OK", "Alles OK")
    ;~ GUICtrlSetData($Sticknummer,"")
    $query = "SELECT * FROM "&$tabellenname&" WHERE Stick = '"&$sStick&"' and Box = '"&$sBox&"'"
    $strData = String(_ReadOneFld($query, $datenbankpfad, $Spalte))
    ;~ MsgBox(0,"Read",$strData&$Spalte)
    If $strData = True Then
    MsgBox(0,"","ID Gefunden",1)
    ;~ ---------------------UPDATE---------------------
    ;~ SplashTextOn("","")
    ;~ $adoCon = ObjCreate("ADODB.Connection")
    ;~ $adoCon.Open("Provider=Microsoft.ACE.OLEDB.12.0; Data Source="&$datenbankpfad&";")
    ;~ $adoRs = ObjCreate("ADODB.Recordset")
    ;~ $update = "UPDATE "&$tabellenname&" SET Benutzer = '"&$iName&"' WHERE Stick = '"&$iStick&"' AND Box = '"&$iBox&"'"
    ;~ $adoRs.CursorType = 1
    ;~ $adoRs.LockType = 3
    ;~ $adoRs.Open($update,$adoCon)
    ;~ $adoCon.Execute($update)
    ;~ MsgBox(0,"", "Update",1)
    ;~ MsgBox(0,"Update",$update)
    ;~ $adoCon.Close
    ;~ SplashOff()
    ElseIf $strData = False Then
    SplashTextOn("Fehler","Nicht Gefunden", 270,50)
    Sleep(300)
    GUICtrlSetData($Sticknummer,"")
    GUICtrlSetState($Sticknummer,$GUI_FOCUS)
    SplashOff()
    EndIf

    [/autoit]

    Das auskommentierte ist wichtig, ist aber zu Testzwecken bei mir auskommentiert.


    Problem ist das ich bei

    [autoit]

    GUICtrlSendMsg($OK, &BM_Click,0,0)

    [/autoit]

    eine "0" also Failure erhalte, obwohl, der OK Button betätigt wird und alles enthaltene ausgeführt wird. Allerdings in doppelter Ausführung ?( Trotz ExitLoop

  • [autoit]

    While 2
    $sStickbox = GUICtrlRead($StickBox)
    $SticknummerS = GUICtrlRead($Sticknummer) If StringLen($SticknummerS) = 7 Then ;ist solange erfüllt, bis das Eingabefeld kürzer ist.
    ;~ Sleep(500)
    $Send = GUICtrlSendMsg($OK,$BM_Click,0,0)
    MsgBox(0,"",$Send)
    If $Send = 0 then MsgBox(0,0,"")
    ExitLoop
    ElseIf StringLen($SticknummerS) < 7 Then
    ExitLoop
    EndIf
    WEnd

    [/autoit]

    Die while-Schloeife allgemein ist unnötig... machs doch einfach so:

    [autoit]

    if stringlen(guictrlgetdata($Sticknummer))>=7 and NOT $bSended then
    GUICtrlSendMsg($OK,$BM_Click,0,0) ;alternativ: mach ne funktion, die beim buttonaufruf und hier aufgerufen wird (sie beihaltet dann alles, was jetzt bei dem button steht)
    $bSended=true
    elseif $bSended then
    $bSended=false
    endif

    [/autoit]
  • Upps... :D
    Ja. Da war ich in Gedanken woanders :rolleyes:
    Ich meinte guictrlread ;)

    und NOT $bSended heißt, dass wenn $bSended False ist, wird true zurückgegeben, andernfalls false. Es negiert den boolschen Wert. (Dadurch wird das ganze nur einmal aufgerufen. Der Inhalt des Eingabefeldes muss erst weniger als 7 zeichen enthalten haben, damit der Button erneut geklickt wird.

    (Wobei ich sagen muss, dass BugFix die bessere Möglichkeit gepostet hat. Ich würde sie vorziehen. Hätte er sie nicht vorgeschlagen hätte ich das gemacht ;))

    • Offizieller Beitrag

    Allerdings versteh ich BugFix Funktion so, als dass diese String Eingabe bei 7 Zeichen in den Zwischenspeicher lädt und dann das Inputfeld ausgraut.

    Du kannst an der Stelle genausogut eine Funktion aufrufen. Ich habe den Style der Inputbox auf Disable gesetzt, damit weitere Eingaben nach Erreichen der geforderten Länge nicht möglich sind. ;)