1. #1
    Nouveau membre du Club
    Femme Profil pro
    Développeur informatique
    Inscrit en
    juillet 2006
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : juillet 2006
    Messages : 41
    Points : 37
    Points
    37

    Par défaut WithEvents sur un Dictionary

    Bonjour,

    Ça fait au moins 1 heure que je cherche sur le net mais je ne trouve pas clairement une réponse :

    Je voudrais savoir s'il est possible de déclarer un WithEvents sur un Dictionary ?

    Si ce n'est pas possible, existe-t-il une autre solution ?

    Merci d'avance pour vos réponses.

  2. #2
    Membre expérimenté
    Homme Profil pro
    Développeur .Net et Delphi
    Inscrit en
    juillet 2002
    Messages
    629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur .Net et Delphi
    Secteur : Finance

    Informations forums :
    Inscription : juillet 2002
    Messages : 629
    Points : 1 424
    Points
    1 424

    Par défaut

    Bonjour,

    Citation Envoyé par maoboyindo Voir le message
    Je voudrais savoir s'il est possible de déclarer un WithEvents sur un Dictionary ?
    Sur une classe qui hérite d'un Dictionary et qui définie des Events, oui :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Public Class MyDictionary
        Inherits Dictionary(Of String, String)
     
        Public Event MyEvent(ByVal value As String)
     
        Public Sub RaiseEvents(ByVal value As String)
            RaiseEvent MyEvent(value)
        End Sub
    End Class
    puis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Dim WithEvents aDic As New MyDictionary()
    Sub aDic_Event(ByVal Value As String) Handles aDic.MyEvent
        MessageBox.Show(Value)
    End Sub
     
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        aDic.RaiseEvents("Hello")
    End Sub
    Je ne sais pas si ça répond à ta question, mais comme tu ne précises pas ton besoin...

  3. #3
    Nouveau membre du Club
    Femme Profil pro
    Développeur informatique
    Inscrit en
    juillet 2006
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : juillet 2006
    Messages : 41
    Points : 37
    Points
    37

    Par défaut

    Je vais essayer d'être claire, mon souci est le suivant :
    Je dois piloter des équipements.
    Ces équipements sont référencés dans un dictionnaire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private WithEvents _Banc As New Dictionary(Of String, RemoteDevice.Device)
    Dans la classe, j'ai besoin de gérer un timer propre à chaque Device car ils peuvent être indépendants les uns des autres mais aussi fonctionner sur le même tempo.
    Du coup, j'ai fait ça :

    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
    Public Class Device
     
        Private WithEvents MonTimer As New System.Timers.Timer
        Private _InstructionFinTimer As String
        Private _NbBoucleTotale As Integer
        Private _NoBoucle As Integer = 1
        Private _InstructionIntervalle As String
     
        Public Event FinTimer()
        Public Event EvtIntermediaireTimer()
        Public Event ActionsIntermediaires()
        Public Event ActionsFinTimer()
     
     
        Private Sub TimerTick(ByVal sender As Object, ByVal e As System.EventArgs) Handles MonTimer.Elapsed
            ' Arrêt du timer
            MonTimer.Stop()
            ' Si le nombre de boucle est inférieur au nombre total de boucles
            If _NoBoucle < _NbBoucleTotale Then
                ' Il s'agit de l'événement intermédiaire.
                RaiseEvent EvtIntermediaireTimer()
            Else
                ' Fin du timer
                RaiseEvent FinTimer()
            End If
        End Sub
     
        Private Sub Device_EvtIntermediaireTimer() Handles Me.EvtIntermediaireTimer
            ' On ajoute 1 au nombre de boucle effectuées
            _NoBoucle = _NoBoucle + 1
            ' Redémarre le timer
            MonTimer.Enabled = True
            Debug.Print("Nouvelle boucle : " + _NoBoucle.ToString)
            RaiseEvent ActionsIntermediaires()
            ' Exécute l'instruction intermédiaire.
            Execute(_InstructionIntervalle)
        End Sub
     
        Private Sub Device_FinTimer() Handles Me.FinTimer
            ' Le nombre de boucles est atteint.
            MonTimer.Stop()
            Debug.Print("Fin Boucle : " + Now.ToString)
            RaiseEvent ActionsFinTimer()
            ' Exécution de l'instruction de fin de timer
            Execute(InstructionFinTimer)
        End Sub
    Donc, au final, je voudrais gérer des timers différents selon les appareils mais renvoyer l'événements de fin de timer ou d'intermédiaire à ma classe appelante pour traiter les événements.

    Je vais tester ASAP la solution que tu me proposes.

    Merci beaucoup.

  4. #4
    Membre expérimenté
    Homme Profil pro
    Développeur .Net et Delphi
    Inscrit en
    juillet 2002
    Messages
    629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur .Net et Delphi
    Secteur : Finance

    Informations forums :
    Inscription : juillet 2002
    Messages : 629
    Points : 1 424
    Points
    1 424

    Par défaut

    C'est un peu confus. Je ne comprends pas pourquoi tu utilises un event EvtIntermediaireTimer() au sein de ta classe. Ton objet s'abonne à un event qu'il déclenche lui-même. Une sub suffirait.

    Concernant ce que tu veux faire si je comprend bien : Tu as un dictionnaire qui contient des devices qui peuvent déclencher des events. L'utilisateur du dictionnaire doit pouvoir s'abonner à ces events.
    Je te conseille d'encapsuler le dictionnaire dans une classe qui servira de "passe plat" pour les events des devices.

    Voici un exemple :

    Une classe Device qui contient un event et la classe de l'argument de l'event :
    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
     
    Public Class Device
        Public Property Name As String
        Public Event DeviceEvent(ByVal Sender As Object, ByVal e As DeviceEventArgs)
     
        Public Sub DoEvent()
            RaiseEvent DeviceEvent(Me, New DeviceEventArgs(Name))
        End Sub
    End Class
     
    ' Paramètre de l'event du device qui donnera le nom du device (c'est pour l'exemple)
    Public Class DeviceEventArgs
        Inherits EventArgs
        Public Property Name As String
        Public Sub New(aName As String)
            Name = aName
        End Sub
    End Class

    Une classe qui contiendra un dictionnaire de devices. J'ai fait exprès de faire une classe conteneur et non une classe qui hérite du dictionnaire afin de gérer l'abonnement et le désabonnement aux events des devices ajoutés :

    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
     
    ' Conteneur des devices (contient un dictionnaire)
    Public Class MyDevices
        Private Devices As New Dictionary(Of String, Device)
        Public Event MyDeviceEvent(ByVal Sender As Object, ByVal e As MyDevicesEventArgs)
     
        ' Ajout d'un Device (abonnement à l'event)
        Public Sub AddDevice(aName As String, aDevice As Device)
            Devices.Add(aName, aDevice)
            AddHandler aDevice.DeviceEvent, AddressOf DeviceEvent
        End Sub
     
        ' Suppression du device (désabonnement de l'event)
        Public Sub RemoveDevice(aName As String)
            Dim aDevice As Device = Nothing
            Devices.TryGetValue(aName, aDevice)
            If (aDevice IsNot Nothing) Then
                RemoveHandler aDevice.DeviceEvent, AddressOf DeviceEvent
                Devices.Remove(aName)
            End If
        End Sub
     
        ' Ici, le Conteneur gère l'event du device et peut le propager :
        Private Sub DeviceEvent(Sender As Object, e As DeviceEventArgs)
            Dim aDevice = CType(Sender, Device)
            Dim aName = e.Name
            Console.WriteLine("Event du device {0}", aName)
            RaiseEvent MyDeviceEvent(Me, New MyDevicesEventArgs(aDevice))
        End Sub
    End Class
     
    ' Paramètre de l'event du conteneur qui indiquera le device ayant levé l'event
    Public Class MyDevicesEventArgs
        Inherits EventArgs
        Public Property Device As Device
        Public Sub New(ByVal aDevice As Device)
            Device = aDevice
        End Sub
    End Class
    Je n'ai pas testé mais l'idée est là.

Discussions similaires

  1. Question sur objet Dictionary
    Par maroonx dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 06/05/2016, 23h12
  2. Réponses: 2
    Dernier message: 04/03/2014, 21h22
  3. ERP: ADempiere/Compiere. Tuto sur: Application Dictionary?
    Par Dexter_Morgan dans le forum Autres ERP
    Réponses: 8
    Dernier message: 14/06/2010, 07h08
  4. Pb sur CreateObject (Scripting.Dictionary)
    Par Elwe31 dans le forum VBA Access
    Réponses: 3
    Dernier message: 02/10/2007, 22h28
  5. lock sur generic.dictionary
    Par volivi dans le forum Général Dotnet
    Réponses: 1
    Dernier message: 08/05/2007, 16h37

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