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

VB.NET Discussion :

Question sur Inherits EventArgs


Sujet :

VB.NET

  1. #1
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2019
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2019
    Messages : 54
    Par défaut Question sur Inherits EventArgs
    Bonjour à tous,

    j'essai de créer un classe avec un évenement qui se déclenche à la modification
    d'une propriété. Et surtout qu'on puisse dans le gestionnaire de l'évenement,
    annuler la modification.
    J'ai trouvé un moyen d'y arriver avec cette classe.
    J'ai suivi quelques conseils trouvés un peu partout, et ça à l'air de fonctionner
    correctement.
    J'ai surtout retenu qu'il fallait utiliser "Inherits EventArgs", mais sans trop
    comprendre pourquoi.
    Le probleme est que si je retire l'instruction, ça à l'air de fonctionner tout aussi
    bien. Mais sans aucun doute que quelque chose m'échappe dans le fonctionnement de ce
    que j'écris lol :

    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
    Public Class Classe1
     
        Public Property Nom As String
     
        Private _Prenom As String
        Public Property Prenom() As String
            Get
                Return _Prenom
            End Get
            Set(ByVal value As String)
                Dim PrenomChangedEventArgs As New Classe1EventArgs With {.Prenom = value}
                OnPrenomChanged(PrenomChangedEventArgs)
                If PrenomChangedEventArgs.Annule = False Then
                    _Prenom = value
                End If
            End Set
        End Property
     
        Public Event PrenomChanged(ByVal sender As Object, ByVal e As Classe1EventArgs)
     
        Private Sub OnPrenomChanged(e As Classe1EventArgs)
            RaiseEvent PrenomChanged(Me, e)
        End Sub
     
    End Class
     
    Public Class Classe1EventArgs
        Inherits EventArgs
     
        Public Property Prenom As String
        Public Property Annule As Boolean
     
    End Class
    Edit : je ne comprends pas non plus pourquoi on passe par la Sub "OnPrenomChanged" pour déclencher
    l'évenement. J'ai écris "RaiseEvent PrenomChanged(Me, PrenomChangedEventArgs)" à la place,
    et ça à l'air de fonctionner aussi bien.

  2. #2
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    3 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 155
    Par défaut
    Bonjour,

    Cela fonctionne sans hériter de EventArgs parce que vous ne vous servez pas de ce qui en provient.
    En effet, un événement .NET n’a pas l’obligation d’utiliser une classe dérivée de EventArgs pour ses arguments.

    Il s'agit d'une convention, pas d'une obligation.
    Il est toutefois recommandé d'utiliser EventArgs pour la clarté, la compatibilité et l’uniformité.

    Par contre, j'ai deux remarques.

    La première.
    Dans le code que vous montrez, il n'y a absolument rien change la valeur de Annule.

    Ensuite, pourquoi vouloir absolument passer par un événement ?
    Si l'objectif est de pouvoir annuler la modification par une condition, il y a plus simple.
    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
    Public Class MaClasse
        Private _Prenom As String
     
        Public Property Prenom As String
            Get
                Return _Prenom
            End Get
            Set(value As String)
                ' Condition : n'accepte que les valeurs positives
                If Not EstPrenomValid(value) Then
                    ' Annule la modification
                    Exit Property
                End If
                _Prenom = value
            End Set
        End Property
     
        Public Function EstPrenomValid(value As String) As Boolean
             ' Todo : Mettre ici, un code pour vérifier le prénom
             Return True
        End Function
    End Class

  3. #3
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2019
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2019
    Messages : 54
    Par défaut
    @popo Merci pour toutes ces explications. Maintenant je comprends mieux

    1) Dans une Form ou j'avais crée une variable "ObjClasse1" à partir de la classe, j'avais écrit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub ObjClasse1_PrenomChanged(sender As Object, e As Classe1EventArgs) Handles ObjClasse1.PrenomChanged
     
            If e.Prenom = "toto" Then
                e.Annule = True
                Console.WriteLine("Changement annulé")
            Else
                Console.WriteLine("Changement effectué")
            End If
     
        End Sub
    c'etait juste pour mettre en pratique le fonctionnement du mecanisme.

    2) je n'avais que pour seul objectif de comprendre le mecanisme.
    J'ai vu plusieurs composants ou dans l'evenement ou pouvait par l'instruction :

    annuler l'evenement.
    Et je cherchais juste a comprendre comment ça fonctionnait.

    J'imagine que passer par la Sub "OnPrenomChanged", c'est aussi par convention.
    En tout cas merci d'avoir pris du temps pour m'expliquer.

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 639
    Par défaut
    Il s'agit d'une convention, pas d'une obligation.
    Il est toutefois recommandé d'utiliser EventArgs pour la clarté, la compatibilité et l’uniformité.
    Une autre convention, c'est d'utiliser le suffixe "Changing" ou "Validating" et pas "Changed" pour les évènements "Cancellable".
    Vous remarquerez que .NET fournit pas mal de classes utilitaires qui utilisent ces suffixes pour ce type de Design Pattern.
    Il y a aussi des interfaces utilisant ces suffixes pour implémenter les différentes parties du DP "dans les règles de l'Art". (INotifyPropertyChanging, etc...)

    J'imagine que passer par la Sub "OnPrenomChanged", c'est aussi par convention.
    Beaucoup d'outils de générations de code et de Designers graphiques s'attendent à ce que ces conventions soient un minimum respectées.

    Edit : je ne comprends pas non plus pourquoi on passe par la Sub "OnPrenomChanged" pour déclencher
    l'évenement. J'ai écris "RaiseEvent PrenomChanged(Me, PrenomChangedEventArgs)" à la place,
    et ça à l'air de fonctionner aussi bien.
    C'est des conventions qui simplifient les outils mais aussi le code généré.
    "RaiseEvent" est un syntaxical Sugar qui cache pas mal de code pour rendre ces traitements d'évènements thread-safe, sérialiable, migrable d'un thread-pool à un autre, etc...
    Donc isoler ces machins dans une fonction/procédure séparée, c'est déjà ça pour simplifier le débugging.

Discussions similaires

  1. [debutant] Questions sur 1 futur projet
    Par cyrull22 dans le forum XML/XSL et SOAP
    Réponses: 3
    Dernier message: 28/04/2003, 21h49
  2. Quelques questions sur le TWebBrowser...
    Par CorO dans le forum Web & réseau
    Réponses: 3
    Dernier message: 17/01/2003, 21h23
  3. Question sur les handles et les couleurs...
    Par MrDuChnok dans le forum C++Builder
    Réponses: 7
    Dernier message: 29/10/2002, 08h45
  4. Réponses: 2
    Dernier message: 11/08/2002, 21h27
  5. question sur les message box !
    Par krown dans le forum Langage
    Réponses: 7
    Dernier message: 02/08/2002, 16h11

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