Appel d'une fonction sur évenemment "keypress"

fred_gaou Messages postés 8 Date d'inscription lundi 5 décembre 2005 Statut Membre Dernière intervention 18 novembre 2008 - 2 nov. 2008 à 17:46
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 - 2 nov. 2008 à 22:24
Bonjour,

SVP éclairez-moi, un débutant perdu !

Soit une form1 avec deux TextBox (sous Microsoft Visual Basic 6)

Ce code

'###################################################################################################'
'Fonction "SelectionTextBox" : Sélection du texte entier quand focus sur une TexteBox'
'###################################################################################################'
Public Sub SelectionTextBox(LeControl As Object)
On Error GoTo ErrorHandler
    Dim LongueurTexte As Long

    LongueurTexte = Len(LeControl.Text)
    LeControl.SelStart = 0
    LeControl.SelLength = LongueurTexte

ErrorHandler:
Exit Sub
End Sub

'###################################################################################################'
'Activer "SelectionTextBox"
'###################################################################################################'
Private Sub Text1_GotFocus()
  SelectionTextBox Text1
End Sub

Private Sub Text2_GotFocus()
  SelectionTextBox Text2
End Sub

et celui-ci

'saisie numérique seule autorisée'
Private Sub Text1_KeyPress(KeyAscii As Integer)
    Select Case KeyAscii
        Case 46, 44
            If InStr(Text1.Text, ",") > 0 Or InStr(Text1.Text, ".") > 0 Then KeyAscii = 0
        Case Else
            If Not Chr(KeyAscii) Like "[0-9,.]" And KeyAscii <> Asc(vbBack) Then KeyAscii = 0
    End Select
End Sub

Fonctionnent correctement.

Je me suis inspiré du premier pour utiliser le second sous cette forme, Code à faire fonctionner :

'###################################################################################################'
'Fonction "Numerique" : saisie numérique seule autorisée'
'###################################################################################################'
Public Sub Numerique(ByVal KeyAscii As Integer)
On Error GoTo ErrorHandler
    Select Case KeyAscii
        Case 46, 44
            If InStr(TxtBox.Text, ",") > 0 Or InStr(TxtBox.Text, ".") > 0 Then KeyAscii = 0
        Case Else
            If Not Chr(KeyAscii) Like "[0-9,.]" And KeyAscii <> Asc(vbBack) Then KeyAscii = 0
    End Select
ErrorHandler:
Exit Sub
End Sub

'###################################################################################################'
'Activer "Numerique"
'###################################################################################################'
Private Sub Text1_KeyPress(KeyAscii As Integer)
    Numerique Text1, KeyAscii
    KeyAscii = 0
End Sub

Private Sub Text2_KeyPress(KeyAscii As Integer)
    Numerique Text2, KeyAscii
    KeyAscii = 0
End Sub

Evidemment, manquant de connaissances en programmation et en VB en particulier, cet empirisme n'a aboutit qu'à l'échec.

Pourriez-vous corriger ce dernier code avec les explications détaillées si nécéssaires.

De plus, je voudrais savoir comment serait-il possible de limiter au maximum le copier-coller pour programmer tous les TextBox en même temps ou ceux désignés. Au lieu d'avoir:

Private Sub Text1_KeyPress(KeyAscii As Integer)

    Numerique Text1, KeyAscii

    KeyAscii = 0

End Sub

et être obliger de copier-coller en modifier le "nom", avoir un truc du genre

Private Sub TextBox_KeyPress(KeyAscii As Integer)

    Numerique Text1, KeyAscii

    KeyAscii = 0

End Sub

où  TextBox désignera tous les TextBox

merci

4 réponses

jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
2 nov. 2008 à 18:10
Ouais ...
1) Et si tu nous disais plutôt le but à atteindre (ta finalité)...==+>> ce sera plus simple pour t'aider que de lire un code où l'on voit que, quoi que l'on frappe ... on ne frappe rien !
2) une question à la fois, s'il te plait ===>> donc on en est à la première.
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
2 nov. 2008 à 18:55
salut,

en l'attente, un code plus simple si ta demande (très mal expliquée en effet) est la saisie de numériques entiers positifs :



<hr />
'    TEXTBOX NUMERIQUE SEULEMENT
'    http://www.codyx.org/snippet_textbox-numerique-seulement_53.aspx#139
'    Posté par [ EBArtSoft ] le 25/03/2006
<hr />




Const ES_NUMBER As Long = &H2000&
Const
GWL_STYLE As Long = -16

Private Declare Function GetWindowLong Lib
"user32.dll" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long)
As Long
Private Declare Function SetWindowLong Lib "user32.dll" Alias
"SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As
Long) As Long

Private Function SetTextBoxNum(ByRef Obj As Object) As
Boolean
    SetWindowLong Obj.hwnd, GWL_STYLE, GetWindowLong(Obj.hwnd,
GWL_STYLE) Or ES_NUMBER
End Function
' ==== Utilisation :

'Private
Sub Form_Load()
'    Call SetTextBoxNum(Text1)
'End Sub






++

<hr size="2" width="100%" />
Prenez un instant pour répondre à [forum/sujet-SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp 
0
fred_gaou Messages postés 8 Date d'inscription lundi 5 décembre 2005 Statut Membre Dernière intervention 18 novembre 2008
2 nov. 2008 à 22:13
En gros, je voudrais comprendre comment programmer une fonction que je puisse appliquer facilement au type de contrôle "textbox". Car je ne souhaite pas copier-coller le même code de plusieurs dizaines de lignes dans chaque contrôle textbox dont l'évenemment serait par exemple "keypress"

Le premier code que j'ai mis plus haut résout cette problèmatique. Le code de PCPT est très bien aussi dans le concept (mais il n'accepte pas la saisi des "." ou "," une seule fois comme séparateur décimal).

Donc admettons que sur ce modèle ou un autre je puisse améliorer ces fonctions pour que les contrôles du type textbox réagisse ainsi:

- saisie de chiffres seulement
- accepter la saisi de "." ou "," une seule fois comme séparateur décimal
- interdire la saisi après deux chiffres après la virgule
- limiter le nombre de caractères pouvant être saisis
- formater le contenu tel que "#,##0.00" (séparateur millier, quoi) quand focus out
- sélection du texte entier et format normal (sans séparateur millier, quoi) quand focus in

J'ai bien trouvé des codes qui réalisent certaines propriétés mais dès que j'essaye de les réunir, ça coince.

Conclusion, j'aimerais bien pouvoir appliquer toutes ces propriétés en une ou deux fonctions (voir trois max) tel que exemple:

Private Sub Form_Load()
    Call FonctionOne(Text1)
    Call FontionTwo(Text1)
    Call FonctionOne(Text2)

    Call FontionTwo(Text2)
End Sub
'etc.

Ou bien

Private Sub Text1_GotFocus()
  FonctionOne Text1
End Sub

Private Sub Text1_PressKey()

  FonctionTwo Text1

End Sub

Private Sub Text2_GotFocus()

  FonctionOne Text2

End Sub


Private Sub Text2_PressKey()


  FonctionTwo Text2


End Sub

Voir plus simple si vous avez.

J'espère avoir été plus clair car je manque du vocabulaire spécifique pour m'exprimer, "NooB" oblige.

Merci
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
2 nov. 2008 à 22:24
salut,

ce que tu veux "que çà fasse" (j'aurais voulu écrire "faire" mais je commence à me poser la question....) est évidemment réalisable.
et pour limiter la redondance, 2 cas de figures :

*(conseillé) : faire un joli module de classe, propre et organisé, et attacher tes contrôles à une nouvelle instance...

*utiliser un "MaskEdit", et jouer avec le masque.....


le désir d'une textbox numérique n'étant pas révolutionnaire,
tu trouveras dans les sources existantes plusieurs exemples pour arriver à tes fins

ps : d'après ce que tu décris, un test au _keydown avec LIKE, puis un format$ sur le _validate seraient amplement suffisants

<hr size="2" width="100%" />
Prenez un instant pour répondre à [forum/sujet-SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp 
0
Rejoignez-nous