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 :

Est-ce possible de lever un événement (RaiseEvent) dans le Sub New?


Sujet :

VB.NET

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2006
    Messages : 102
    Par défaut Est-ce possible de lever un événement (RaiseEvent) dans le Sub New?
    J'ai la classe suivante où j'ai l'événement Initialized appelée à la fin du Sub New:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Public Class MyClass
       Public Event Initialized(ByVal sender As Object, ByVal e As EventArgs)
     
       Public Sub New()
                   RaiseEvent Initialized(Me, New System.EventArgs)
       End Sub
    End Class
    J'implémente l'événement dans ma Form1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Public Class Form1
       Private _MyClass as MyClass
     
       Private Sub Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
          Me._MyClass = New MyClass
       End Sub
     
       Private Sub _MyClass_Initialized(ByVal sender As Object, ByVal e As System.EventArgs) Handles _MyClass.Initialized
          MessageBox.Show("Allo")
       End Sub
    End Class
    La méthode _MyClass_Initialized n'est jamais appelée. J'imagine que comme l'object n'est pas encore complètement créé, le 'Handle' de l'événement est null.


    Quelqu'un a une idée? Autre solution?


    Merci d'avance,

    Pascal

  2. #2
    Membre émérite
    Avatar de dkmix
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    619
    Détails du profil
    Informations personnelles :
    Localisation : Jamaïque

    Informations forums :
    Inscription : Septembre 2007
    Messages : 619
    Par défaut
    dans le constructeur peut-être ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2006
    Messages : 102
    Par défaut
    dkmix, le 'Public Sub New' est un constructeur.

  4. #4
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 048
    Par défaut
    Pour savoir quand le constructeur a fini son job...

    Tu peux attendre qu'il ait passer à l'instruction suivant ton

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me._MyClass = New MyClass
    =>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
       Private Sub Load()
          Me._MyClass = New MyClass
    La fonction a faire après l'initialisation de Me._MyClass
       End Sub
    Si ta class est un contrôle, il me semble qu'il y a un évènement load qui se lance après le chargement de l'objet (J'ai ça sur un panel en tout cas).

    Mais je peine à trouver l'utilité de ce que tu veux bricoler là...

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2006
    Messages : 102
    Par défaut
    sinople,

    Merci de la suggestion mais c'est que ma classe peut être instancier à plus d'un endroit et j'aime bien programmer par événements plutôt que de façon séquencielle.

    Et ma classe n'est pas un contrôle.

    J'ai pensé à un timer mais c'est pas très chic comme solution.

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 19 875
    Par défaut
    Ca ne sert à rien de déclencher un évènement dans un constructeur, pour une raison très simple : vu que l'objet n'a pas encore fini d'être créé, personne n'a pu s'abonner à l'évènement, donc il n'y aura personne pour le recevoir...

    De toutes façons, l'appel à un constructeur est bloquant, donc ça ne sert pas à grand chose d'avoir une notification quand c'est fini

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 19 875
    Par défaut
    Il faut dire que la syntaxe VB n'aide pas vraiment à comprendre le problème... la clause Handles semble indiquer que le handler est attaché immédiatement à l'évènement, mais en fait ce n'est fait qu'après le constructeur...

    Le petit test suivant montre bien ce qui se passe :

    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
    Sub Main()
        Dim t As New Test()
        t.DoTest()
    End Sub
     
    Class Test
        Private WithEvents f As Foo
     
        Sub DoTest
            Console.WriteLine("Before constructor")
            f = New Foo()
            Console.WriteLine("After constructor")
            f.RaiseBar()
            Console.WriteLine("After event")
        End Sub
     
        Sub f_Bar(sender As Object, e As EventArgs) Handles f.Bar
            Console.WriteLine("In handler")
        End Sub
     
    End Class
     
    Class Foo
     
        Public Sub New()
            Console.WriteLine("In constructor")
            RaiseEvent Bar(Me, EventArgs.Empty)
        End Sub
     
        Public Sub RaiseBar()
            RaiseEvent Bar(Me, EventArgs.Empty)
        End Sub
     
        Private _bar As EventHandler
     
        Public Custom Event Bar As EventHandler
            AddHandler(ByVal value As EventHandler)
                Console.WriteLine("In AddHandler")
                _bar = System.Delegate.Combine(_bar, value)
            End AddHandler
            RemoveHandler(ByVal value As EventHandler)
                Console.WriteLine("In RemoveHandler")
                _bar = System.Delegate.Remove(_bar, value)
            End RemoveHandler
            RaiseEvent(ByVal sender As Object, ByVal e As EventArgs)
                Console.WriteLine("In RaiseEvent")
                If _bar IsNot Nothing Then
                    _bar(sender, e)
                End If
            End RaiseEvent
        End Event
     
    End Class
    L'évènement custom permet de détecter à quel moment le handler est abonné

    Ce code donne le résultat suivant :

    Before constructor
    In constructor
    In RaiseEvent
    In AddHandler
    After constructor
    In RaiseEvent
    In handler
    After event

  8. #8
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 202
    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 202
    Par défaut
    Citation Envoyé par Passepoil Voir le message
    sinople,

    Merci de la suggestion mais c'est que ma classe peut être instancier à plus d'un endroit et j'aime bien programmer par événements plutôt que de façon séquencielle.

    Et ma classe n'est pas un contrôle.

    J'ai pensé à un timer mais c'est pas très chic comme solution.

    pas spécialement analysé le fond, mais pour la forme il faut faire un factory

    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
     
    public class machin
     
      private sub new
      end sub
     
      public shared event MachinCreated(m as machin)
     
      public shared sub Create() as machin
         dim m as new machin
         raiseevent MachinCreated(m)
         return m
      end sub
     
    end class
    l'évènement est donc partagé, et il faut s'y a abonner par le type, et non une instance AddHandler Machin.MachinCreated, Addressof SubXouY
    et pour créer un machin il ne faut plus dim m as new machin mais dim m as machin = machin.Create
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2006
    Messages : 102
    Par défaut
    tomlev,

    Merci pour les explications... ça confirme ce que je croyais.


    Pol63,

    Toujours la solution à tout! Merci, ça me satisfait pleinement comme solution.

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 08/02/2008, 10h35
  2. [PHP-JS] Est il possible d'intégrer du code PHP dans du code javacript ?
    Par bilou95 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 16/07/2007, 09h05
  3. Réponses: 2
    Dernier message: 12/07/2007, 15h07
  4. Réponses: 1
    Dernier message: 01/03/2007, 08h24
  5. [WinDev] Est-il possible d'executer une application Win32 dans un site ?
    Par ran_hery dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 4
    Dernier message: 22/09/2006, 14h41

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