Input Box minesteingabelänge

  • Hallo Gemeinde,

    ich hab mal wieder ein Problem und absolut keinen Lösungsansatz.
    Vieleicht hat ja von euch schon mal so ein Pb. gelöst.
    Ich hab ein kleines Program mit InputBox,
    Die User sollen dort einen Dateinamen eingeben, dann wird die Orginaldatei gesichert und eine neue von einem anderen Verzeichnis geholt.
    Fuinktioniert alles einwandfrei.
    Nun werden die Namen komplexer bzw. länger und ich möchte gerne mit Wildcards arbeiten.
    Dabei soll der Nutzer aber eine mindestlänge an Zeichen eingeben.
    Anders gesagt, wenn der User nciht mindestens 6 Zeichen eingibt soll eine Fehlermeldung erscheinen, wenn die min. Anzahl Zeichen eingegeben wird, soll das Prog. weitermachen.

    Nur, wie kann ich die Anzahl eingegebener Zeichen prüfen?

    Vielen Dank für eure Hilfe.
    Gruß
    Manfred

    Ja, ich weiß es auch, das Problem ist einen halben Meter vor dem Bildschirm. 8o

    Einmal editiert, zuletzt von Mr-Ferret (30. August 2013 um 10:28)

  • Mal schnell im Browser getippt:

    [autoit]

    Do
    $s = InputBox("Beispiel", "")
    Until StringLen($s) > 6

    [/autoit]


    Sollte den Zweck erfüllen. :D

    There's a joke that C has the speed and efficieny of assembly language combined with readability of....assembly language. In other words, it's just a glorified assembly language. - Teh Interwebz

    C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do, you blow off your whole leg. - Bjarne Stroustrup
    Genie zu sein, bedeutet für mich, alles zu tun, was ich will. - Klaus Kinski

  • Herzlichen Dank für die schnelle Antwort, ich hab damit heute nicht mehr gerechnet! :thumbup:
    Der erste Schritt ist gemacht, ich hab da nun folgendes im Schnelltest zusammen getippt.

    Nun ist es leider so, das nach der Eingabe des 6'ten Zeichen das Fenster geschlossen wird.
    Die Eingabe eines weiteren Zeichens ist nicht möglich. Es sollte eine Mindestlänge sein, hier ist es aber auch eine Maximallänge.
    Noch einen Tipp?

    Vielen Dank!

    Ja, ich weiß es auch, das Problem ist einen halben Meter vor dem Bildschirm. 8o

  • Nicht nur einen. :D
    1) Dein Button sollte vielleicht vor GUISetState (ist rein kosmetisch).
    2) Die Variablen solltest du einmal am Anfang des Skriptes deklarieren.
    3) Du solltest vielleicht das Anklicken des Buttons abfragen.

    [autoit]

    Do
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    Exitloop
    Case $Weiter
    $Dux = GUICtrlRead($DuxFile)
    If (StringLen($Dux) < 6) Then
    MsgBox(16, "Fehler", "Der Dateiname muss mindestens 6 Zeichen lang sein.")
    Else
    ; dein Code hier
    EndIf
    EndSwitch
    Until False

    [/autoit]
  • Ist deine Frage eigentlich nicht mit simpler Logik beantwortbar? :D

    Ich erklärs für dich kurz:

    [autoit]

    Do
    Global $Dux = GUICtrlRead($DuxFile) ; Zudem deklarierst du jedensmal die Variable als global neu ;)
    Until StringLen($Dux) > 5
    MsgBox(0, "", $Dux)

    [/autoit]


    So. Wenn mehr als 5 Zeichen eingegeben wurden, wird die "Until"-Bedingung erfüllt und das Skript weiter ausgeführt.

    Hier mal ein Beispielskript mit einem eigenem Fenster:

    [autoit]

    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #Include <GuiButton.au3>

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

    $Eingabebox = GUICreate("EingabeBox",350,350,-1,-1,-1,-1)
    $Dux = GUICtrlCreateInput("",60,40,150,20,-1,512)
    $Weiter = GUICtrlCreateButton("Weiter",240,300,100,30,-1,-1)

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

    GUISetState(@SW_SHOW, $Weiter)

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

    While 1
    Switch GUIGetMsg()
    Case -3 ; Falls auf das "X" in der rechten oberern Ecke geklickt wird.
    Exit
    Case $idBtn_Weiter
    $File = GUICtrlRead($Dux)

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

    If StringLen <= 6 Then ; Falls die Stringlänge kleiner gleich 6 ist
    MsgBox(0, "", "Dateiname zu kurz!")
    Else
    ; Was du auch immer sonst machen möchtest
    EndIf
    EndSwitch
    WEnd

    [/autoit]

    //Edit: Och menno, James war schneller :P

    There's a joke that C has the speed and efficieny of assembly language combined with readability of....assembly language. In other words, it's just a glorified assembly language. - Teh Interwebz

    C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do, you blow off your whole leg. - Bjarne Stroustrup
    Genie zu sein, bedeutet für mich, alles zu tun, was ich will. - Klaus Kinski

  • Super, das ist es, vielen Dank! :thumbup:

    Danke auch für die Erklärung, ich werde weiter fleissig lernen. :D

    Gruß
    Manfred

    Ja, ich weiß es auch, das Problem ist einen halben Meter vor dem Bildschirm. 8o

  • Da dein Problem ja nun gelöst ist, setze bitte den Thread-Präfix auf gelöst. ;)
    (1. Post bearbeiten)

    There's a joke that C has the speed and efficieny of assembly language combined with readability of....assembly language. In other words, it's just a glorified assembly language. - Teh Interwebz

    C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do, you blow off your whole leg. - Bjarne Stroustrup
    Genie zu sein, bedeutet für mich, alles zu tun, was ich will. - Klaus Kinski

    • Offizieller Beitrag

    Du kannst ja auch während der Eingabe die Schriftfarbe ändern um auf Unterschreiten der Länge aufmerksam zu machen. Das Bsp. ermöglicht dir beliebig viele Inputs mit dieser Funktion zu überwachen, die jeweils unterschiedliche Längen zulassen. Du kannst auch während der Programmausführung die Längen Überschreiben, indem du die Funktion "_SetTextLimit" erneut aufrufst.

    Spoiler anzeigen
    [autoit]

    $hGui = GUICreate('Test')
    $cIn1 = GUICtrlCreateInput('', 20, 20, 150, 20)
    _SetTextLimit($cIn1, 6) ; == Mindestlänge: 6
    $cIn2 = GUICtrlCreateInput('', 20, 60, 150, 20)
    _SetTextLimit($cIn2, 10) ; == Mindestlänge: 10

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

    GUISetState()

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

    GuiRegisterMsg($WM_COMMAND, 'WM_COMMAND')

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

    While 1
    Switch GUIGetMsg()
    Case -3
    Exit
    EndSwitch
    WEnd

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

    Func _SetTextLimit($_iControl, $_iLimit, $_sFunc='')
    Local $hCtrl = $_iControl
    If Not IsHWnd($hCtrl) Then $hCtrl = GUICtrlGetHandle($hCtrl)
    Local Static $aCtrl
    Local $aTmp[1][2]
    If $_sFunc = 'get' Then
    If Not IsArray($aCtrl) Then Return -1
    For $i = 0 To UBound($aCtrl) -1
    If $aCtrl[$i][0] = $hCtrl Then Return $aCtrl[$i][1]
    Next
    Return -1
    EndIf
    If Not IsArray($aCtrl) Then
    $aTmp[0][0] = $hCtrl
    $aTmp[0][1] = $_iLimit
    Else
    $aTmp = $aCtrl
    Local $fMatch = False
    For $i = 0 To UBound($aTmp) -1
    If $aTmp[$i][0] = $hCtrl Then
    $aTmp[$i][1] = $_iLimit
    $fMatch = True
    ExitLoop
    EndIf
    Next
    If Not $fMatch Then
    ReDim $aTmp[UBound($aTmp)+1][2]
    $aTmp[UBound($aTmp)-1][0] = $hCtrl
    $aTmp[UBound($aTmp)-1][1] = $_iLimit
    EndIf
    EndIf
    $aCtrl = $aTmp
    EndFunc

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

    Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
    Local $hWndFrom, $iIDFrom, $iCode, $hWndEdit, $iLen
    $hWndFrom = $ilParam
    $iIDFrom = BitAND($iwParam, 0xFFFF) ; Low Word
    Local $iMaxLen = _SetTextLimit($iIDFrom, 0, 'get')
    If $iMaxLen = -1 Then Return $GUI_RUNDEFMSG
    $hWndEdit = GUICtrlGetHandle($iIDFrom)
    $iLen = StringLen(GUICtrlRead($iIDFrom))
    If $iLen < $iMaxLen Then ; == wenn Überschreiten markiert werden soll, einfach ">" statt "<" verwenden
    GUICtrlSetColor($iIDFrom, 0xFF0000)
    Else
    GUICtrlSetColor($iIDFrom, 0x000000)
    EndIf
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_COMMAND

    [/autoit]