CONTRÔLEUR NUMÉRIQUE DE SAISIE

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 - 27 oct. 2004 à 12:38
vienbv Messages postés 14 Date d'inscription lundi 1 novembre 2004 Statut Membre Dernière intervention 17 mars 2010 - 13 avril 2007 à 19:24
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/27124-controleur-numerique-de-saisie

vienbv Messages postés 14 Date d'inscription lundi 1 novembre 2004 Statut Membre Dernière intervention 17 mars 2010
13 avril 2007 à 19:24
Bonjour,

Merci beaucoup pour ce code qui m'aide a résoudre le probleme que j'ai eu depuis quelque temps
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
12 avril 2006 à 19:04
Voilà, réponse retrouvée et remise.

Pas de temps pour la philo, je passe la main en restant convaincu de ce que j'ai mis plus haut, suffit de regarder les offres d'emploi.
PS: Ne va pas croire qu'il n'y a que les crétins qui se mettent à leur compte.
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
12 avril 2006 à 18:53
Nenni ce n'est pas moi, je viens de rentrer à l'instant.
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
12 avril 2006 à 16:17
oupps, JoePatent, j'ai supprimé un des doublon de ton message s'en même l'avoir lu....
je suppose que BruNews est a l'origine de la suppression du dexuième doublon...

résultat des courses, je n'ai pas lu ta réponse....
JoePatent Messages postés 171 Date d'inscription jeudi 30 janvier 2003 Statut Membre Dernière intervention 20 juillet 2008
12 avril 2006 à 14:56
"le pisseur de pseudo code " Peut travailler aussi bien dans son salon que dans des projets majeurs.

Il gagne en expérience en cotoyant sur une base régulière d'autre "pisseur de pseudo code " diplômé universitaire et ingénieur et il gagne en débrouillardise en travaillant en plus seul dans son salon.

Il est capable de faire la différence entre une opération arithmétique et une comparaison. Il s'est ce qu'est une bonne habitude de programation avec un code clair et concis. Il code dans le day to day pour que n'importe qui qui ouvre son code puisse rapidement tout comprendre et avoir des points de repères précis.

Meilleur chance la prochaine fois BruNews. Tu peux sortir de quoi de plus intelligent que simplement dire : "Un bon programmeur solo est mieux qu'un pas bon programmeux en équipe." Tout le monde sait que les programmeux restent très longtemps en équipe sur de gros projets. Il ne se font jamais sortir au bout de quelques semaines c'est connu.

Ceci dit, as-tu un opinion mon pseudo champion du sophisme sur la présente situation qui est très basic. Où tu as peur de te mouiller et de ta faire étiqueter par toi-même de pisseur de code ?
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
11 avril 2006 à 22:14
"Combien tu vaux ?", je trouve à cette expression Anglo-Saxonne la vertu de coller au principe de réalité.
Je crois (et même certain) que le pisseur de pseudo code du famameux 'gros' projet vaut quasi toujours bien moins que le mec seul dans son salon qui fera du prog sur commande.
JoePatent Messages postés 171 Date d'inscription jeudi 30 janvier 2003 Statut Membre Dernière intervention 20 juillet 2008
11 avril 2006 à 20:36
"120" <= "90"
renvoie vrai..... il faut donc mieux faire gaffe où l'on met les pieds, et prendre de bonnes habitudes

Renfield, il te manque vraiment de connaissance en langage de prog de base. Jamais travaillé dans de gros projet par équipe ?

Ton code doit être facilement lisible et parmi les standards donné au programmeurs, celui-là y est.

On ne veut pas apprend la table ascii par coeur. Alors on emploie le caractère.

Faut être de mauvaise foi pour ensuite tenter une comparaison ou une opération entre deux chiffre "hardcodé" en string.

Tu pars vraiment de loin. Tu vas rester longtemps en vb6 tout seul dans ton salon.
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
11 avril 2006 à 09:56
Je vois bien l'utilité de ce genre de comparaison de chaines (tri, recherche, etc)
ça agit comme un StrComp...

là ou je dit non, c'est que :

"120" <= "90"
renvoie vrai..... il faut donc mieux faire gaffe où l'on met les pieds, et prendre de bonnes habitudes


d'autant que les evenements clavier (KeyPress ou KeyDown/Up) donne en parametre le code Ascii (Numérique, donc) des touches.... inutile alors de passer par une chaine de caractère...

VB ne gère pas ça comme en C, où 't' équivaut à marquer 116 (à un cast près, parfois)
cs_gogomanu Messages postés 29 Date d'inscription mardi 7 janvier 2003 Statut Membre Dernière intervention 26 mars 2009
11 avril 2006 à 08:48
Je cite reinfield:
"une String superieure a une autre, ca n'a pas de sens"

Je suis désolé mais c'est au contraire tout à fait censé, il s'agit ni plus ni moins d'une comparaison de chaînes.

Le code derrière cela fonctionne en comparant les chaînes octet par octet jusqu'à arriver à la plus petite des deux chaînes.
Nul besoin de conversion de type pour comparer cela.
Il faut raisonner C++ ou assembleur, et en C++ il est possible de comparer des "char", sans conversion car un char Ascii est la même chose qu'un nombre entre 0 et 255.

Utilité de comparaison de chaînes ?

- Recherche dichotomique (dans un tableau trié on teste l'élément du milieu, s'il est 'inférieur' à notre clé de recherche le programme teste le milieu entre le milieu du tableau et la fin etc.)

- Comparaison de dates. Je trouve Microsoft (VB, access, ASP) particulièrement compliqué avec ses dates aux formats changeants (et buggés). En PHP une date est "yyyy-mm-dd hh:nn:ss" ce qui rend la comparaison de dates simple: il suffit de comparer deux chaînes de même longueur, ce qui est encore plus simple.
bonnint Messages postés 10 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 15 décembre 2004
15 déc. 2004 à 22:51
Désolé de relancer le smilblick ! bonnint a essayé la modif,!
retour à la case départ, voici le * c'est à dire le p la touche fn doit être pressée pour avoir le p.
seule solution enlever la ligne qui bloque la clavier
'Call TurnOn(VK_NUMLOCK)
ensuite c'est encore bloqué, et la seule solution est de demander l'antidote, efficace, mais une usine à gaz !
En conclusion; ce code est incomplet, car il ne tient pas compte des configurations régionales, qui elles sont paramétrées avant de lancer ce petit programme.
A compléter donc pour le bien de tous !
FENETRES Messages postés 196 Date d'inscription jeudi 15 juillet 2004 Statut Membre Dernière intervention 14 avril 2009
12 nov. 2004 à 12:49
alias (nom) = not(bonne intention)
"Les plaisanteries les plus courtes sont toujours les meilleures."
FENETRES Messages postés 196 Date d'inscription jeudi 15 juillet 2004 Statut Membre Dernière intervention 14 avril 2009
12 nov. 2004 à 10:23
Dernière précision pour ceux qui doutent encore, voici l'adresse exacte du code source Microsoft.
http://support.microsoft.com/?id=177674
FENETRES Messages postés 196 Date d'inscription jeudi 15 juillet 2004 Statut Membre Dernière intervention 14 avril 2009
12 nov. 2004 à 10:01
Référencée par Microsoft et testée depuis très longtemps, l'activation du pavé numérique n'a jamais à ma connaissance générée d'erreur fonctionnelle. Par nécessité, j'ai intégrée cette fonctionnalité en 1996 pour deux clients importants sans aucune erreur jusqu'à ce jour (une de ces application est de portée mondiale).
Alors, à chacun son point de vue !
bonnint Messages postés 10 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 15 décembre 2004
10 nov. 2004 à 23:12
je ne vois pas l'interet de fournir des codes avec un clavier state pour la France, avec libellé en francais.
codes qui plante sans savoir expliquer ce qui se passe
q4e fa5re -a5ntenant, voila ce qui se passe 0
merci pour les conseils.ca modifie des fichiers system q4e 6n ne peut pas modifier !
FENETRES Messages postés 196 Date d'inscription jeudi 15 juillet 2004 Statut Membre Dernière intervention 14 avril 2009
10 nov. 2004 à 15:24
Ce n'est pas moi qu'il faut remercier ! L'origine du code source permettant d'activer le pavé numérique est indiquée en commentaire (base de connaissance Microsoft).
bonnint Messages postés 10 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 15 décembre 2004
10 nov. 2004 à 14:42
MERCI POUR CET EXEMPLE.
dePUIS MON CLAVIER N'EST PLUS CONFIGURE ...
IMPOSSIBLE DE RECONFIGURER
-ercI POUR VOTRE AIDE0 JE DOIS APPUYER SUR FN POUR
TROUVER LA BONNE TOUCHE
xP RECHARGE MAIS IDEM
RUNTIME IMPOSSIBLE A TROUVER
FENETRES Messages postés 196 Date d'inscription jeudi 15 juillet 2004 Statut Membre Dernière intervention 14 avril 2009
2 nov. 2004 à 10:19
Gestion de la mantisse
Dans le cadre d'un calcul scientifique, on aurait pu espérer saisir une puissance de 10. Or, il est impossible de saisir le caractère "E" qui définit la mantisse pour le système. Ce contre exemple peut suffire pour exclure
la gestion par l'API.
exemple sytème:
val("2E3") = 2000
JoePatent Messages postés 171 Date d'inscription jeudi 30 janvier 2003 Statut Membre Dernière intervention 20 juillet 2008
29 oct. 2004 à 20:07
faudrait décompiler, pour se rendre compte de la cuisine interne à VB...

c >= "0"

ca fait du sens. L'ordinateur de comprend pas les lettres. Il met le tout en binaire. Pour le caractere, il le met en ASCII automatiquement. C'est sa reference. C'est pourquoi l'ordonnancement de la table ASCII. Les 128 premiers caractères sont standardisé justement pour effectué ce type d'opération. Le A est plus pett que le Z. Aucune conversion necessaire. Les langages sont prévu pour cela, vb aussi.

Ce code est tirer de mes applis en VB que je developpe pour mon employeur.

Ce code :
Dim Style As Long
Style = GetWindowLong(Text1.hwnd, GWL_STYLE)
SetWindowLong Obj.hwnd, GWL_STYLE, Style Or ES_NUMBER

Doit etre appelé pour chaque textbox...
Tk, j'ai ton contact dans mon msn... Je te jaserai un moment donné.... Ca 'interresse.
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
29 oct. 2004 à 18:05
faudrait décompiler, pour se rendre compte de la cuisine interne à VB...

c >= "0"
String >= String

pour moi... ca n'a aucun sens. En C, oui, je serai d'accord...

de toute facon, tu fais dans ton code un chr ( KeyAscii) qui lui demande une certaine opération à VB...

(au pire, tu peux utiliser des constantes, et VbKey0 deviens d'un coup assez lisible...)

bref, on va pas s'eterniser là dessus ;-)

Dim Style As Long
Style = GetWindowLong(Text1.hwnd, GWL_STYLE)
SetWindowLong Obj.hwnd, GWL_STYLE, Style Or ES_NUMBER

ceci est a appeler une fois au début du programme, pour un TextBox donné. Ca chenge une propriété interne au controle (sur lequel on aurait eu la main avec un CreateWindowEx).

avec le style ES_NUMBER, Windows gère lui même la saisie pour des chiffres uniquements (plus touches 'systeme' a savoir Backspace, prese papier...) mais pas de vérification du presse papier
JoePatent Messages postés 171 Date d'inscription jeudi 30 janvier 2003 Statut Membre Dernière intervention 20 juillet 2008
29 oct. 2004 à 17:47
Il n'y a pas de querelle. J'essai de comprendre... Si je dois modifier mon code je le ferai sans probleme. Toujours est-il qu'il faut le faire pour les bonnes raisons.

Mais ce genre de conversion inutile [...] le code Ascii du caractère suffit pour faire des comparaisons... pas besoin de traduire en chaine, et de comparer avec une chaine derriere, surtout pour une comparaison du genre de :

c >= "0" Cette comparaison est entierement numerique. Elle a l'avantage d'etre tres clair et compréhensible pour l'humain. Une caractere pour toi est simple a lire. Donc pas la peine de mettre directement le code ascii.

Une fois compilé, c'est le code ascii qui est prit en compte. Pas de transtypage (conversion de type).

C'est ce qui est enseigné a l'université. Mais on ne travaille pas en VB....

Si le code suivant apporte des avantages j'aimerais connaitre lesquels le plus objectivement possible.
Dim Style As Long
Style = GetWindowLong(Text1.hwnd, GWL_STYLE)
SetWindowLong Obj.hwnd, GWL_STYLE, Style Or ES_NUMBER

Pour moi ce n'est pas naturel du tout. Donc, je ne me querelle pas, je veux apprendre point.
FENETRES Messages postés 196 Date d'inscription jeudi 15 juillet 2004 Statut Membre Dernière intervention 14 avril 2009
29 oct. 2004 à 11:06
Oui, il faut d'abord définir le périmètre fonctionnel du composant d'édition d'une donnée numérique et en premier son type (nbre entier, relatif, réel ou monétaire) et construire le composant. Alors... au boulot.

Conventions de programmation:
- utiliser de préférence du code géré (API),
- optimiser l'exécution (réduire au max. le niveau de complexité),
- commenter correctement le code.
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
29 oct. 2004 à 10:47
on pourrais aussi s'interesser à :
- valeur par défaut
- caractères autorisés
- caractères interdits
- plage de valeurs possibles
- format de saisie

c'est un point assez interessant, je dois dire
FENETRES Messages postés 196 Date d'inscription jeudi 15 juillet 2004 Statut Membre Dernière intervention 14 avril 2009
29 oct. 2004 à 09:41
Les amis, votre querelle de clocher n'intéresse personne. Tenons pour acquis qu'il faut gérer :
- le type (nbre entier, réel ou monétaire),
- le format (options régionales),
- l'affichage,
- le menu contextuel (presse papier).
Par conséquent, il faut apporter, par exemple, une réponse pour le nbre de décimales et du format (options régionales par défaut) d'une saisie monétaire.
Un projet doit toujours être abordé sous l'angle fonctionnel et technique.
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
29 oct. 2004 à 09:31
perte de temps, oui....

je veux dire que c'est totalement illogique surtout. On n'est pas a qqs cycles processeurs pret, surtout que l'utilisateur saisi son texte lentement, comparé a la vitesse d'un PC, même ancien.

Mais ce genre de conversion inutile traduit une logique un peu bancale.... le code Ascii du caractère suffit pour faire des comparaisons... pas besoin de traduire en chaine, et de comparer avec une chaine derriere, surtout pour une comparaison du genre de :

c >= "0"

puisque VB, pour le coup doit (a priori) retraduire ca en entiers.... une String superieure a une autre, ca n'a pas de sens

pour la virgule, pas de malaise particulier, ton code gère les entiers...
JoePatent Messages postés 171 Date d'inscription jeudi 30 janvier 2003 Statut Membre Dernière intervention 20 juillet 2008
28 oct. 2004 à 17:40
joepatent, ta fonction utilise une String, c'est une perte de temps... inutile de convertir deux fois de suite...

-> Perte de temps pour qui ? Le cpu ? Pourquoi tu travaille en vb6 dans ce cas ? Au Quebec, les entreprises sont tous équipés de Pentium au minimum comme pc...

Donc la gestion d'un text box ne pose pas probleme.

la virgule n'est pas gérée ici (on le sais a l'avance ;-) ) -> Gestier des entiers avec virgule, dit m'en plus stp.

le presse papier n'est pas à la fête non plus.
-> Tu peux copier mais pas coller. Effectivement.
FENETRES Messages postés 196 Date d'inscription jeudi 15 juillet 2004 Statut Membre Dernière intervention 14 avril 2009
28 oct. 2004 à 16:46
FENETRES Messages postés 196 Date d'inscription jeudi 15 juillet 2004 Statut Membre Dernière intervention 14 avril 2009
28 oct. 2004 à 12:23
L'activation du pavé numérique qui contrarie tellement notre ami Renfield est présentée en option.
Le menu personnalisé est très incomplet au niveau fonctionnel. Je le complèterai plus tard avec la création d'un contrôle utilisateur afin d'encapsuler le code.
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
28 oct. 2004 à 09:26
joepatent, ta fonction utilise une String, c'est une perte de temps... inutile de convertir deux fois de suite...

on pourrait imaginer :

Private Sub txtreference_KeyPress(KeyAscii As Integer)
' On limite a des chiffres et le backspace comme caractères autorisés dans le
' textbox du numero de référence
If Not estChiffre(KeyAscii) And Not KeyAscii 8 Then KeyAscii 0
End Sub

Function estChiffre(c As Integer) As Boolean
estChiffre = c <= 57 And c >= 48
End Function

la virgule n'est pas gérée ici (on le sais a l'avance ;-) ) le presse papier n'est pas à la fête non plus.

comme je l'ai dit, pour du numérique (entier), il suffit d'insérer ces lignes, Windows s'occupe du reste.

Dim Style As Long
Style = GetWindowLong(Text1.hwnd, GWL_STYLE)
SetWindowLong Obj.hwnd, GWL_STYLE, Style Or ES_NUMBER
JoePatent Messages postés 171 Date d'inscription jeudi 30 janvier 2003 Statut Membre Dernière intervention 20 juillet 2008
27 oct. 2004 à 21:40
J'aimerais qu'on m'explique en quoi c'est insuffisant.

Tu saisis le tout en string. Et tu standardise sur le lost focus.

si tu entre 0002. Str -> entier = 2. Ensuite tu remet le 2 dans le text box. C'est instantané et en une ligne.

KISs -> Keep It Simple.

C'est ce que j'utilise en entreprise et je n'ai jamais eu de problème à l'usage. (1200 utilisateurs).

Ya peut-être de quoi dans votre problème que je ne saisit pas.
FENETRES Messages postés 196 Date d'inscription jeudi 15 juillet 2004 Statut Membre Dernière intervention 14 avril 2009
27 oct. 2004 à 18:04
Non, ce n'est pas suffisant ! Renfield a raison, il faut gérer la position du zéro et sous-classer le menu contextuel.
Je pense mettre à jour une version propre pour demain.
Finalement, c'est un bon exercice.
JoePatent Messages postés 171 Date d'inscription jeudi 30 janvier 2003 Statut Membre Dernière intervention 20 juillet 2008
27 oct. 2004 à 17:17
Voici ce que je fais personnellement. Est-ce une méthode non convenable ?

Private Sub txtreference_KeyPress(KeyAscii As Integer)
' On limite a des chiffres et le backspace comme caractères autorisés dans le
' textbox du numero de référence
If Not estChiffre(chr(KeyAscii)) And Not KeyAscii 8 Then KeyAscii 0
End Sub

Function estChiffre(c As String) As Boolean
estChiffre = c <= "9" And c >= "0"
End Function

Même principe pour limiter les lettres ou tout autres caractère...
FENETRES Messages postés 196 Date d'inscription jeudi 15 juillet 2004 Statut Membre Dernière intervention 14 avril 2009
27 oct. 2004 à 13:46
Le pavé numérique est un souvenir de mes débuts quand les utilisateurs me dérangaient inutilement. Par contre, effectivement, pressé par le temps, j'ai omis de traiter le copier /coller (1 point partout).
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
27 oct. 2004 à 13:36
ce "probleme" a deja été maintes fois évoqué et traité sur le site.

tu ajoutes néanmoins un controle des virgules... avec le separateur issu des options regionales, et ça ca me plait

000002 devrais etre affiché sous la forme 2

on y trouve aussi le forcage du pavé numérique, je trouve pas ca terrible de venir toucher ca...

de plus, tu bloques Ctrl + C / V / X et il est toujours possible de faire Btn Droit / coller et d'y placer du texte

autre chose, si l'on clique dans la zone de texte, l'alignement change, mais le selstart n'est pas là où l'on a cliqué.


pour du numérique (entier) :

Dim Style As Long
Style = GetWindowLong(Text1.hwnd, GWL_STYLE)
SetWindowLong Obj.hwnd, GWL_STYLE, Style Or ES_NUMBER
FENETRES Messages postés 196 Date d'inscription jeudi 15 juillet 2004 Statut Membre Dernière intervention 14 avril 2009
27 oct. 2004 à 13:20
La procédure de contrôle (KeyPress) contient exactement 19 lignes de code. Où est la complexité ?
L'ami, je crois que tu confonds usine et micro entreprise.
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
27 oct. 2004 à 12:38
nécessaire, cette usine a gaz pour deux malheureux champs ?

je veux dire, un simple Get/SetWindowLong et on en parle plus....
Rejoignez-nous