Le premier site francophone dédié au développement Pocket PC

Comment forcer un Textbox à n'accepter que des chiffres
Auteur
Stéphane Sibué
Date 21 mai 2004
 
   


Lorsqu'on veut saisir uniquement des chiffres il existe plusieurs possibilités. La première, la plus simple, consiste à laisser saisir tout ce que veut l'utilisateur et à refuser la saisie au moment de la validation des informations. La seconde, moins simple mais plus sympa consiste à réagir à ce que frappe l'utilisateur (en utilisant certains événements du Textbox) et à repousser les touches qui ne nous conviennent pas. La dernière solution, la plus puissante à mon sens, consiste à utiliser les services du système d'exploitation qui sait de base gérer la saisie de chiffres uniquement dans un Textbox.

Nous allons donc modifier le style du Textbox qui ne doit accepter que des chiffres.

Modifier le style d'un contrôle

Pour modifier le style d'un contrôle, il faut tout d'abord récupérer son style actuel en utilisant la fonction "GetWindowLong" de la librairie "Coredll" avec comme paramètre "nIndex" la constante GWL_STYLE, puis lui ajouter (avec l'opérateur OR) la constante de style que l'on veut lui appliquer. Le style ainsi créé et réinjecté au contrôle grâce à la fonction "SetWindowLong" (elle aussi incluse dans Coredll).

Problème avec le Compact Framework : pas de handle !

Le problème qui se pose à nous est que sous Compact Framewok le Textbox n'expose pas son handle système (le Compact Framework est très très pudique et il n'expose pas grand chose de son intimité système). Il faut donc trouver un moyen de récupérer cette info sans quoi nous ne pourrons modifier le style.

GetFocus à la rescousse !

La solution consiste à utiliser une API, "GetFocus", qui retourne le handle système du contrôle qui a le focus. Le principe est donc de donner le focus au Textbox auquel on veut modifier le style et d'en récupérer le handle avec "GetFocus".

Déclaration des API et des constantes nécessaires

Note : Pour obliger un contrôle TextBox à n'accepter que des chiffres en saisie, il faut lui appliquer le style ES_NUMBER.

Private Declare Function GetFocus Lib "Coredll" () As Int32

Private Declare Function GetWindowLong Lib "coredll" Alias "GetWindowLongW" (ByVal hwnd As Int32, ByVal nIndex As Int32) As Int32

Private Declare Function SetWindowLong Lib "coredll" Alias "SetWindowLongW" (ByVal hwnd As Int32, ByVal nIndex As Int32, ByVal dwNewLong As Int32) As Int32

Private Const GWL_STYLE = -16
Private Const ES_NUMBER = &H2000

Création d'une fonction qui automatise l'application du style

Voici le code de notre petite fonction :

Sub SetNumberBox()

Dim s As Int32
Dim h As Int32

h = GetFocus
s = GetWindowLong(h, GWL_STYLE)
s = s Or ES_NUMBER
SetWindowLong(h, GWL_STYLE, s)

End Sub

Notez bien qu'il faut impérativement que le Textbox auquel vous voulez appliquer le style ES_NUMBER doit avoir le focus au moment de l'appel. Par exemple :

Rem On donne le focus au TextBox TXT_NumeroTelephone
Rem Si on a réussi à le faire on applique le style ES_NUMBER
If TXT_NumeroTelephone.Focus Then SetNumberBox()

Vous pouvez appliquer le style dans l'événement "Load" de la Form, ainsi vous êtes certain que l'application sera effectuée une seule fois.

Conclusion

Et voilà, plus besoin de se prendre la tête à gérer caractère par caractère la saisie de chiffres. De plus, sous Smartphone (si si ça marche aussi) cette fonction oblige le système de saisie à passer en mode numérique ce qui simplifie énormément la saisie depuis le clavier du téléphone.

 

Stéphane Sibué

 

 
   

Copyright 2001-2004 - Tous droits réservés
Toutes les autres marques et produits présents dans ces pages sont la propriété exclusive de leurs sociétés respectives.