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

C# Discussion :

Avertir une méthode que la méthode d'une autre classe a été executée [Débutant]


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 98
    Par défaut Avertir une méthode que la méthode d'une autre classe a été executée
    Bonjour,
    Voici le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    class Program
        {
            static void Main(string[] args)
            {
                RecoisEvenement recoisEvenement = new RecoisEvenement();
            }
        }
    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
     
    public class EnvoieEvenement
        {
            public string MotAEnvoyer { get; set; }
     
            public delegate string EventHandler(string Mot); // Création du délégué
            public event EventHandler SendMot; // Création de l'evenement
     
            public EnvoieEvenement()
            {
                do
                {
                    string mot = Console.ReadLine();
                    ChangementDeMot(mot); // Execution de la commande sensé envoyé le signal a l'autre classe
                } while (MotAEnvoyer!="fin");
     
            }
     
            public void ChangementDeMot(string Mot)
            {
                this.MotAEnvoyer = Mot;
                SendMot(MotAEnvoyer); // Envoie de l'évènement !
            }
        }
    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 RecoisEvenement
        {
     
            public RecoisEvenement()
            {
                EnvoieEvenement envoieEvenement = new EnvoieEvenement();
                envoieEvenement.SendMot += new EventHandler(); // Je n'arrive pas a le compléter !
            }
     
            public void EcrireMot(string Mot)
            {
                Console.WriteLine(Mot);
            }
        }
    Je voudrais que quand la méthode "ChangementDeMot" est exécuté, la méthode "EcrireMot" en soit avertie et si possible qu'elle reçoive le mot en question pour pouvoir l'afficher dans la console.

    L'exemple est minimaliste, mais je voudrais qu'a l’exécution d'une méthode une autre de "traitement" puisse l'être aussi tout en recevant les données pour pouvoir le faire !

    Merci d'avance de votre aide !

  2. #2
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Tu n'étais pourtant pas loin

    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 delegate void EventHandler(string Mot);
    public event EventHandler SendMot;
     
    public class RecoisEvenement
        {
     
            public RecoisEvenement()
            {
                EnvoieEvenement envoieEvenement = new EnvoieEvenement();
                envoieEvenement.SendMot += EcrireMot;
            }
     
            public void EcrireMot(string Mot)
            {
                Console.WriteLine(Mot);
            }
        }

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 98
    Par défaut
    Merci pour ta réponse,
    J'ai fait la modification, mais je n'ai toujours pas la notification du mot qui s'affiche dans la console, sans la ligne if(SendMot!=null) j'ai une erreur NullReferenceException apparement mon EventHandler pointe dans le vide !
    J'ai encore oublié quelque chose ?

    le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class Program
        {
            static void Main(string[] args)
            {
                new RecoisEvenement();
            }
        }
    }
    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
     
    public class EnvoieEvenement
        {
            public string MotAEnvoyer { get; set; }
     
            public delegate void EventHandler(string Mot); // Création du délégué
            public event EventHandler SendMot; // Création de l'evenement
     
            public EnvoieEvenement()
            {
                do
                {
                    string mot = Console.ReadLine();
                    ChangementDeMot(mot); // Execution de la commande sensé envoyé le signal a l'autre classe
                } while (MotAEnvoyer != "fin");
     
            }
     
            public void ChangementDeMot(string Mot)
            {
                this.MotAEnvoyer = Mot;
                if(SendMot!=null) // Sans cette ligne, je me prend un NullReferenceException !
                    SendMot(MotAEnvoyer); // Envoie de l'évènement !
            }
        }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    public class RecoisEvenement
        {
            public RecoisEvenement()
            {
                EnvoieEvenement envoieEvenement = new EnvoieEvenement();
                envoieEvenement.SendMot += EcrireMot;
            }
     
            public void EcrireMot(string Mot)
            {
                Console.WriteLine("Notification du mot: "+Mot);
            }
        }

  4. #4
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    C'est normal si tu regardes la chronologie des évènements
    Tu appelles le constructeur de RecoisEvenement
    Ce premier constructeur appelle le constructeur de EnvoieEvenement
    Ce second constructeur lève l'évènement
    Tu sors du deuxième constructeur
    Tu sors du premier constructeur
    Tu t'abonnes à l'évènement

    Le problème vient de ta conception, ici le constructeur est bloquant et dépend de l'entrée utilisateur. Un constructeur doit généralement s'exécuter le plus rapidement, son rôle est uniquement d'initialiser l'objet.
    Je te suggère de transformer ce constructeur en une vraie méthode qui sera appelée après t'être abonnée à l'évènement. De plus, envoieevenement n'a pas besoin d'être dans recoisevenement (il ne devrait pas).

    A partir de ce raisonnement on obtient:
    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
    class Program
    {
        static void Main(string[] args)
        {
            RecoisEvenement re = new RecoisEvenement();
            EnvoieEvenement ee = new EnvoieEvenement();
            ee.SendMot += re.EcrireMot;
            ee.Ecouter();
        }
    }
     
    public class EnvoieEvenement
    {
        public delegate void EventHandler(string Mot);
        public event EventHandler SendMot;
     
        public void Ecouter()
        {
            string leMot = string.Empty;
            do
            {
                leMot = Console.ReadLine();
                ChangementDeMot(leMot);
            } while (leMot != "fin");
        }
     
        private void ChangementDeMot(string leMot)
        {
            if(SendMot != null)
                SendMot(leMot);
        }
    }
     
    public class RecoisEvenement
    { 
        public void EcrireMot(string Mot)
        {
            Console.WriteLine("Notification du mot: "+Mot);
        }
    }

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 98
    Par défaut
    Merci pour ton aide, erreur bête de ma part, là ça fonctionne parfaitement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    class Program
        {
            static void Main(string[] args)
            {
                RecoisEvenement re1 = new RecoisEvenement("Classe 1");
                RecoisEvenement re2 = new RecoisEvenement("Classe 2");
                EnvoieEvenement ee = new EnvoieEvenement();
                ee.SendMot += re1.EcrireMot; // La classe 1 s'abonne à l'évènement
                ee.SendMot += re2.EcrireMot; // La classe 2 s'abonne a l'évènement
                ee.Ecouter();
            }
        }
    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 EnvoieEvenement
        {
            public delegate void EventHandler(string Mot); // Création du délégué
            public event EventHandler SendMot; // Création de l'évènement
     
            public void Ecouter()
            {
                string leMot = string.Empty;
                do
                {
                    leMot = Console.ReadLine();
                    ChangementDeMot(leMot);
                } while (leMot != "fin");
            }
     
            private void ChangementDeMot(string leMot)
            {
                if (SendMot != null)
                    SendMot(leMot); // Envoi de l'évènement
            }
        }
    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 RecoisEvenement
        {
            public string Nom { get; private set; }
     
            public RecoisEvenement(string Nom)
            {
                this.Nom = Nom;
            }
     
            public void EcrireMot(string Mot)
            {
                Console.WriteLine("Notification du mot: " + Mot + " dans l'objet: "+ this.Nom);
            }
        }
    J'ai compris le principe même si je vais garder cette exemple de coté pour réussir à le faire correctement au début, mais ça va vraiment changer ma façon d'organiser mon code.
    Merci encore !

    ==> Sujet Résolu !

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

Discussions similaires

  1. Est-ce que l'approbation d'une compétence est perdue lors d'une upgrade ?
    Par Oppenheimer dans le forum Mode d'emploi & aide aux nouveaux
    Réponses: 0
    Dernier message: 26/06/2015, 16h22
  2. Réponses: 2
    Dernier message: 23/11/2012, 16h20
  3. Réponses: 3
    Dernier message: 14/08/2012, 10h24
  4. Réponses: 3
    Dernier message: 20/06/2007, 17h40
  5. [MySQL] Prob d'incrémentation d'une variable que j'extrait d'une table
    Par bodysplash007 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 30/04/2007, 14h24

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