Précédent   Forum des professionnels en informatique > Dotnet > Langages > VB.NET
VB.NET Forum d'entraide sur la programmation Visual Basic .NET. Avant de poster -> FAQ VB.NET, Articles VB.NET, Sources VB.NET
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 30/01/2012, 21h10   #1
Membre à l'essai
 
Inscription : mars 2008
Messages : 89
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 89
Points : 23
Points : 23
Par défaut Créer un Evènement dans ma Class

Bonjour à tous,

Je suis débutant en Programmation VB et je n'arrive pas à comprendre la mise en place des évements.

Dans l'exemple suivant, l'évement TextChange est bien appelé dans mon application aussi bien coté changement de Proprieté que lors de la Procédure Calcul.

Code :
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
 
Public Class Class1
Private _mTexte As String
 
' Déclare un évènement
Public Event TextChange(ByVal UserName As String)
 
Public Property Texte()
Get
    Return _mTexte
End Get
Set(ByVal Value)
If Value <> _mTexte Then
  RaiseEvent TextChange("hello")'<= déclenchement de l'évènement par RaiseEvent
End If
_mTexte = Value
End Set
End Property
 
public sub Calcul(X as short)
 _mTexte = Cstr(X/5)
RaiseEvent TextChange("Calcul")
end sub
 
End Class
Cependant si je transforme la Procédure de Public En Private et que j'ajoute un constructeur comme montré ci-desous et bien plus rien ne fonctionne excepté l'évement au niveau de la Propriété

Code :
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
 
Public Class Class1
Private _mTexte As String
 
' Déclare un évènement
Public Event TextChange(ByVal UserName As String)
 
Public Property Texte()
Get
    Return _mTexte
End Get
Set(ByVal Value)
If Value <> _mTexte Then
  RaiseEvent TextChange("hello")'<= déclenchement de l'évènement par RaiseEvent
End If
_mTexte = Value
End Set
End Property
 
public Sub New(X as Short)
Calul(X)
RaiseEvent TextChange("New")
end sub
 
Private sub Calcul(X as short)
 _mTexte = Cstr(X/5)
RaiseEvent TextChange("Calcul")
end sub
 
End Class
Si quelqu'un peut m'aider dans ce problème car perso je ne comprend pas d'où ça pourrai venir.
Merci à vous tous.
boby15000 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2012, 22h28   #2
Responsable .NET
 
Avatar de tomlev
 
Homme Thomas Levesque
Développeur .NET
Inscription : février 2004
Messages : 16 728
Détails du profil
Informations personnelles :
Nom : Homme Thomas Levesque
Âge : 30
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur .NET
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2004
Messages : 16 728
Points : 26 703
Points : 26 703
Le fait que la procédure Calcul soit privée ne change rien pour le déclenchement de l'évènement... A quel endroit appelles-tu cette procédure ?
__________________

Pas de questions techniques par MP ! Le forum est là pour ça...

Tutoriels : Les markup extensions en WPF - La sérialisation XML avec .NET (Aller plus loin) - Une visite guidée de WPF (traduction)
Projet : Dvp.NET, la librairie .NET open-source des membres de Developpez !

Envie de contribuer à la rubrique .NET ?
tomlev est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 31/01/2012, 04h03   #3
Membre à l'essai
 
Inscription : mars 2008
Messages : 89
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 89
Points : 23
Points : 23
Citation:
Envoyé par tomlev Voir le message
Le fait que la procédure Calcul soit privée ne change rien pour le déclenchement de l'évènement... A quel endroit appelles-tu cette procédure ?
C'est bien ce que je pensais mais vue la situation je me mets des doutes. Voici le code coté application

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Public Class Form_GestionCalendrier
 
Public WithEvents B As Class1
 
Private Sub Bt_ImporterJours_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Bt_ImporterJours.Click
        B = New Class1(CInt(TextBox_Annee.Text))  ' Evenement New : ne fonctionne jamais
        B.calcul(CInt(TextBox_Annee.Text))  ' Evenement Calcul : fonctionne que lorsqu'elle est Public et appelé directement
End Sub
 
Private Sub B_TextChange() Handles B.TextChange
        MsgBox("ok")
End Sub
 
End Class
Merci de ton aide
boby15000 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2012, 10h14   #4
Responsable .NET
 
Avatar de tomlev
 
Homme Thomas Levesque
Développeur .NET
Inscription : février 2004
Messages : 16 728
Détails du profil
Informations personnelles :
Nom : Homme Thomas Levesque
Âge : 30
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur .NET
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2004
Messages : 16 728
Points : 26 703
Points : 26 703
Bah tu appelles la méthode Calcul depuis une autre classe que celle où elle est déclarée... si tu la rends privée, tu ne peux plus faire ça ! Ça ne te donne pas une erreur de compilation ?
__________________

Pas de questions techniques par MP ! Le forum est là pour ça...

Tutoriels : Les markup extensions en WPF - La sérialisation XML avec .NET (Aller plus loin) - Une visite guidée de WPF (traduction)
Projet : Dvp.NET, la librairie .NET open-source des membres de Developpez !

Envie de contribuer à la rubrique .NET ?
tomlev est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 31/01/2012, 12h07   #5
Membre expérimenté
 
Inscription : octobre 2006
Messages : 404
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 404
Points : 553
Points : 553
Bonjour,
Dans la seconde class1 :

Code :
1
2
3
4
5
6
7
8
9
10
11
public Sub New(X as Short)
Calul(X)
RaiseEvent TextChange("New")
end sub
 
Private sub Calcul(X as short)
 _mTexte = Cstr(X/5)
RaiseEvent TextChange("Calcul")
end sub
 
End Class
Là, il doit s'agir d'un problème de copie, je pense : calcul.
VB.NET ne déclenche pas les Events collés dans le code de la Sub New().
L'Objet n'étant créé qu'à la fin de New(), il ne peut se voir abonné à des events avant sa création.
Je me fie à TomLev.
Comme le dit encore, TomLev ci dessus , dans une Private Sub, Event ne peut être accessible pour l'Objet créé.


Donc si Calcul doit rester privé, on peut créer une sub publique dédiée aux Events, dans le genre :
Code :
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 Form_GestionCalendrier
 
    Private WithEvents B As Class1
 
    Private Sub Bt_ImporterJours_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Bt_ImporterJours.Click
        B = New Class1(CShort(TextBox_Annee.Text))
        B.RaiseEvents()
    End Sub
 
    Private Sub B_TextChange() Handles B.TextChange
        MsgBox("ok")
    End Sub
 
End Class
 
    Public Class Class1
        Private _mTexte As String
 
        ' Déclare un évènement
        Public Event TextChange(ByVal UserName As String)
 
        Public Property Texte() As String
            Get
                Return _mTexte
            End Get
            Set(ByVal Value As String)
                If Value <> _mTexte Then
                    RaiseEvent TextChange("hello") '<= déclenchement de l'évènement par RaiseEvent
                End If
                _mTexte = Value
            End Set
        End Property
 
        Public Sub New(ByVal X As Short)
            Calcul(X)
        End Sub
 
        Private Sub Calcul(ByVal X As Short)
            _mTexte = CStr(X / 5)
        End Sub
 
        Public Sub RaiseEvents()
            RaiseEvent TextChange("Calcul")
        End Sub
 
    End Class
chrismonoye est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2012, 14h30   #6
Responsable .NET
 
Avatar de tomlev
 
Homme Thomas Levesque
Développeur .NET
Inscription : février 2004
Messages : 16 728
Détails du profil
Informations personnelles :
Nom : Homme Thomas Levesque
Âge : 30
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur .NET
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2004
Messages : 16 728
Points : 26 703
Points : 26 703
Citation:
Envoyé par chrismonoye Voir le message
VB.NET ne déclenche pas les Events collés dans le code de la Sub New().
Si, il les déclenche... c'est juste qu'il n'y a (généralement) personne pour les gérer, puisque l'objet n'est pas encore complètement créé. Je précise "généralement" parce qu'il serait en fait possible de gérer un évènement déclenché dans le constructeur, si le handler est passé en paramètre du constructeur par exemple :

Code :
1
2
3
4
5
public Sub New(X as Short, handler As TextChangeEventHandler)
    AddHandler Me.TextChange, handler
    Calcul(X)
    RaiseEvent TextChange("New")
end sub
__________________

Pas de questions techniques par MP ! Le forum est là pour ça...

Tutoriels : Les markup extensions en WPF - La sérialisation XML avec .NET (Aller plus loin) - Une visite guidée de WPF (traduction)
Projet : Dvp.NET, la librairie .NET open-source des membres de Developpez !

Envie de contribuer à la rubrique .NET ?
tomlev est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 03/02/2012, 04h14   #7
Membre à l'essai
 
Inscription : mars 2008
Messages : 89
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 89
Points : 23
Points : 23
Tout d'abord je vous remercie tous pour votre aide.

D'après ce que j'ai compris, on ne peut pas avoir d'événements dans une Sub Private si je crée un objet dans une autre Class mais dans ce cas là je ne vois pas le but des événements.

Enfin avec le temps et la pratique je comprendrai surement.

Merci beaucoup
boby15000 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/02/2012, 10h12   #8
Responsable .NET
 
Avatar de tomlev
 
Homme Thomas Levesque
Développeur .NET
Inscription : février 2004
Messages : 16 728
Détails du profil
Informations personnelles :
Nom : Homme Thomas Levesque
Âge : 30
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur .NET
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2004
Messages : 16 728
Points : 26 703
Points : 26 703
Citation:
Envoyé par boby15000 Voir le message
D'après ce que j'ai compris, on ne peut pas avoir d'événements dans une Sub Private si je crée un objet dans une autre Class
Bien sûr que tu peux, mais tu raisonnes à l'envers...

Tu sembles pense que les évènements doivent être déclenchés depuis l'extérieur des objets qui les publient ; par exemple tu cherches à déclencher l'évènement TextChange de Class1 depuis la classe Form_GestionCalendrier. Là effectivement ça ne sert à rien : pourquoi réagir à un évènement si tu sais déjà quand il va se produire ? L'intérêt des évènements, c'est d'être notifié quand il se passe quelque chose que tu ne peux pas prévoir autrement... Donc typiquement, le code qui gère l'évènement (i.e. réagit à l'évènement) n'est pas celui qui le déclenche.
__________________

Pas de questions techniques par MP ! Le forum est là pour ça...

Tutoriels : Les markup extensions en WPF - La sérialisation XML avec .NET (Aller plus loin) - Une visite guidée de WPF (traduction)
Projet : Dvp.NET, la librairie .NET open-source des membres de Developpez !

Envie de contribuer à la rubrique .NET ?
tomlev est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 04/02/2012, 03h37   #9
Membre à l'essai
 
Inscription : mars 2008
Messages : 89
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 89
Points : 23
Points : 23
Citation:
Envoyé par tomlev Voir le message
Bien sûr que tu peux, mais tu raisonnes à l'envers...

Tu sembles pense que les évènements doivent être déclenchés depuis l'extérieur des objets qui les publient ; par exemple tu cherches à déclencher l'évènement TextChange de Class1 depuis la classe Form_GestionCalendrier. Là effectivement ça ne sert à rien : pourquoi réagir à un évènement si tu sais déjà quand il va se produire ? L'intérêt des évènements, c'est d'être notifié quand il se passe quelque chose que tu ne peux pas prévoir autrement... Donc typiquement, le code qui gère l'évènement (i.e. réagit à l'évènement) n'est pas celui qui le déclenche.
Ok d'accord, si j'ai bien compris il n'y a pas d'utilité à créer des évenements pour une Fonction spécifique dès lors qu'on sait où et quand l'objet utilisera cette Fonction.

Il est devient donc plus logique de les utiliser pour gérer les erreurs.
boby15000 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/02/2012, 13h29   #10
Responsable .NET
 
Avatar de tomlev
 
Homme Thomas Levesque
Développeur .NET
Inscription : février 2004
Messages : 16 728
Détails du profil
Informations personnelles :
Nom : Homme Thomas Levesque
Âge : 30
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur .NET
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2004
Messages : 16 728
Points : 26 703
Points : 26 703
Citation:
Envoyé par boby15000 Voir le message
Il est devient donc plus logique de les utiliser pour gérer les erreurs.
Pas forcément des erreurs, mais des évènements (au sens le plus général du terme) dont tu ne peux pas savoir à quel moment ils peuvent se produire.
__________________

Pas de questions techniques par MP ! Le forum est là pour ça...

Tutoriels : Les markup extensions en WPF - La sérialisation XML avec .NET (Aller plus loin) - Une visite guidée de WPF (traduction)
Projet : Dvp.NET, la librairie .NET open-source des membres de Developpez !

Envie de contribuer à la rubrique .NET ?
tomlev est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 13/02/2012, 18h06   #11
Membre à l'essai
 
Inscription : mars 2008
Messages : 89
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 89
Points : 23
Points : 23
Merci pour votre aide.

Je commence à comprendre l'utilisation des événements. Ce n'est pas encore tout à fait clair mais avec de la pratique je sais que j'arriverai à utiliser les événements dans leurs bon sens.

Encore merci
boby15000 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h04.


 
 
 
 
Partenaires

Hébergement Web