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 :

Abonner un objet aux évènements d'un autre


Sujet :

VB.NET

  1. #1
    Membre émérite Avatar de -N4w4k-
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2011
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2011
    Messages : 545
    Par défaut Abonner un objet aux évènements d'un autre
    Bonjour,

    J'aimerais abonné un objet à des évènements d'un autre objet sans code nul part ailleurs que dans ce premier objet.. J'ai essayé comme ça mais ça ne marche pas..
    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
    Class Objet
     
        Private _name = "Defaut"
        Public Property Name As String
            Get
                Return _name
            End Get
            Set(value As String)
                _name = value
                RaiseEvent NameChanged(Me, New EventArgs)
            End Set
        End Property
     
        Private _value = "Defaut"
        Public Property Value As String
            Get
                Return _value
            End Get
            Set(value As String)
                _value = value
                RaiseEvent ValueChanged(Me, New EventArgs)
            End Set
        End Property
     
        Public Event NameChanged(ByVal sender As Object, ByVal e As EventArgs)
        Public Event ValueChanged(ByVal sender As Object, ByVal e As EventArgs)
     
    End Class
     
    Class Objet2
     
        Sub AddEvent(ByVal obj As Object)
            AddHandler obj, AddressOf Event_Detected 'compile pas
        End Sub
     
        Sub Event_Detected(ByVal sender As Object, ByVal e As EventArgs)
            MsgBox("Un évènement a été détecté!")
        End Sub
     
    End Class
     
    Module Test
     
        Sub Main()
     
            Dim o As New Objet
            Dim o2 As New Objet2
            o2.AddEvent(o.NameChanged) 'compile pas
            o2.AddEvent(o.ValueChanged) 'compile pas
     
            o.Name = "autre nom"   'déclenchement de o2.Event_Detected()
            o.Value = "autre valeur"   'déclenchement de o2.Event_Detected()
     
        End Sub
     
    End Module
    Ici j'aimerais que dès que je change une propriété de l'objet, l'objet2 le détecte mais je n'arrive pas à passer un évènement en paramètre..

    Je ne sais pas si je suis sur la bonne voie, si il existe d'autres manières de faire..

    Si vous avez des lumières à m'apporter..

    Merci

  2. #2
    Membre émérite Avatar de -N4w4k-
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2011
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2011
    Messages : 545
    Par défaut
    J'ai trouvé ce code tiré de msdn pour passer des events en paramètre:
    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
    Imports System
     
    Public Class FireEventArgs
        Inherits EventArgs
     
        Public room As String
        Public ferocity As Integer
     
        Public Sub New(room As String, ferocity As Integer)
            Me.room = room
            Me.ferocity = ferocity
        End Sub
     
     
    End Class
     
    Public Class FireAlarm
     
        Delegate Sub FireEventHandler(sender As Object, fe As FireEventArgs)
     
        Public Event FireEvent As FireEventHandler
     
        Public Sub ActivateFireAlarm(room As String, ferocity As Integer)
     
            Dim fireArgs As New FireEventArgs(room, ferocity)
            RaiseEvent FireEvent(Me, fireArgs)
     
        End Sub
    End Class
     
    Class FireHandlerClass
     
        Public Sub New(fireAlarm As FireAlarm)
            AddHandler fireAlarm.FireEvent, AddressOf ExtinguishFire
        End Sub
     
        Sub ExtinguishFire(sender As Object, fe As FireEventArgs)
     
            Console.WriteLine()
            Console.WriteLine("The ExtinguishFire function was called by {0}.", sender.ToString())
     
            If fe.ferocity < 2 Then
                Console.WriteLine("This fire in the {0} is no problem.  I'm going to pour some water on it.", fe.room)
            Else
                If fe.ferocity < 5 Then
                    Console.WriteLine("Using Fire Extinguisher to put out the fire in the {0}.", fe.room)
                Else
                    Console.WriteLine("The fire in the {0} is out of control.  I'm calling the fire department.", fe.room)
                End If
            End If
        End Sub
     
    End Class
     
    Public Class FireEventTest
     
        Public Shared Sub Main()
     
            Dim myFireAlarm As New FireAlarm()
     
            Dim myFireHandler As New FireHandlerClass(myFireAlarm)
     
            myFireAlarm.ActivateFireAlarm("Kitchen", 3)
            myFireAlarm.ActivateFireAlarm("Study", 1)
            myFireAlarm.ActivateFireAlarm("Porch", 5)
     
            Return
        End Sub
     
    End Class
    Je regarderais ça après manger..

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 197
    Par défaut
    la norme :
    addhandler obj.event, addressof methode

    toi tu n'as pas le .event donc ca ne peut pas compiler ...
    quand ca ne compile pas il serait bien de nous mettre le message d'erreur

    il n'est pas possible d'avoir un event qui dit qu'un des events dispo dans une classe s'est déclenché, il faut s'abonner à tous les events, ou faire un event general qui est raised partout dans le code en cas de modif
    c'est assez rare de passer un event en paramètre pour s'y abonner sans le connaitre (mais faisable au moins par reflection je pense), il y a des conceptions plus simples, il serait mieux de nous expliquer ce que tu veux faire


    Citation Envoyé par -N4w4k- Voir le message
    J'ai trouvé ce code tiré de msdn pour passer des events en paramètre
    non c'est pour passer des paramètres lors d'un event
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  4. #4
    Membre émérite Avatar de -N4w4k-
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2011
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2011
    Messages : 545
    Par défaut
    la norme :
    addhandler obj.event, addressof methode
    toi tu n'as pas le .event donc ca ne peut pas compiler ...
    Oui je sais bien mais c'était juste une façon d'exprimer mon besoin.
    il serait mieux de nous expliquer ce que tu veux faire
    Je suis en train de réaliser un application pour faire des dessins de figures géométriques, avec plusieurs formulaires capables où l'on peut ajouter, modifier, supprimer des figures (form palette, form dessin, form proprietes, etc.). Et ce que je voudrais c'est que chaque form puisse savoir quand la liste de figure a été modifiée sans que qu'ils se connaissent les uns les autres.. D'où mon envie de "passer des events en parametres"..

    Grâce au code que j'ai posté dans mon précédent message, je pense avoir trouvé une solution à mon problème..
    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
    Imports System
     
    Public Class DispatchEventArgs
        Inherits EventArgs
     
        Public EventType As TypeEvent
     
        Public Enum TypeEvent
            FigureAdded
            FigureEdit
            FigureRemoved
        End Enum
     
        Public Sub New(EventType As TypeEvent)
            Me.EventType = EventType
        End Sub
     
    End Class
     
    Public Class EventDispatcher
     
        Delegate Sub DispatchEventHandler(sender As Object, fe As DispatchEventArgs)
     
        Public Event DispatchEvent As DispatchEventHandler
     
        Public Sub Dispatch(sender As Object, dea As DispatchEventArgs)
            Dim dispatchArgs As New DispatchEventArgs(dea.EventType)
            RaiseEvent DispatchEvent(sender, dispatchArgs)
        End Sub
     
    End Class
     
    MustInherit Class ClientEventDispatcher
        Public WithEvents EventDispatcher As EventDispatcher
        MustOverride Sub ReceiveEvent(sender As Object, de As DispatchEventArgs) Handles EventDispatcher.DispatchEvent
     
        Sub SendEvent(sender As Object, de As DispatchEventArgs)
            If EventDispatcher IsNot Nothing Then
                EventDispatcher.Dispatch(sender, de)
            End If
        End Sub
    End Class
    Exemple d'utilisation:
    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
    Class ObjetCreateur
        Inherits ClientEventDispatcher
     
        Public Overrides Sub ReceiveEvent(sender As Object, de As DispatchEventArgs)
            MsgBox(de.EventType.ToString + vbCrLf + "From: " + sender.ToString + vbCrLf + "To: " + Me.ToString)
        End Sub
     
        Public Sub Create()
            SendEvent(Me, New DispatchEventArgs(DispatchEventArgs.TypeEvent.FigureAdded))
        End Sub
     
    End Class
     
    Class ObjetDestructeur
        Inherits ClientEventDispatcher
     
        Public Overrides Sub ReceiveEvent(sender As Object, de As DispatchEventArgs)
            MsgBox(de.EventType.ToString + vbCrLf + "From: " + sender.ToString + vbCrLf + "To: " + Me.ToString)
        End Sub
     
        Public Sub Destroy()
            SendEvent(Me, New DispatchEventArgs(DispatchEventArgs.TypeEvent.FigureRemoved))
        End Sub
     
    End Class
     
    Module ModuleTest
     
        Sub main()
     
            Dim oc As New ObjetCreateur
            Dim od As New ObjetDestructeur
     
            Dim ed As New EventDispatcher
            oc.EventDispatcher = ed
            od.EventDispatcher = ed
     
            oc.Create()
            od.Destroy()
     
        End Sub
     
    End Module
    Je viens de le pondre alors ne sois pas trop méchant ^^
    Bien entendu si tu as une autre suggestion, ce qui est fortement possible, je suis preneur!

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 197
    Par défaut
    Citation Envoyé par -N4w4k- Voir le message
    Je suis en train de réaliser un application pour faire des dessins de figures géométriques, avec plusieurs formulaires capables où l'on peut ajouter, modifier, supprimer des figures (form palette, form dessin, form proprietes, etc.). Et ce que je voudrais c'est que chaque form puisse savoir quand la liste de figure a été modifiée sans que qu'ils se connaissent les uns les autres.. D'où mon envie de "passer des events en parametres"..
    les formes ne se connaissent pas entre elles, mais elle ont surement un conteneur en commun, en général c'est donc le conteneur qui parcourt la liste des formes (except celui qui vient de modifier quelque chose) pour appeler une méthode d'avertissement
    une interface peut etre utile avec d'exposer un même membre sur plusieurs classes (ou sinon de l'héritage, ca marche aussi)

    pas lu le code qui suivait ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

Discussions similaires

  1. "abonner" un container père aux évènements de ses container fils
    Par Invité dans le forum Agents de placement/Fenêtres
    Réponses: 0
    Dernier message: 06/01/2009, 19h12
  2. Réponses: 7
    Dernier message: 25/01/2006, 13h33
  3. Composant graphic "transparent" aux événements sou
    Par jmborbe dans le forum Composants VCL
    Réponses: 5
    Dernier message: 04/11/2005, 17h17
  4. [css] acceder aux propriétés d'un autre objet
    Par bakonu dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 21/10/2005, 12h28
  5. Un objet rendu apparaît derrière un autre objet
    Par jamal24 dans le forum OpenGL
    Réponses: 2
    Dernier message: 01/05/2003, 20h47

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