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

Windows Forms Discussion :

[VB.NET 2003] Création de contrôles persos


Sujet :

Windows Forms

  1. #1
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 242
    Points
    4 242
    Par défaut [VB.NET 2003] Création de contrôles persos
    Bonjour,

    Tout d'abord, je signale que j'ai attentivement lu le cours de Lasserre ^^.

    Voici mon problème, je travaille avec VS2003 et j'ai besoin d'utiliser un contrôle MaskedTextBox. Seulement ce controle n'existe pas encore dans le framework de VS2003. J'ai donc envie de tenter de le créer moi même en partant du contrôle TextBox.

    Seulement je n'ai aucune idée de la logique à suivre pour créer un masque de saisie.

    Je pense avoir compris que je dois surcharger la méthode Set du controle pour pouvoir y coller un masque et gérer le comportement lors de la frappe mais à part ça, je suis totalement perdu.

    Si quelqu'un pouvait me mettre sur une piste, j'apprécierais énormément.

    Merci d'avance.

    Griftou.

    P.S. : C'est la première fois de ma vie que je fais ça donc soyez indulgent ^^.

  2. #2
    Rédacteur

    Inscrit en
    Juin 2004
    Messages
    744
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Juin 2004
    Messages : 744
    Points : 1 352
    Points
    1 352
    Par défaut
    Bonjour,

    Ce que je te conseil de faire est de créer une classe qui hérite de
    System.windows.forms.TextBox

    Ensuite tu utilises l'event handler onKeyPress pour tester ce que l'utilisateur entre.

    Ensuite dans tes form au lieu d'utiliser un System.windows.forms.TextBox tu utilises ton objet.

    Ludovic,

  3. #3
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 242
    Points
    4 242
    Par défaut
    La première partie était déjà faite

    Bon, je vais voir pour faire un check dans l'event keypress...

    J'vous tiens au courant de l'avancement ^^

    Merci !

    Griftou.

  4. #4
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 242
    Points
    4 242
    Par défaut
    Bonne nouvelle, ça avance. Lentement, certes, mais quand même !

    Question : Comment faire pour que, quand j'ajoute le controle sur ma form, il y ait directement "__/__/____" dans la propriété Text plutot que le nom du controle. J'ai trifouillé partout, j'ai pas trouvé

  5. #5
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 175
    Points : 25 116
    Points
    25 116
    Par défaut
    tu pourrais quand meme jeter un oeil à ce que je t'ai pondu, ca le fait ...

  6. #6
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 242
    Points
    4 242
    Par défaut
    Oui oui t'inquiète, je regarde ce que tu as fait en parrallèle. Mais j'aimerais quand même comprendre et ne pas utiliser bêtement ce que tu me donnes.

    Ce serait bien que je ne doive plus dépendre de la communauté à chaque fois que j'veux créer un truc.


    J'ai mis ça dans le new mais je ne comprends pas pq le texte afficher reste "DateTextBox1" et pas "__/__/____" alors que la longueur elle est bien limitée à 10 caractères.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        Public Sub New()
            MyBase.New()
            'This call is required by the Windows Form Designer.
            InitializeComponent()
     
            'Add any initialization after the InitializeComponent() call
            Me.MaxLength = 10
            Me.Text = "__/__/____"
        End Sub

  7. #7
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 242
    Points
    4 242
    Par défaut
    Y a personne qui peut m'aider à ce niveau là ?

    Spérot, j'ai bien regardé ton code et suite à ça , j'comprends pas pourquoi le mien ne marche pas (bon j'ai encore fait la partie pour écrire dans le masque mais ça doit pas être trop sorcier).

    N'est-il pas possible de définir un texte par défaut pour un composant quand on le place sur un écran ?

    Help please !

    Griftou.

  8. #8
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 242
    Points
    4 242
    Par défaut
    Encore un truc que je pige pas.

    A l'instant, j'ai voulu créer une propriété Mask dans mon composant.

    J'ai donc écrit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        Public Property Mask() As String
            Get
                Return Mask
            End Get
            Set(ByVal Value As String)
                Mask = Value
            End Set
        End Property
    Ca a bien créé une propriété Mask qui réagit très bien dans le projet de mon composant mais une fois le composant ajouté à mon projet d'application, je ne peux pas l'utiliser car VS me dit que c'est un membre Protected. Pourtant je l'ai bien déclarée Public non ?

    Re Help please

    Griftou.

  9. #9
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 175
    Points : 25 116
    Points
    25 116
    Par défaut
    si tu as réellement écrit ca, ca ne peut pas fonctionner
    il ne faut pas comfondre ptopriété et variable

    une propriété n'est en fait qu'une fonction Get plus une sub Set
    il faut stocker la valeur dans une variable

    ton return Mask appelle en fait le Get de la propriété Mask et ainsi de suite créant une boucle infinie
    il faut donc ajouter une variable avec un nom différent

    genre return _Mask et _Mask = value

  10. #10
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 242
    Points
    4 242
    Par défaut
    Ok, je viens de faire le changement que tu proposes mais ça ne change pas le fait que VS trouve que cette propriété est un membre Protected. Je ne peux pas l'afficher dans un MsgBox ne fut-ce que pour tester.

    C'est pourtant bien Public non ?

  11. #11
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 175
    Points : 25 116
    Points
    25 116
    Par défaut
    essaye un autre nom de propriété peut etre que Mask est un membre hérité protected et caché ...

  12. #12
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 242
    Points
    4 242
    Par défaut
    Ca ne change rien...

    J'ai donc ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private _Mask As String
        Public Property MonMask() As String
            Get
                Return _Mask
            End Get
            Set(ByVal Value As String)
                _Mask = Value
            End Set
        End Property
    C'est bien juste ? Il est fort possible que j'ai laissé une erreur...
    Le fait que j'affecte "__/__/____" dans le new de mon composant peut avoir qqch à faire dans mon problème ?

    Voilà le new:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        Public Sub New()
            'MyBase.New()
            'This call is required by the Windows Form Designer.
            InitializeComponent()
     
            'Add any initialization after the InitializeComponent() call
            Me.MaxLength = 10
            Me.MonMask = "__/__/____"
            Me.Text = Me.MonMask
    J'ai écrit ça à taton...

    La longueur max est bien limitée à 10 caractères mais la propriété Text ne bouge pas, ça reste le nom du composant suivant d'un numéro.
    Faut-il laisser le constructeur de la classe héritée ou non ?

    Trop de questions

    Griftou.

  13. #13
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 175
    Points : 25 116
    Points
    25 116
    Par défaut
    ta propriété est bien écrite ...
    pour le me.text dans le new, à priori c'est bien ca qu'il faut faire, mais je ne suis pas expert en vs2003 ne connaissant que vs2005 et en 2005 ca fonctionne à priori
    tu ne peux pas passer sur 2005 ? (qui propose plus de classes)

  14. #14
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 242
    Points
    4 242
    Par défaut
    Bin honnêtement, j'sais pas. Mais toute façon, faudrait que j'demande à mon chef et qu'il demande au sien etc...

    Donc ça ne serait pas pour tout de suite. En plus en VS2005, le composant TextBox avec un masque de saisie existe

    J'suis en train de fouille le net à la recherche d'un tuto mais j'trouve pas

    T'as pas une corde ? J'vais finir par me pendre...

    Griftou.

  15. #15
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 242
    Points
    4 242
    Par défaut
    Pfff, finalement dans l'urgence, j'ai voulu utiliser le controle que tu as fait mais j'peux pas... Apparemment, tu l'as fait sous VS2005 et ça marche pas sous VS2003...

    Par exemple, la propriété KeyChar dans les keypress est readonly en 2003 '-_-

    C'est lourd quoi !

  16. #16
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 175
    Points : 25 116
    Points
    25 116
    Par défaut
    c'est un peu du nimp si e.keychar est readonly
    enfin c'est contournable mais faut réécrire un peu ...

    bien content de pas être sur 2003 en tout cas ...

    (vs 2005 express est gratuit)

  17. #17
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 242
    Points
    4 242
    Par défaut
    Oui mais bon...
    Enfin là j'suis en train de tester une autre méthode pour créer un composant. Et y a du progrès, la propriété MonMask est accessible !

    J'arrive même à faire en sorte que la propriété Text se mette à jour en modifiant le mask. Reste plus qu'à gerer le comportement lors de la frappe (enfin je crois.

    Pfiou, je sue !!!

  18. #18
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 242
    Points
    4 242
    Par défaut
    Ôh joie, ôh bonheur ! Ca fonctionne !

    J'ai finalement réussi à faire ce que je voulais. Plutot que de créer un projet à part pour faire mon composant, j'ai fait un clic droit sur mon projet d'application et dans add, il y a "user control".

    J'ai pu créer mon composant via cette interface.

    Pour ceux qui sont intéressés, voici le code :
    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    Public Class DateTextBox
        Inherits System.Windows.Forms.TextBox
     
    #Region " Windows Form Designer generated code "
     
        Public Sub New()
            MyBase.New()
     
            'This call is required by the Windows Form Designer.
            InitializeComponent()
     
            'Add any initialization after the InitializeComponent() call
            Me.MaxLength = 10
            'Me.MonMask = "__/__/____"
        End Sub
     
        'UserControl overrides dispose to clean up the component list.
        Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
            If disposing Then
                If Not (components Is Nothing) Then
                    components.Dispose()
                End If
            End If
            MyBase.Dispose(disposing)
        End Sub
     
        'Required by the Windows Form Designer
        Private components As System.ComponentModel.IContainer
     
        'NOTE: The following procedure is required by the Windows Form Designer
        'It can be modified using the Windows Form Designer.  
        'Do not modify it using the code editor.
        Friend WithEvents TextBox1 As System.Windows.Forms.TextBox
        <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
            Me.TextBox1 = New System.Windows.Forms.TextBox
            Me.SuspendLayout()
            '
            'TextBox1
            '
            Me.TextBox1.Location = New System.Drawing.Point(24, 16)
            Me.TextBox1.Name = "TextBox1"
            Me.TextBox1.TabIndex = 0
            Me.TextBox1.Text = "TextBox1"
            '
            'MaskTextBox
            '
            Me.Controls.Add(Me.TextBox1)
            Me.Name = "DateTextBox"
            Me.ResumeLayout(False)
     
        End Sub
     
    #End Region
     
        Private _MonMask As String
        Public Property MonMask() As String
            Get
                Return _MonMask
            End Get
            Set(ByVal Value As String)
                _MonMask = Value
                Me.Text = Me.MonMask
            End Set
        End Property
     
        Protected Overrides Sub OnKeyPress(ByVal e As KeyPressEventArgs)
            Dim selstart As Byte
            MyBase.OnKeyPress(e)
            If Char.IsNumber(e.KeyChar) Then
                e.Handled = True
                If Me.SelectionStart <> 10 Then
                    selstart = Me.SelectionStart
                    If selstart = 2 Or selstart = 5 Then
                        selstart += 1
                    End If
                    Me.Text = Me.Text.Substring(0, selstart) + e.KeyChar + Me.Text.Substring(selstart + 1)
                    Me.SelectionStart = selstart + 1
                End If
            ElseIf e.KeyChar = Chr(8) Then
                e.Handled = True
                If Me.SelectionStart <> 0 Then
                    selstart = Me.SelectionStart
                    If selstart = 3 Or selstart = 6 Then
                        selstart -= 1
                    End If
                    Me.Text = Me.Text.Substring(0, selstart - 1) + "_" + Me.Text.Substring(selstart)
                    Me.SelectionStart = selstart - 1
                End If
            Else
                e.Handled = True
            End If
        End Sub
    End Class
    Attention, Il ne gère que les dates !
    Si vous trouvez un bug, faites le moi savoir, j'suis sûr qu'il doit bien y en avoir un ou deux.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [ASP.NET C# 3.5] Linkbuttons dans contrôle perso
    Par chrix dans le forum ASP.NET
    Réponses: 1
    Dernier message: 23/02/2008, 19h10
  2. Réponses: 0
    Dernier message: 23/02/2008, 13h49
  3. [VB.NET 2003] création de composant : valeur d'une property
    Par Kropernic dans le forum Windows Forms
    Réponses: 15
    Dernier message: 19/10/2007, 12h13
  4. [VB.NET] - Création de contrôle dynamique
    Par DeFCrew dans le forum Windows Forms
    Réponses: 6
    Dernier message: 08/09/2006, 16h18
  5. Location install lors d'une création de MSI sous VS Net 2003
    Par jeff37 dans le forum Autres Logiciels
    Réponses: 1
    Dernier message: 02/03/2006, 07h43

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