Que des chiffres dans une textbox

CeNedra83 Messages postés 96 Date d'inscription lundi 20 novembre 2000 Statut Membre Dernière intervention 11 juillet 2006 - 28 juil. 2005 à 14:53
doryam Messages postés 7 Date d'inscription lundi 6 septembre 2004 Statut Membre Dernière intervention 30 octobre 2012 - 29 juil. 2005 à 10:01
je réalise une IHM en VB6 avec beaucoup de textbox.
je voudrais réaliser une fonction qui avec une textbox en paramètre, ne permette de rentrer que des nombres négatifs, à virgule ou non, sans aucune lettres. et ne pas permettre bien sur qu'il y ait plusieurs points ou signe -...
comment faire? je me galère!

16 réponses

Zlub Messages postés 809 Date d'inscription mercredi 11 octobre 2000 Statut Membre Dernière intervention 29 septembre 2010 9
28 juil. 2005 à 15:08
Salut,

Sur l'évenement press, tu peux controler que le KeyAscii est autorisé



par exemple pour autoriser que les chiffres :



Private Sub txtbox_KeyPress(KeyAscii As Integer)

If KeyAscii < vbKey0 Or KeyAscii > vbKey9 Then KeyAscii = 0

End Sub

++

Zlub
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 131
28 juil. 2005 à 15:11
Eheh, il y a encore mieux : au lieu de passer le textbox en paramètre,
laisse ta fonction définir quel textbox à le focus pour appliquer le
filtre. C'est ce que j'ai fait pour un gros projet, et croit moi, au
bout de 3 feuilles, on en a vite marre de rentrer en paramètre le nom
des objets à filtrer !



Voici un exemple de filtre :



Mets ce code dans un module :

Public Sub MaskNegatif(ByRef frmFeuille As Object, ByRef sKey As Integer)



'======================================================================

'Sub : MaskNegatif

'Date : 20/11/2004

'Auteur : DarK Sidious

'But : Permet d'appliquer un masque pour changer la couleur du texte si le nombre est négatif

'======================================================================



'on active la routine de traitement d'erreur

On Error Resume Next

'l'erreur etant minime, on continue l'éxécution normalement



'déclaration des variables privées

Dim oControl As Object 'stocke le contrôle actif



'on permet d'effacer le dernier caractère

If sKey = 8 Then Exit Sub



'on récupère le contrôle actif

Set oControl = frmFeuille.ActiveControl



'on évite que l'utilisateur rentre du texte

If Not IsNumeric(oControl.Text & Chr(sKey)) And
Left(oControl.Text & Chr(sKey), 1) <> "+" And
Left(oControl.Text & Chr(sKey), 1) <> "-" Then



Let sKey = 0



End If



If Val(oControl.Text & Chr(sKey)) < 0 Then



Let oControl.ForeColor = vbRed



Else



Let oControl.ForeColor = vbWindowText



End If



End Sub


Et ceci dans les événements KeyPress de tes textboxes :

Private Sub Text1_KeyPress(..)



call MaskNegatif(Me, KeyAscii)



End Sub



Comme cà, tu peux rapidement faire du copier coller de ce code pour
l'appliquer à beaucoup de textbox sans devoir changer le nom des
paramètres à chaque fois !


DarK Sidious

Un API Viewer (pour le VB, VB.NET, C, C# et Delphi) : www.ProgOtoP.com/popapi/
0
Zlub Messages postés 809 Date d'inscription mercredi 11 octobre 2000 Statut Membre Dernière intervention 29 septembre 2010 9
28 juil. 2005 à 15:15
Salut,

euh vi, mais c'est la même chose que se que je lui propose sauf que c'est une focntion qui determine le mask

Vu qu'il faut quand même definir les evenement keypress



Public Sub maskNumber(KeyAscii as Integer)

If KeyAscii < vbKey0 Or KeyAscii > vbKey9 Then KeyAscii = 0

End Sub

du coups encore plus simple



Private Sub Text1_KeyPress(..)



call maskNumber(KeyAscii)



End Sub

++

Zlub
0
CeNedra83 Messages postés 96 Date d'inscription lundi 20 novembre 2000 Statut Membre Dernière intervention 11 juillet 2006
28 juil. 2005 à 15:16
Merci bien, j'essaye tout ça...puis je combiner plusieurs masques dans la meme focntion, par ex, nombres négatifs, entiers et à virgules?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 131
28 juil. 2005 à 15:27
Désolé ZLub, le temps que je poste, tu avais déjà répondu ;)



Oui en effet, ma fonction revient au même que ce que tu propose.



Sinon, CeNedra83, il est tout à fait possible d'appliquer plusieurs
masques à un textbox, il faut juste bien définir l'ordre (d'abord
négatif, ensuite virgule, et enfin, entiers) pour obtenir des résultats
cohérents.



Dans le même ordre d'idée :

Masque négatif

Masque virgule

Masque Entier

Masque Numérique

Masque Date

Masque texte

Masque alphanumérique



tout ces masque peuvent également mis en place plus facilement en
utilisant le contrôle MaskEdit de Microsoft, mais il faut alors
connaître les formats, ce qui n'est pas chose aisée !

DarK Sidious

Un API Viewer (pour le VB, VB.NET, C, C# et Delphi) : www.ProgOtoP.com/popapi/
0
cs_hassen Messages postés 338 Date d'inscription mardi 28 janvier 2003 Statut Membre Dernière intervention 4 novembre 2008
28 juil. 2005 à 15:33
je te conseil de faire non pas une fonction mais un control utilisateur UserControl
qui permet de realiser les fonctionnalité que tu a mentionné
la base de ce control sera un control textbox

dans l'evenement KeyPress de text1 tu ecrit le code suivant:

Private Sub Text1_KeyPress(KeyAscii As Integer)
Dim CaractereAutorise As String


Text1.SelText = ""


CaractereAutorise = "-.0123456789" & Chr(vbKeyDelete) & Chr(vbKeyReturn) & Chr(vbKeyBack)
If InStr(1, CaractereAutorise, Chr(KeyAscii)) = 0 Then
KeyAscii = 0
Exit Sub
End If


If Chr(KeyAscii) "-" And Not (InStr(1, Text1.Text, "-") 0 And Text1.SelStart = 0) Then KeyAscii = 0If InStr(1, Text1.Text, ".") <> 0 And Chr(KeyAscii) "." Then KeyAscii 0


If Chr(KeyAscii) "." And Text1.Text "" Then
Text1.Text = "0"
Text1.SelStart = 1
End If


If Chr(KeyAscii) "." And Text1.Text "-" Then
Text1.Text = "-0"
Text1.SelStart = 2
End If


End Sub

tu vois ce n'est pas si difficile

Hassen TUNISIE
0
Zlub Messages postés 809 Date d'inscription mercredi 11 octobre 2000 Statut Membre Dernière intervention 29 septembre 2010 9
28 juil. 2005 à 15:36
Salut,

oki DarkSidious ..

oki aussi pour MaskEdit

++

Zlub
0
CeNedra83 Messages postés 96 Date d'inscription lundi 20 novembre 2000 Statut Membre Dernière intervention 11 juillet 2006
28 juil. 2005 à 15:42
Merci à tous, avec tout ça je vais pouvoir me débrouiller!!
++
CeNedra
0
CeNedra83 Messages postés 96 Date d'inscription lundi 20 novembre 2000 Statut Membre Dernière intervention 11 juillet 2006
28 juil. 2005 à 16:24
DarkSidious je me suis aidée de ce que tu avais fait et de ce que j'avais déjà fait pour faire ceci.
Cela marche très bien pour ce que je veux, sauf que ça ne paermet pas de rentrer un signe moins!
alors que si j'écris le code dans l'évènement Keypress d'une textbox, cela marche très bien.
Quel est mon pb?

Public Sub Mask(ByRef frmFeuille As Object, ByRef KeyAscii As Integer)


'on active la routine de traitement d'erreur
On Error Resume Next
'l'erreur etant minime, on continue l'éxécution normalement


'déclaration des variables privées
Dim oControl As Object 'stocke le contrôle actif


'on récupère le contrôle actif
Set oControl = frmFeuille.ActiveControl


Select Case KeyAscii
Case 8:
Case 45: If InStr(oControl.Text, "-") > 0 Then KeyAscii = 0
If oControl.Text.SelStart <> 0 Then KeyAscii = 0
Case 46: If InStr(oControl.Text, ".") > 0 Then KeyAscii = 0
Case 48 To 57:
Case Else: KeyAscii = 0: Beep
End Select

End Sub
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
28 juil. 2005 à 16:47
pourquoi tu fais pas un groupe de contrôle avec les TexBox,

tu auras juste une seule procédure

Daniel
0
CeNedra83 Messages postés 96 Date d'inscription lundi 20 novembre 2000 Statut Membre Dernière intervention 11 juillet 2006
28 juil. 2005 à 16:56
Ben j'en ai fait pour certaines mais pas toutes car ça m'arrange pas toujours.
0
doryam Messages postés 7 Date d'inscription lundi 6 septembre 2004 Statut Membre Dernière intervention 30 octobre 2012
28 juil. 2005 à 17:34
Bonjour,



J'aurais aussi une solution à proposer. Elle vaut ce qu'elle vaut.

La voici



Private Sub txtChamp_KeyPress(KeyAscii As Integer)

IsDecimal txtChamp, KeyAscii, False

End Sub



'Le champ peut être un Texte ou une zone Grid.

Public Function IsDecimal(ByRef objField As Object, _


ByRef KeyAscii As Integer, _


Optional ByVal blnIsDecimal As Boolean, _


Optional ByVal blnAllowmoins As Boolean) As Boolean



Dim lngPosition As Long

Dim gstrDecDelim as string

gstrDecDelim = "."



'Teste si la touche est nunerique ou pas.

If blnIsDecimal Then

IsKeyDecimal KeyAscii, blnAllowmoins

Else

IsKeyNumeric KeyAscii, blnAllowmoins

End If



If KeyAscii = 0 Then

Exit Function

End If



With objField

'Si le point a ete tapé...

If KeyAscii = Asc(gstrDecDelim) Then

'Si un point se trouve déjà dans le champ...

If InStr(.Text, gstrDecDelim) Then

'Si le point n'est pas sélectionné...


If InStr(.SelText, gstrDecDelim) = 0 Then


'Alors on ne veut pas cette touche.

KeyAscii = 0

Exit Function

End If

End If

'Si pas de point...

Else

'Si on est tout à gauche...

If .SelStart = 0 Then


'Si un moins (-) se trouve déjà dans le champ...

If InStr(.Text, "-") > 0 Then


'Si le moins (-) est sélectionné...


If InStr(.SelText, "-") = 0 Then


'Alors on ne vaut pas cette touche.


KeyAscii = 0


Exit Function

End If

End If

'Si
on est quelque part dans le champ, mais pas entierement à gauche...

Else


'On a pas le droit de taper un moins (-).

If KeyAscii = Asc("-") Then

KeyAscii = 0

Exit Function

End If

End If

End If

End With



IsDecimal = True



End Function







Doryam
0
doryam Messages postés 7 Date d'inscription lundi 6 septembre 2004 Statut Membre Dernière intervention 30 octobre 2012
28 juil. 2005 à 17:40
Excuses,



J'ai oublié la fonction IsKeyDecimal,

La voici



Public Function IsKeyDecimal(ByRef KeyAscii As Integer, _


Optional ByVal blnAllowMoins As Boolean) As Boolean



Dim lngPos As Long

Dim strMoins As String



If blnAllowMoins Then

strMoins = "-"

End If



If KeyAscii >= Asc(" ") Then

If (KeyAscii < Asc("0") Or KeyAscii > Asc("9")) Then


lngPos = InStr(",." & gstrDecDelim & strMoins, Chr(KeyAscii))

If lngPos = 0 Then

Beep

KeyAscii = 0

Else

If blnAllowMoins Then


If KeyAscii <> Asc(strMoins) Then


KeyAscii = Asc(gstrDecDelim)

End If

Else


KeyAscii = Asc(gstrDecDelim)

End If

IsKeyDecimal = True

End If

End If

End If



End Function



Ah... Important: Je ne suis pas le créateur de ces lignes.



Merci


Doryam
0
cs_hassen Messages postés 338 Date d'inscription mardi 28 janvier 2003 Statut Membre Dernière intervention 4 novembre 2008
28 juil. 2005 à 18:01
enfait je t'ai donner une solution en haut qui marche je l'ai tester


elle prend encharge - .


si tu l'essayé

Hassen TUNISIE
0
CeNedra83 Messages postés 96 Date d'inscription lundi 20 novembre 2000 Statut Membre Dernière intervention 11 juillet 2006
29 juil. 2005 à 09:34
je veux bien, mais comme j'ai beaucoup de text box et pas toujours en groupe, si je dois taper ce code pour chaque ça va etre pénible!
0
doryam Messages postés 7 Date d'inscription lundi 6 septembre 2004 Statut Membre Dernière intervention 30 octobre 2012
29 juil. 2005 à 10:01
Il te suffit de rentrer une seule ligne par Textbox à vérifier et ceci dans l'évènement KeyPress comme suit:

Private Sub txtChamp_KeyPress(KeyAscii As Integer)
IsDecimal txtChamp, KeyAscii, False
End Sub

et il puis met les deux Fonctions "IsDecimal" et "IsKeyDecimal" quelque part dans le Code de ta fenêtre où dans un Module en prenant soin de les déclarer en PUBLIC.

Doryam
0