Un input qui n'accepte qu'un contenu bien précis défini par un Pattern RegExp
J'utilise l'UDF GUICtrlOnChangeRegister de Mat (Forum anglais - LIEN)
► Afficher le texte
Code : Tout sélectionner
#include <GuiOnChangeRegister.au3>
Global $__MaskInput_Array[1][4] ; ctrl, mask, isValid, valid func
$__MaskInput_Array[0][0] = 0
; # FUNCTION # ==============================================================================================
; Name...........: _MaskInput_Create
; Description....: Creates a Mask Input
; Parameters.....: $sText = Text of the input
; $x, $y, $w, $h = Position and Dimensions
; $sMask = RegExp pattern
; $sValidFunc = Function called when the text in the input fits the Mask pattern
; $iStyle = Input style
; $iExtStyle = Input Extended Style
; Return values..: Succes - The ControlID of the input
; Echec - 0 et @error = 1 -> Bad pattern
; 2 -> GuiCtrlCreateInput Failed
; Author.........: Matwachich
; Remarks........:
; ===========================================================================================================
Func _MaskInput_Create($sText, $x, $y, $w, $h, $sMask = ".*", $sValidFunc = "", $iStyle = -1, $iExtStyle = -1)
StringRegExp("", $sMask)
If @error = 2 Then Return SetError(1, 0, 0) ; Bad pattern
; ---
Local $hCtrl = GuiCtrlCreateInput($sText, $x, $y, $w, $h, $iStyle, $iExtStyle)
If $hCtrl = 0 Then Return SetError(2, 0, 0) ; Control creation failed
; ---
Local $index = $__MaskInput_Array[0][0] + 1
GUICtrlOnChangeRegister($hCtrl, "__MaskInput_Int_OnChangeFunc", $index)
; ---
ReDim $__MaskInput_Array[$index + 1][4]
$__MaskInput_Array[$index][0] = $hCtrl
$__MaskInput_Array[$index][1] = $sMask
$__MaskInput_Array[$index][2] = 0
$__MaskInput_Array[$index][3] = $sValidFunc
$__MaskInput_Array[0][0] += 1
; ---
Return SetError(0, 0, $hCtrl)
EndFunc
Func _MaskInput_IsValid($hCtrl)
Return $__MaskInput_Array[__MaskInput_Int_hCtrlToIndex($hCtrl)][2]
EndFunc
; ==============================================================
; ### Internals
; ==============================================================
Func __MaskInput_Int_OnChangeFunc($index)
Local $hCtrl = $__MaskInput_Array[$index][0]
Local $sMask = $__MaskInput_Array[$index][1]
; ---
Local $read = GuiCtrlRead($hCtrl)
If $read = "" Then
Return GuiCtrlSetBkColor($hCtrl, 0xFFFFFF)
EndIf
; ---
If _StringFit($read, $sMask) Then
GuiCtrlSetBkColor($hCtrl, 0xAAFFA3) ; OK
$__MaskInput_Array[$index][2] = 1
Call($__MaskInput_Array[$index][3], $hCtrl)
Else
GuiCtrlSetBkColor($hCtrl, 0XFFBCB2) ; Bad!
$__MaskInput_Array[$index][2] = 0
EndIf
EndFunc
Func __MaskInput_Int_hCtrlToIndex($hCtrl)
For $i = 1 To $__MaskInput_Array[0][0]
If $__MaskInput_Array[$i][0] = $hCtrl Then Return SetError(0, 0, $i)
Next
Return SetError(1, 0, 0)
EndFunc
Func _StringFit($sStr, $sPattern)
Local $reg = StringRegExp($sStr, $sPattern, 2)
; ---
If Not IsArray($reg) Then Return SetError(1, 0, 0) ; No match
; ---
If UBound($reg) <> 1 Then Return SetError(1, 0, 0) ; Multiples matches
; ---
If $reg[0] <> $sStr Then Return SetError(1, 0, 0) ; Tested string is different from the matched string
; ---
Return SetError(0, 0, 1)
EndFunc