davidguillon
Messages postés81Date d'inscriptionlundi 9 août 2004StatutMembreDernière intervention15 septembre 2009
-
10 avril 2007 à 15:57
davidguillon
Messages postés81Date d'inscriptionlundi 9 août 2004StatutMembreDernière intervention15 septembre 2009
-
11 avril 2007 à 01:16
B'jour!
Je suis méga débutant et même les infos que je trouvent à droite, à gauche sur le net me parraissent trop compliquées...
Je suis en train de faire un formulaire et j'aimerai effectuer des vérifications sur le remplissage de celui-ci. En gros, grand classique je suppose, j'aimerais que le code postal saisi par l'utilisateur ne contienne que des entiers. Pour celà, j'ai trouvé une petite procédure qui me permet de vérifier les caractères saisis à partir de leur code ascii. La procédure est la suivante:
Private Sub txtCodePostal_KeyPress(KeyAscii As Integer) If KeyAscii 8 Or Chr(KeyAscii) m_DecimalChar Then
Exit Sub
End If
If Chr(KeyAscii) < "0" Or Chr(KeyAscii) > "9" Then
KeyAscii = 0
Beep
End If
End Sub
Point positif, ça fonctionne! Mais maintenant, j'aimerai bien pouvoir utiliser ce bout de programme sans avoir à faire un copier coller à chaque fois ... Le système de fonction me parrait donc être le bon, non?
Pour celà, j'avais imaginé faire ma fonction:
Sub fonctionNumerique If KeyAscii 8 Or Chr(KeyAscii) m_DecimalChar Then
Exit Sub
End If
If Chr(KeyAscii) < "0" Or Chr(KeyAscii) > "9" Then
KeyAscii = 0
Beep
End If
puis de l'appeler en cas de besoin de la manière suivante:
Private Sub txtCodePostal_KeyPress(KeyAscii As Integer)
call fonctionNumerique
End sub
Mais dans ce cas là, la saisie dans le champs n'est pas bloquée, tous les caractères s'affichent MAIS il y a un Beep à chaque caractère.
Donc j'aimerais savoir si quelqu'un peut me donner un coup de main afin que seuls les entiers apparaissent ;)
Merci beaucoup de votre aide :)
David
A voir également:
Ma procédure fonctionne mal...(vérification de saisie dans un formulaire)
violent_ken
Messages postés1812Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention26 octobre 20102 10 avril 2007 à 16:21
Violent Ken
Salut, voilà quelque chose de plus simple :
Option Explicit
Private Sub txtCodePostal_KeyPress(KeyAscii As Integer)
KeyAscii = FonctionNumerique(KeyAscii)
End Sub<hr />
Private Function FonctionNumerique(nb As Integer) As Integer If nb < 48 Or nb > 57 Then FonctionNumerique 0 Else FonctionNumerique nb
End Function , ----
By Renfield @+
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 10 avril 2007 à 16:21
Bonjour,
Une fonction reçois des paramètres et retourne une valeur.
1) tu n'utilises pas là une fonction, mais une sous-routine .
2) tu ne passes aucun paramètre et ne reçois donc rien en retour de ton appel !
paramètre à passer à une fonction ? peut-être la valeur de keyascii, non ?
valeur retournée par une fonction ? peut être une booléenne True ou False , non ?
et si true : au retour de l'appel : keyascii = 0 : beep
Genre, donc : if controlons(keyascii) then beep: keyascii = 0
et ta fonction :
private function controlons(KK as integer)
controlons = False If KK 8 Or Chr(KK) m_DecimalChar or isnumeric(chr(KK)) Then exit sub
controlons = true
End function
Devrait suffire !
Fait à main levée et à contrôler, donc....
davidguillon
Messages postés81Date d'inscriptionlundi 9 août 2004StatutMembreDernière intervention15 septembre 2009 10 avril 2007 à 16:22
Merci sincèrement de vos réponses.
Vos deux propositions ne sont pas exactement les mêmes vu qu'un des deux propose le mot "function". Sauf erreur de ma part, une "function" ne devrait pas retrouner une valeur?
J'ai toutefois une erreur qui arrive lorsque je lance mon appli, avec l'une ou l'autre des solutions:
erreur de compilation:
type défini par l'utilisateur non défini
Alors est-ce que j'ai oublié une déclaration qqpart?
Merci encore de votre aide!
David
PS: j'étudie la proposition de jmfmarques que je viens de recevoir ;)
violent_ken
Messages postés1812Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention26 octobre 20102 10 avril 2007 à 16:25
Violent Ken
Pour empêcher la saisie de caractères autres que des chiffres, regarde le bout de code que j'ai posté avant (plus optimisé que de faire des Chr()...)
@+
davidguillon
Messages postés81Date d'inscriptionlundi 9 août 2004StatutMembreDernière intervention15 septembre 2009 10 avril 2007 à 16:36
violent_ken, ta solution me convient parfaitement, je m'occuperai d'ajouter le support de la touche d'effacement. Je vais essayer d'y arriver seul :)
Par contre je ne comprends pas exactment la gestion de ta variable "nb" au moment du "Else FonctionNumerique = nb". Je comprends que "FonctionNumerique" prend la valeur de "nb". Or pour moi "FonctionNumerique" est une fonction... pas une variable. Merci de m'expliquer où je me plante :)
Aussi, tu as mis un "Option Explicit" au début du code, cette ligne m'a planté le programme, je l'ai enlevé... et ça fonctionne maintenant! Dois-je la remettre? Si oui... où? et à quoi sert-elle? :p
Merci encore, et merci jmfmarques! Si jamais vous pouvez m'expliquer en quoi le bout de code que j'avais propose (et que vous m'aviez corrigé dans un premier temps) était plus performant que la proposition de violent_ken, j'en serai ravi et me repencherai sur ce code si finalement il y a des avantages non négligeables :) j'aurai sans doute une ou deux autres questions à venir ... J'espère que vous serez toujours là :D
violent_ken
Messages postés1812Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention26 octobre 20102 10 avril 2007 à 16:47
Violent Ken
Alors :
"Par contre je ne comprends pas exactment la gestion de ta variable "nb" au moment du "Else FonctionNumerique nb". Je comprends que "FonctionNumerique" prend la valeur de "nb". Or pour moi "FonctionNumerique" est une fonction... pas une variable. Merci de m'expliquer où je me plante :)" > FonctionNumerique est une fonction : elle prend donc des paramètres et renvoie une valeur.If nb < 48 Or nb > 57 Then FonctionNumerique 0 Else FonctionNumerique nb
--> cela signifie : "Si la valeur du KeyAscii passée en paramètre n'est pas entre 48 et 57, alors le retour de la fonction sera 0, sinon le retour de la fonction aura la valeur du KeyAscii que l'on avait passé en paramètre".
"Aussi, tu as mis un "Option Explicit" au début du code, cette ligne m'a planté le programme, je l'ai enlevé... et ça fonctionne maintenant! Dois-je la remettre? Si oui... où? et à quoi sert-elle? :p"
> Option Explicit permet à Visual Studio de n'accepter le code uniquement quand il ne comporte plus d'erreur de syntaxe. Autrement dit, si tu as oublié de déclarer des variables, si tu as fait des erreurs quelque part dans le code de ta form, le 'Option explicit' te le signalera.
C'est plus propre de le mettre (comme çà si çà compile çà veut dire qu'il n'y a pas d'erreurs), mais ce n'est pas indispensable.
Je te conseille de le laisser et de corriger les erreurs qui ont été montrées par VB6. Normalement, il faudrait le mettre tout le temps, en en tête de chaque form, module, classe, usercontrol... Mais bon ;)
violent_ken
Messages postés1812Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention26 octobre 20102 10 avril 2007 à 16:50
Violent Ken
J'ajouterais également (dsl pour le double post) qu'il est possible de demander à Visual Studio d'ajouter automatiquement 'Option Explicit' dans chaque nouvelle form, classe, module...
Il faut aller dans les options, et cocher "Déclaration des variables obligatoires" dans l'onglet "Editeur".
davidguillon
Messages postés81Date d'inscriptionlundi 9 août 2004StatutMembreDernière intervention15 septembre 2009 10 avril 2007 à 16:58
Ca c'est de la réponse claire pour débutant comme moi :) Merci beaucoup :)
Je suis en train de rechercher comment mettre sur une meme ligne la condition nécessaire pour que nb soit compris entre 48 et 57 mais que le 127 soit accepté aussi :)
C'est sans doute pas compliqué mais quand on ne sait pas faire... il faut chercher :D
violent_ken
Messages postés1812Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention26 octobre 20102 10 avril 2007 à 17:00
Violent Ken
Option Explicit
Private Sub txtCodePostal_KeyPress(KeyAscii As Integer)
KeyAscii = FonctionNumerique(KeyAscii)
End Sub<hr />
Private Function FonctionNumerique(nb As Integer) As Integer If (nb < 48 Or nb > 57) And nb <> 127 Then FonctionNumerique 0 Else FonctionNumerique nb
End Function ,
davidguillon
Messages postés81Date d'inscriptionlundi 9 août 2004StatutMembreDernière intervention15 septembre 2009 10 avril 2007 à 17:19
Une petite dernière question...
D'après mes recherches que je fais sur le net en ce moment même, j'ai l'impression que le fait que ma fonction soit dans mon code directement ou dans un module n'ait pas d'importance... Or, si je met ma fonction dans un module, mon appli ne la trouve plus. J'ai bien tenté de mettre Module.Fonction dans l'appel de la fonction mais non, ça ne semble pas être la bonne solution :)
diablamanshadow
Messages postés419Date d'inscriptionlundi 30 août 2004StatutMembreDernière intervention28 janvier 2008 10 avril 2007 à 17:58
bon je vais tenter de sauver la mise (a peine modeste XD)
voila le code le plus simple que j'ai pu trouver pour ca :
Private Sub Text1_KeyPress(KeyAscii As Integer)
Dim allowedKeys As String
allowedKeys = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" & Chr(8)
If InStr(allowedKeys, Chr(KeyAscii)) 0 Then KeyAscii 0
End Sub
entre les " tu met les caracteres autoriser donc chiffre ou lettres etc (ici toutes les majuscules, minuscules et chiffres sont autoriser ;-))
le chr(8) ses la touche backspace (pour qu'il puisse effacer la saisie ^^)
j'ai jamais trouver plus simple que ca :> suffit de mettre ce code comme ca, les carac autoriser et hop ses nikel ^^ le reste est bloquer lors de la saisie (et le copier coller va pas non plus pour pas fausser ^^)
voila voila en esperant avoir aider (car mettre les codes ascii autoriser c'etais pas mon truc donc j'avais toruver ce bout de code ^^)