Nur bestimmte Eingaben in GuiCtrlCreateInput zulassen. Wie?

  • Hallo liebe Community,

    Wie setzt man folgendes um:
    1. Das auschließlich ein 4stellige Zahlen in ein GuiCtrlCreateInput Feld eigetragen werden kann.
    2. Das auschließlich eine URL (http://www...) in ein GuiCtrlCreateInput Feld eingetragen werden kann.
    3. Das nur Text und Zahlen (bzw. keine Leer- und Sonderzeichen) in ein GuiCtrlCreateInput Feld eingetragen werden können.

    Danke

    Einmal editiert, zuletzt von Root (16. April 2009 um 17:11)

  • Ich würde bei der Verarbeitung der Daten prüfen ob sie gültig sind.

    also beim ersten textfeld
    mit Stringlen und StringIsDigit

    Beim 2 mit StringinStr prüfen ob zb "http" vorhanden ist.

    Leerzeichen kannst du mit StringStripeWS selber rausnehmen.

    Sind die Bedingungen nicht erfüllt wird die Verabeitung abgebrochen und den User mit ner Msgbox auf den Fehler hinweisen.

  • Hi

    Vielleicht so?

    Spoiler anzeigen
    [autoit]

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

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

    Global $hGui, $hInput1, $hInput2, $hInput3, $hLabel

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

    $hGui = GUICreate("Test", 420, 200)
    $hInput1 = GUICtrlCreateInput("1234", 10, 10, 400, 20, $ES_NUMBER)
    GUICtrlSetLimit(-1, 4)
    $hInput2 = GUICtrlCreateInput("http://www.autoit.de", 10, 40, 400, 20)
    $hLabel = GUICtrlCreateLabel("", 10, 70, 100, 20)
    $hInput3 = GUICtrlCreateInput("123ABCabc", 10, 110, 400, 20)
    GUISetState()
    _CheckUrl()

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

    GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")

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

    While GUIGetMsg() <> -3
    Sleep(5)
    WEnd

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

    Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
    #forceref $hWnd, $iMsg
    Local $hWndFrom, $iIDFrom, $iCode, $hWndInput2, $hWndInput3
    If Not IsHWnd($hInput2) Then $hWndInput2 = GUICtrlGetHandle($hInput2)
    If Not IsHWnd($hInput3) Then $hWndInput3 = GUICtrlGetHandle($hInput3)
    $hWndFrom = $ilParam
    $iIDFrom = _WinAPI_LoWord($iwParam)
    $iCode = _WinAPI_HiWord($iwParam)
    Switch $hWndFrom
    Case $hInput3, $hWndInput3
    Switch $iCode
    Case $EN_UPDATE ; Sent when an edit control is about to redraw itself
    _CheckString()
    EndSwitch
    Case $hInput2, $hWndInput2
    Switch $iCode
    Case $EN_UPDATE ; Sent when an edit control is about to redraw itself
    _CheckUrl()
    EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_COMMAND

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

    Func _CheckUrl() ;pattern from http://www.osix.net/modules/article/?id=586
    Local $sPattern = "^(https?://)" & _
    "?(([0-9a-z_!~*'().&=+$%-]+: )?[0-9a-z_!~*'().&=+$%-]+@)?" & _; //user@
    "(([0-9]{1,3}\.){3}[0-9]{1,3}" & _; // IP- 199.194.52.184
    "|" & _; // allows either IP or domain
    "([0-9a-z_!~*'()-]+\.)*" & _; // tertiary domain(s)- www.
    "([0-9a-z][0-9a-z-]{0,61})?[0-9a-z]\." & _; // second level domain
    "[a-z]{2,6})" & _; // first level domain- .com or .museum
    "(:[0-9]{1,4})?" & _; // port number- :80
    "((/?)|" & _; // a slash isn't required if there is no file name
    "(/[0-9a-z_!~*'().;?:@&=+$,%#-]+)+/?)$"
    Local $sUrl = GUICtrlRead($hInput2)
    If StringRegExp($sUrl, $sPattern) Then
    GUICtrlSetData($hLabel, "URL korrekt")
    GUICtrlSetBkColor($hLabel, 0x00FF00)
    Else
    GUICtrlSetData($hLabel, "URL nicht korrekt")
    GUICtrlSetBkColor($hLabel, 0xFF0000)
    EndIf
    EndFunc ;==>_CheckUrl

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

    Func _CheckString()
    Local $sString = GUICtrlRead($hInput3)
    GUICtrlSetData($hInput3, StringRegExpReplace($sString, "[^a-zA-Z0-9]", ""))
    EndFunc ;==>_CheckString

    [/autoit]

    lgE

  • Danke für eure Tips.
    Das mit der URL und den Leerzeichen funktioniert.

    eukalyptus
    Wenn ich deine Funktion nun auch auf die 4stellige Zahl anwenden will (siehe Code), klappt das nicht. Wo ist der Fehler? Liegt es daran, dass ich nun zwei derartige Funktionen habe?

    [autoit]


    $enter_id = GuiCtrlCreateInput("", 300, 290, 30, 20, $ES_NUMBER)
    $id = GUICtrlRead($enter_id)
    $fLabel=GUICtrlCreateLabel("",300, 310, 110, 14)
    _Checklen()

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

    GUIRegisterMsg($WM_COMMAND, "WM_COMMAND1")

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

    While GUIGetMsg()<> -3
    Sleep(5)
    WEnd

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

    Func WM_COMMAND1($hWnd, $iMsg, $iwParam, $ilParam)
    #forceref $hWnd, $iMsg
    Local $hWndFrom, $iIDFrom, $iCode, $hWndEdit
    If Not IsHWnd($enter_id) Then $hWndInput = GUICtrlGetHandle($enter_id)
    $hWndFrom = $ilParam
    $iIDFrom = _WinAPI_LoWord($iwParam)
    $iCode = _WinAPI_HiWord($iwParam)
    Switch $hWndFrom
    Case $enter_id, $hWndInput
    Switch $iCode
    Case $EN_UPDATE ; Sent when an edit control is about to redraw itself
    _Checklen()
    EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_COMMAND1

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

    Func _Checklen()
    Local $len = StringLen($id)
    If 4 <> $len Then
    GUICtrlSetData($fLabel,"ID korrekt")
    GUICtrlSetBkColor($fLabel,0x00FF00)
    Else
    GUICtrlSetData($fLabel,"ID nicht korrekt")
    GUICtrlSetBkColor($fLabel,0xFF0000)
    EndIf
    EndFunc

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