IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Contribuez Discussion :

Une classe pour des TextBoxs formatés


Sujet :

Contribuez

  1. #1
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut Une classe pour des TextBoxs formatés
    bonjour a tous
    ce sujet est revenus tres souvent ces derniers jour sur le forum
    alors je vous propose aujourd'hui une classe pour des TextBoxs for matés dynamiquement lors de la pression d'une touche

    en effet voila un exemple
    qui permet d'afficher un :
    n° téléphone = XX XX XX XX XX les espaces sont placés dynamiquement
    DATE = 01/01/2013 les slashs sont placés dynamiquement
    nom propre =Gary Grant les majuscules sont placées automatiquement

    pour cela il suffit de mettre dans le tag du TextBox "tel" ou "date" ou "Npropre"

    Voila le code

    a mettre dans le userform
    on integre les texboxs dans la classe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Private texto() As New ClasseTextBox
     Private Sub UserForm_Activate()
    For Each ctrl In Me.Controls
            If TypeName(ctrl) = "TextBox" Then
                t = t + 1
                ReDim Preserve texto(1 To t)
                Set texto(t).groupetexto = ctrl
            End If
        Next
    End Sub
    et voila le code de la classe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
     
    Option Explicit
    Const val_numeric = "[0-9]"    'constante comportant uniquement des chiffres
    Const val_texte = "[a-zA-Z ]"    'constante comportant uniquement les 26 lettres de l'alphabet (minuscule et majuscule )
    Const val_textnum = "[a-zA-Z0-9(),éèàç'-âêîÏ ]"    'constante comportant uniquement les 26 lettres de l'alphabet (minuscule et majuscule )
    'et certain caractere spéciaux
    Public WithEvents groupetexto As MSForms.TextBox
    Private Sub groupetexto_Change()
        Select Case groupetexto.Tag
        Case "tel"
            Select Case Len(groupetexto)
            Case 2, 5, 8, 11: groupetexto = groupetexto & " ": End Select    'on rajoute un espace a chaque fois qu'il y a 2 chiffres de tapé
        Case "date"
            Select Case Len(groupetexto)
            Case 2, 5: groupetexto = groupetexto & "/": End Select    'on ajoute un slasch a chaque fois que l'on tape 2 chiffres
            'on force la majuscule de la première lettre de chaque mots du nom
        Case "Npropre": groupetexto = Application.WorksheetFunction.Proper(groupetexto)
        End Select
    End Sub
    Private Sub groupetexto_KeyPress(ByVal keyAscii As MSForms.ReturnInteger)
    'ici on force le format accepté par les constante comparé avec "Like"
        Select Case groupetexto.Tag
        Case "tel", "date": If Not Chr(keyAscii) Like val_numeric Then keyAscii = 0
        Case "texto": If Not Chr(keyAscii) Like val_texte Then keyAscii = 0
        Case "Npropre": If Not Chr(keyAscii) Like val_texte Then keyAscii = 0
        Case "textnum": If Not Chr(keyAscii) Like val_textnum Then keyAscii = 0
        End Select
    End Sub
     
    Private Sub groupetexto_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    'comme le textbox est formaté au keypress on ne peut que supprimer jusqu'au dernier"/" ou espace ,alors
        If KeyCode = 8 Then
            Select Case Right(groupetexto, 1)
            Case "/": groupetexto = Left(groupetexto, Len(groupetexto) - 2)
            Case " ": groupetexto = Left(groupetexto, Len(groupetexto) - 2)
            End Select
        End If
    End Sub
    je compte sur tous pour y apporter des options ou des corrections
    bonne utilisation

    au plaisir

  2. #2
    Responsable Access

    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Points : 14 526
    Points
    14 526
    Par défaut
    Bonjour Patrick,

    - pour UserForm_Activate, j'utilise plutôt l'événement UserForm_Initialize pour des opérations à faire une seule fois au démarrage du formulaire

    - attention, le keyAscii n'est pas forcément compatible avec la fonction chr
    Si saisie de € (ALTGR + E) => plantage
    ChrW devrait fonctionner avec tous les caractères unicode.

    - le copier-coller bien sûr permet de remplir la zone en outre-passant les contrôles

    Sinon c'est bien compliqué de programmer un masque de saisie...

  3. #3
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut re
    Bonjour Arkham46

    C'est vrai mais j'utilise le activate très souvent pour intégrer les contrôles dans leurs classes parce que il est tres fréquent que j'utilise la classe pour plusieurs userforms dans un meme classeur

    je vais regarder tes conseils et voir si je ne peut pas intégrer la vérification avec le "afterupdate" dans la classe

    Tu a parler aussi de masque de saisie il en est pas question pour le moment
    C'est simplement un formatage dynamique du textbox .
    Pour le masque de saisie j'en avais fait un pour un forumeur ,je vais essayer de le retrouver
    merci pour le retour

    au plaisir

  4. #4
    Membre chevronné
    Avatar de NVCfrm
    Homme Profil pro
    Administrateur Système/Réseaux - Developpeur - Consultant
    Inscrit en
    Décembre 2012
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur Système/Réseaux - Developpeur - Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 036
    Points : 1 917
    Points
    1 917
    Billets dans le blog
    5
    Par défaut
    bonsoir,

    je viens de lire tes problèmes avec AfterUpdate.
    as tu vérifié l'orthographe de la déclaration de procédure si elle est correcte ? une erreur possible sur le nom du contrôle ou du nom de la procédure évènementielle.

    Sur cette discussion je me méfierais également de la conversion avec Chr

    Pour le formatage Tél tu peux définir une constante de format chaîne et utiliser la fonction Format dans le cas où tu dois gérer dans l'évènement AfterUpdate ou BeforeUpdate.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Tel=Format(Tel,"0#"" ""##"" ""##"" ""##"" ""##")
    Question de préférence ceci est identique à WorksheetFunction.Proper
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    myChaine = StrConv(myChaine, vbProperCase)

  5. #5
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut re
    Bonjour NVCfrm

    oui format("0#/##/####")c'est bien pour le after update
    (après le dernier chiffre tapé
    mon souci c'est que je veux empêcher certaines erreurs dynamiquement

    Pour le moment,dans l'evenement keypress du contrôle ,j'en suis la pour le format date

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    const val_numeric = "[0-9]"    'constante comportant uniquement des chiffres
    Private Sub nomsdutextbox_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    'il ne peut y avoir que 10 caractère dans le textbox (slaschs compris)
    If Len(nomsdutextbox) = 10Then KeyAscii = 0
    'on ne peut taper que les chiffres de 0 a 9
    If Not ChrW(KeyAscii) Like val_numeric  Then KeyAscii = 0
     
    end sub 
    private  Sub nondutextbox_Change()
    'les slaschs sont integrés automatiquement
    If Len(nomsdutextbox) = 2 Or Len(nomsdutextbox) = 5 Then nomsdutextbox= nomsdutextbox& "/"
    end sub
    Mais pour moi le afterupdate ne fonctionne pas du tout
    et il semblerait que le mode compatibilité 2003 2007 aie des limites.
    En effet quand je sauve le classeur en "xlm" au lieu de "xls" le afterupdate semble fonctionner


    merci pour le retour

    au plaisir

  6. #6
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut re
    Bonsoir

    je viens de concilier la méthode avec format(string) de nvcfrm
    avec la mienne (select case)

    du coup on a beaucoup moins de lignes pour for mater un textbox dynamiquement en utilisant qu'un seul évènement


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Const monformat = "00 00 00 00 00"
    Private Sub TextBox1_Change()
    Select Case Len(TextBox1)
    ' de la 1 ere touche a la 11 eme donc 14 caractères avec les espaces on applique le format identique a la constante en prenant en compte les mêmes longueur(textbox/const)
    Case 1 To 14: TextBox1 = Format(TextBox1, Left(monformat, Len(TextBox1)))
    Case 14 To 15 'des la 15 eme touche tapée on garde que les 14 premiers
    TextBox1 = Mid(TextBox1, 1, 14)
    End Select
    'ne permet que les chiffres en comparant le val(textbox) a textbox
    If Not Val(TextBox1) = TextBox1 Then TextBox1 = Mid(TextBox1, 1, Len(TextBox1) - 1)
     
    end sub
    Qu'en pensez vous ??,
    merci pour le retour

    au plaisir

Discussions similaires

  1. Réponses: 7
    Dernier message: 18/01/2015, 17h36
  2. [VB6] load de shapes dans une classe ? (pour faire des contours)
    Par hpfx dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 07/06/2011, 14h59
  3. Impossible d'hériter d'une classe pour des raisons de sécurité
    Par padodanle51 dans le forum Silverlight
    Réponses: 7
    Dernier message: 15/06/2010, 16h19
  4. Une classe pour mouler des instances qui soient des classes
    Par eyquem dans le forum Général Python
    Réponses: 2
    Dernier message: 03/09/2009, 17h09
  5. Réponses: 7
    Dernier message: 08/01/2005, 13h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo