SÉPARATEUR DÉCIMAL UNIVERSEL AVEC TEXTBOX

cs_Gwendal3 Messages postés 24 Date d'inscription samedi 4 mars 2006 Statut Membre Dernière intervention 7 mai 2009 - 17 juil. 2008 à 09:08
cs_eldim Messages postés 956 Date d'inscription lundi 30 mai 2005 Statut Membre Dernière intervention 21 août 2014 - 17 juil. 2008 à 16:26
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/47337-separateur-decimal-universel-avec-textbox

cs_eldim Messages postés 956 Date d'inscription lundi 30 mai 2005 Statut Membre Dernière intervention 21 août 2014 1
17 juil. 2008 à 16:26
(ouai, le mieux c'est pas stocké le séparateur ..)
TeBeCo Messages postés 467 Date d'inscription lundi 24 juin 2002 Statut Membre Dernière intervention 9 mars 2011
17 juil. 2008 à 15:56
de nombreux point sombres dans ce code malheuresement.
Tout d'abord quand je vois :
CStr, VB.Right, Len, VB.Left
ca fait deja peur ...
en gros tu fais pas de .net la tu reste bloqué sur tes vieilles habitude vb6
Ces fonctions sont a eviter completement quasiment 90% du "Microsoft.VisualBasic" (si c'est pas 100%) est a eviter.
pour quelle raison ?
les lignes :
Dim s1 as String = "toto"
Dim n as Interger = 1
Dim s2 As String = Right(s1, integer)

ont un equivalents .net :
Dim s1 as String = "toto"
Dim n as Interger = 1
Dim s2 As String = s1.SubString(s1.Length - n)

que va-t-il se passer avec la ligne :
Right(s1, integer)

il va te faire un :
return s1.substring(s1.length - n)

tu me dira c'est pareil
ben non tu perd en temps d'execution et en ressource a force de dupliquer et empiler les appel
donc passe vraiment a .net
oublie Microsoft.VisualBasic le plus possible et cherche un peu dans la doc
la tu fais quoi ?
des manipulation de String ?
ben ouvre la doc de la classe System.String et lis t'as pas d'autre choix

avec comme l'a dis "Gwendal3" les 40 "If" imbrique c'est une blague ?
Le Select Case est deja beaucoup mieux mais c'est pas encore ca
.Net c'est de la prog objet donc faut reflechir objet et entité
t'as un super framework qui te fournis plein de classe avec des automatisme pré existant
la par exemple tu peux te créé une liste generique du type :
imports System.Collections.Generic
Dim lstCaractereASuivre As List(of String)
ou
Dim lstCaractereASuivre As List(of Char)

pourquoi "of Char" ben parce que y a aucun interet a utiliser "String" a toi de voir mais 1 caractère convertit en String a t il vraiment son interet ? a voir
et dans la liste au moment du load tu formulaire tu fais un truc dans le genre :
lstCaractereASuivre.Add("1")
ou
lstCaractereASuivre.Add('1')

suivant la liste que t'as pris
et tu rajoute tous tes caractère important en question
pourquoi ca ?
la reponse dans la doc MSDN encore une fois
tout d'abord tu peux interroger la collection pour voir si elle contient un caractère et ca renvois un true/false
if (lstCaractereASuivre.IndexOf(textbox.text.substring(textbox.text.length-1)) > 0) Then
'alors il est dans la liste
else
'il y est pas
end if

encore autre chose :
ecrire "TextBox1.Text" c'est super beau c'est genial c'est magique etc ....
sauf que une textebox c'est pas une variable faites pour te donné que du texte, y a une interface graphique y a pas mal de code derriere en plus pour la securité, le cross threas etc ...
donc les appels dessus sont relayé par du code derriere et donc plus lents
dans ces cas quand tu sais que tu va faire plusieur accces dessus il vaux mieux dupliqué la valeur 1 fois dans une variable String au debut du sub (variable de classe ou locale suivant ou tu t'en sert avec les Call) et a la fin recopié la valeur dans la textbox elle en sera d'autant plus contente
en plus de cas comme le multithread est possible en .net si jamais la valeur de ta textbox change entre le debut et la fin de la sub avec ton code tu l'a dans l'os


ensuite pour revenir sur la remarque de Eldim en .net (cf msdn pour changer) t'as une fonction qui te permet de recuperer le separateur decimal de l'utilisateur loguer sur la machine qui utilise ton application ca te permet de savoir si c'est un "." ou une "," ca aussi a stocké en varaible de classe ou globale je presume et a remettre a jour (a toi de voir quand mais si l'utilisateur le change pendant l'appli faut que ca soit gerer donc un timer c'est a eviter)

enfin y a beaucoup de chose a revoir
par ou commencer ?
je dirais qu'il faut plus se servir de MSDN => a chaque classe utiliser va lire la liste des membres, la description de la classe et les exemple associé
ensuite je te dirais d'arreter de raisoner a la VB6 si VB6 est marqué par microsoft comme obsolete depuis le debut de l'année c'est pas pour rien il faut penser plutot Programmation Objet.

Sur ce bonne continuation en .net
cs_eldim Messages postés 956 Date d'inscription lundi 30 mai 2005 Statut Membre Dernière intervention 21 août 2014 1
17 juil. 2008 à 10:43
lol
essai plutôt ces api... et contente toi de faire un "replace" ça suffit largement:
Private Declare Function GetLocaleInfo Lib "Kernel32" Alias "GetLocaleInfoA" _
(ByVal Locale As Long, ByVal LCTYPE As Long, ByVal lpLCData As String, _
ByVal cchData As Long) As Long
Private Declare Function SetLocaleInfo Lib "Kernel32" Alias "SetLocaleInfoA" _
(ByVal Locale As Long, ByVal LCTYPE As Long, ByVal lpLCData As String) As Long
Private Declare Function GetUserDefaultLCID Lib "Kernel32" () As Long
cs_Gwendal3 Messages postés 24 Date d'inscription samedi 4 mars 2006 Statut Membre Dernière intervention 7 mai 2009
17 juil. 2008 à 09:08
Salut,

A la place de ton IF en 6 lignes, utilise
*-*-*-*-*-*-*-
Select Case Me.TextBox1.Text
' Valeur correcte
Case 1 to 9, ".", "-"
' >> Traitement

' Valeur incorrecte
Case else
' >> Traitement

End Select
*-*-*-*-*-*-*-*-*-*-*-*-*-*-
Et place le code sur l'évènement "KeyPress".

Regarde également par ici
http://www.vbfrance.com/codes/EMPECHER-SAISIE-DANS-TEXTBOX_185.aspx

Gwendal
Rejoignez-nous