(Inputbox) nur Buchstaben

  • Hi,
    wollt mal fragen, ob man die Eingaben der Inputbox nur auf
    Buchstaben begrenzen kann, damit keine Zahlen
    geschrieben werden.

    3 Mal editiert, zuletzt von Slyfex (8. Dezember 2009 um 18:42)

  • [autoit]

    $read = GUICtrlRead($input)
    If Not StringRegExp($read, "[a-zA-Z]") Then MsgBox(0, "Fehler", "Es dürfen nur Buchstaben eingegeben werden!")

    [/autoit]

    MFG FireFlyer

    *Paradox ist, wenn man sich im Handumdrehen den Fuss bricht* :D

  • Puhh vllt mit einem solchen regexp: (ist jetzt aber ungetestet!) ich weiss jetzt auch nicht in welcher reihenfolge du zahlen und buchstaben haben willst etc.

    [autoit]

    StringRegExp($string, "([a-zA-Z])([0-9]{1}|1[0-2]{2})")

    [/autoit]

    Ich hoffe der tuts :S

    Mach am besten mal ein paar beispiele was für Strings du erlauben möchtest und welche nicht ;)

    MFG FireFlyer

    *Paradox ist, wenn man sich im Handumdrehen den Fuss bricht* :D

  • Hier ein Regex der (hoffentlich) alle kombinationen von Zahlen bis 12 und Buchstaben zulässt:
    zb: Test12Test, 1Test2Test3, Test, 1, 12, 12Test aber nicht 25, 25Test, Test2Test54R usw.

    [autoit]

    StringRegExp($String,"\b([a-zA-Z]+(1[0-2]|[0-9]|\b))+[a-zA-Z]*|\b(1[0-2]|[0-9])((([a-zA-Z]+)+((1[0-2]|[0-9])|\b))+\b|\b)")

    [/autoit]


    Und hier nur für zahlen von 1-12

    [autoit]


    StringRegExp($String,"\b(1[0-2]|\d)\b")

    [/autoit]

    Bugfix kann den ersten RegEx wahrscheinlich kürzer schreiben.
    Hier meine Testliste:

    Spoiler anzeigen
  • Erst danke für die Hilfe, aber bei mir funktioniert beides nicht so wie gewollt
    Könnt ihr bitte ein editiertes Script hochladen, indem nur Zahlen von 1 - 12 erlaubt sind, also keine Buchstaben

  • Wenn ich die UDF so umändere:

    Spoiler anzeigen
    [autoit]

    #include-once

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

    #include

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

    If Not IsDeclared("WM_COMMAND") Then Global Const $WM_COMMAND = 0x0111
    If Not IsDeclared("WM_MOVE") Then Global Const $WM_MOVE = 0x0003
    If Not IsDeclared("WM_LBUTTONDOWN") Then Global Const $WM_LBUTTONDOWN = 0x0201
    If Not IsDeclared("WM_RBUTTONDOWN") Then Global Const $WM_RBUTTONDOWN = 0x0204

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

    Global $sToolTip_Text[2] = ["You can only type a number here", "Unacceptable Character:"]
    Global $sInputs_Array[1]

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

    GUIRegisterMsg($WM_COMMAND, "MY_WM_COMMAND")
    GUIRegisterMsg($WM_MOVE, "WM_CLEAR_TOOLTIP")
    GUIRegisterMsg($WM_LBUTTONDOWN, "WM_CLEAR_TOOLTIP")
    GUIRegisterMsg($WM_RBUTTONDOWN, "WM_CLEAR_TOOLTIP")

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

    ; $CtrlId must be an ID value, -1 can not be used!
    Func _GuiInputSetOnlyNumbers($CtrlId)
    Local $iUbound = UBound($sInputs_Array)
    ReDim $sInputs_Array[$iUbound+1]
    $sInputs_Array[$iUbound] = $CtrlId
    EndFunc

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

    Func _Input_Changed($hWnd, $CtrlId)
    ToolTip("")
    Local $Read_Input = GUICtrlRead($CtrlId)
    If StringRegExp($Read_Input, '\b([1-9]|1[0-2])\b') Then
    GUICtrlSetData($CtrlId, StringRegExpReplace($Read_Input, '\b([1-9]|1[0-2])\b', ''))

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

    Local $Gui_Get_Pos = WinGetPos($hWnd)
    Local $Ctrl_Get_Pos = ControlGetPos($hWnd, "", $CtrlId)

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

    Local Const $SM_CYCAPTION = 4 ;Titelbar heigth
    Local Const $SM_CXFIXEDFRAME = 7 ;Window border size

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

    Local $X_Pos = $Gui_Get_Pos[0] + $Ctrl_Get_Pos[0] + $Ctrl_Get_Pos[2] + GetSystemMetrics($SM_CXFIXEDFRAME)
    Local $Y_Pos = $Gui_Get_Pos[1] + $Ctrl_Get_Pos[1] + $Ctrl_Get_Pos[3] + GetSystemMetrics($SM_CYCAPTION)

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

    ToolTip($sToolTip_Text[0], $X_Pos, $Y_Pos, $sToolTip_Text[1], 3, 1+4)
    DllCall("user32.dll", "int", "MessageBeep", "int", 0x0)
    EndIf
    EndFunc

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

    Func WM_CLEAR_TOOLTIP($hWnd, $iMsg, $wParam, $lParam)
    ToolTip("")
    Return $GUI_RUNDEFMSG
    EndFunc

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

    Func MY_WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
    If $hWnd = 0 Or Not WinExists($hWnd) Then Return $GUI_RUNDEFMSG

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

    Local $nNotifyCode = BitShift($wParam, 16)
    Local $nID = BitAND($wParam, 0xFFFF)
    Local Const $EN_CHANGE = 0x300
    Local Const $EN_UPDATE = 0x400
    Local Const $EN_SETFOCUS = 0x100
    Local Const $EN_KILLFOCUS = 0x200

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

    For $i = 1 To UBound($sInputs_Array)-1
    If $nID = $sInputs_Array[$i] Then
    Switch $nNotifyCode
    Case $EN_UPDATE ;$EN_CHANGE
    _Input_Changed($hWnd, $sInputs_Array[$i])
    Case $EN_SETFOCUS, $EN_KILLFOCUS
    ToolTip("")
    EndSwitch
    ExitLoop
    EndIf
    Next

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

    Return $GUI_RUNDEFMSG
    EndFunc

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

    Func GetSystemMetrics($Flag)
    Local $iRet = DllCall('user32.dll', 'int', 'GetSystemMetrics', 'int', $Flag)
    Return $iRet[0]
    EndFunc

    [/autoit]


    Kann ich nur noch Buchstaben eingeben
    Ist im Script ein Fehler?

  • Ja ist es. Denn das Script sucht nun nach Zahlen von 1-12, und wenn diese Vorhanden sind, gibt es die Fehlermeldung. Der RegEx muss umgedreht werden. Aber ich weiß grad nich wirklich wie (So viel ahnung von Regex hab ich dann doch nicht.) Warte einfach mal bis Bugfix den Thread findet. Der weiß bescheid :D

  • Ähm das If StringRegExp kannst du einfach durch If Not StringRegExp

    Bei dem StringRegExpReplace muss man wie Suebo schon richtig sagte den Regexp umdrehen, wenn du auf diese automatische ersetzen funktion verzichten kannst, kannst du sie vorerst einfach mal auskommentieren.

    MFG FireFlyer

    *Paradox ist, wenn man sich im Handumdrehen den Fuss bricht* :D

  • Ganz einfache Lösung von BugFix:

    Spoiler anzeigen
    [autoit]

    If Not StringRegExp($Read_Input, '\b([1-9]|1[0-2])\b') Then
    GUICtrlSetData($CtrlId, '')

    [/autoit]