InputBox einschränken

    • Offizieller Beitrag

    Die InputBox: Nein!
    Eine eigene GUI mit Input-Control: Ja!

    [autoit]


    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    $hGUI = GUICreate('')
    $Edit = GUICtrlCreateInput('', 20, 20, 200, 20)
    GUISetState()
    GUIRegisterMsg($WM_COMMAND, '_WM_COMMAND')
    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE

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

    Func _WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
    If BitAND($wParam, 0x0000FFFF) = $Edit Then
    GUICtrlSetData($Edit, StringRegExpReplace(GUICtrlRead($Edit), '\W', '')) ; nur a-z, A-Z, 0-9 und _ erlaubt
    EndIf
    Return $GUI_RUNDEFMSG
    EndFunc ;==>_WM_COMMAND

    [/autoit]
  • Wie wäre das denn?
    Ist ein bisschen spärlich beschrieben und auskommentiert, aber ich bin ja uach noch nich fertig ^^

    Spoiler anzeigen
    [autoit][/autoit] [autoit][/autoit] [autoit]

    #include <GuiConstants.au3>
    #include <Array.au3>
    Global $sInputs_Array[1][2]

    [/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 certain characters.", "Unacceptable Character:"]

    [/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][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;string rückgabe
    $input = _InputBox(3,"InputBox Beispiel","[0-9a-z] = Keine Zahlen oder Kleinbuchstaben|[A-Z] = Keine Großbuchstaben|[0-5aeiou] = Keine Zahlen von 0 bis 5 und keine kleingeschriebenen Vokale", _
    "ABCDEFG|nur klein|9876KLMNRS","[0-9a-z]|[A-Z]|[0-5aeiou]",1)
    MsgBox(0,"",$input)

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

    ;Array Rückgabe
    $aInput = _InputBox(3,"InputBox Beispiel","[0-9a-z] = Keine Zahlen oder Kleinbuchstaben|[A-Z] = Keine Großbuchstaben|[0-5aeiou] = Keine Zahlen von 0 bis 5 und keine kleingeschriebenen Vokale", _
    "ABCDEFG|nur klein|9876KLMNRS","[0-9a-z]|[A-Z]|[0-5aeiou]")
    _ArrayDisplay($aInput)

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

    Func _InputBox($iCount,$sTitle,$sText,$sDefault,$sRegExp="",$iMode=0,$sDelim="|")
    ;Author: SEuBo
    ;$iCount: Anzahl der "Inputgruppen"
    ;$sTitle: Titel der _InputBox
    ;$sText: Text für die einzelnen Gruppen. Hier wird ein Trennzeichenseperierter String benötigt
    ;BSP: "1|2|3". Das Trennzeichen kann in $sDelim selbst bestimmt werden, falls das erwünscht ist
    ;$sDefault: Default-Text für die Input felder. Hier wird wieder ein seperierter String benötigt.
    ;$iMode: Der Rückgabemodus. 0 (Standard) = Array. 1 = mit $sDelim seperierter String.
    Dim $sInputs_Array[1][2]
    $OnEvent = Opt("GUIOnEventMode",0)
    Local $aData[$iCount+1][2], $ifCount = 0, $aText = StringSplit($sText,$sDelim), $aDefault = StringSplit($sDefault,$sDelim), $aRegExp = StringSplit($sRegExp,$sDelim)
    If $iCount = "" OR $iCount < 1 OR $iMode < 0 OR $iMode > 1 OR $sDelim = "" Then
    Return SetError(2,0,"")
    EndIf
    If $aDefault[0] < $iCount+1 Or $aDefault[0] > $iCount+1 Then
    ReDim $aDefault[$iCount+1]
    EndIf
    If $aText[0] < $iCount+1 Or $aText[0] > $iCount+1 Then
    ReDim $aText[$iCount+1]
    EndIf
    If $aRegExp[0] < $iCount+1 or $aRegExp[0] > $iCount+1 Then
    ReDim $aRegExp[$iCount+1]
    EndIf
    $_InputBox = GUICreate($sTitle,220,65+$iCount*95,-1,-1,-1,0x00000008)
    For $i = 1 to $iCount
    $aData[$i][0] = GUICtrlCreateLabel($aText[$i], 20, ($ifCount*95)+20, 180, 50)
    $aData[$i][1] = GUICtrlCreateInput($aDefault[$i], 20, ($ifCount*95)+75, 180, 25)
    _GUIInputSetRegExp($aData[$i][1],$aRegExp[$i])
    $ifCount +=1
    Next
    $hButton = GUICtrlCreateButton("Ok",20,(($ifCount-1)*95)+110,80,25)
    $hCancel = GUICtrlCreateButton("Cancel",120,(($ifCount-1)*95)+110,80,25)
    GUISetState()
    While 1 * Sleep(50)
    $nMsg = GUIGetMsg()
    Switch $nMsg
    case -3, $hCancel
    GUIDelete($_InputBox)
    Return SetError(1,0,"")
    Case $hButton
    Switch $iMode
    Case 0
    Local $aRet[$iCount]
    For $i = 1 to $iCount
    $aRet[$i-1] = GUICtrlRead($aData[$i][1])
    Next
    GUIDelete($_InputBox)
    Return $aRet
    Case 1
    Local $aRet
    For $i = 1 to $iCount
    $aRet &= GUICtrlRead($aData[$i][1]) & $sDelim
    Next
    GUIDelete($_InputBox)

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

    Return StringTrimRight($aRet,1)
    EndSwitch
    EndSwitch
    WEnd
    Opt("GUIOnEventMode",$OnEvent)
    EndFunc

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

    ;MrCreator========>
    ;Edited by SEuBo
    Func _GUIInputSetRegExp($CtrlId,$sRegExp)
    Local $iUbound = UBound($sInputs_Array)
    ReDim $sInputs_Array[$iUbound+1][2]
    $sInputs_Array[$iUbound][0] = $CtrlId
    $sInputs_Array[$iUbound][1] = $sRegExp
    EndFunc

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

    Func _Input_Changed($hWnd, $CtrlId, $iIndex)
    ToolTip("")
    Local $Read_Input = GUICtrlRead($CtrlId)
    If StringRegExp($Read_Input,$sInputs_Array[$iIndex][1]) Then
    GUICtrlSetData($CtrlId, StringRegExpReplace($Read_Input, $sInputs_Array[$iIndex][1], ''))

    [/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][0] Then
    Switch $nNotifyCode
    Case $EN_UPDATE ;$EN_CHANGE
    _Input_Changed($hWnd,$sInputs_Array[$i][0],$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] [autoit][/autoit] [autoit]

    ;<==========

    [/autoit]
  • Wichtig für dich sind nur Zeile 21-29. Du kannst natürlich statt 3 "Gruppen" auch nur eine machen

    [autoit]

    ;string rückgabe
    $input = _InputBox(1,"InputBox Beispiel","[0-9a-z] = Keine Zahlen oder Kleinbuchstaben", "ABCDEFG","[0-9a-z]",1)
    MsgBox(0,"",$input)

    [/autoit]


    Dann sieht es aus wie eine ganz normale InputBox.

    bei dem Parameter $sRegExp kannst du einen regulären Ausdruck eingeben, den du filtern möchtest. zB: [aeiou] filtert alle kleingeschriebenen Vokale.

    Für infos zu RegEx:
    http://www.regenechsen.de/phpwcms/index.php?id=66,0,0,1,0,0
    Hier eine Liste mit RegEx Elementen:
    http://www.regenechsen.de/phpwcms/index.php?regex_allg_liste