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 :

listener en C-sharp, comment faire? [Débutant]


Sujet :

C#

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 38
    Points : 26
    Points
    26
    Par défaut listener en C-sharp, comment faire?
    Bonjour, je débute totalement en C-Sharp mais j'ai quelques notions en Java.
    Justement dans Java il y avait la possibilité de créer des "listener" et je voudrais savoir si on peut faire la même chose en C-Sharp.

    Ce que je voudrais faire plus précisément c'est : j'ai une fenetre1 qui contient un bouton1. ce bouton1 serait "abonné" à un listener de ma création qui contient un traitement, (par exemple ouvrir une fenetre2 ou encore autre chose). Et quand l'utilisateur clique sur le bouton1 ça déclenche le traitement.
    Le dit listener pourrait bien entendu être utilisé par d'autres boutons.

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 125
    Points
    25 125
    Par défaut
    pas tout compris, c'est les évènements que tu cherches ?
    en .net il est possible de lier un évènement (click, drag, keypress etc...) à un void
    en mode design le double clic sur un bouton le fait automatiquement (voir le code généré pour ca dans le fichier designer)

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 38
    Points : 26
    Points
    26
    Par défaut
    Oui ça a sans doute un lien avec les évènements.

    Le coup du double-clique qui te renvoie à une méthode OK, je connaissais pas.

    Mais comment tu l'emploi cette méthode? C'est elle qui te permet de t'abonner à une classe définie comme Listener qui va contenir ton traitement?

    Merci de ton aide.

  4. #4
    Membre éprouvé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2011
    Messages
    487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 487
    Points : 945
    Points
    945
    Par défaut
    En effet, l'équivalant Java des listeners est l'utilisation des évènements. Ceux ci sont gérés avec les mots clés event et delegates, ainsi que des méthodes de callback. Je te renvoie vers le cours suivant qui explique bien (Tu peux zapper les exemples en VB vu que cela ne te concerne pas)

    http://freddyboy.developpez.com/dotnet/articles/events/

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 38
    Points : 26
    Points
    26
    Par défaut
    OK merci j'y vois déjà un peu plus clair.
    Mais si j'ai bien compris, dîtes-moi si je me trompe, la création / génération d'évènements est déjà automatiquement créée par Visual Studio pour ce qui est des composants graphiques (dans notre exemple le Button).

    Donc dans la majorité des cas ce qu'il reste à faire c'est de placer le traitement qu'on veut exécuter suite au clique dans la methode monBouton_click ou de l'externaliser dans une autre classe/methode qu'on appel?
    Ou est-ce qu'on est obligé de passer par toute la création des EventArgs, Delegate, etc...

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 125
    Points
    25 125
    Par défaut
    dans une classe on peut décrire un évènement, et le déclencher dans un membre

    pour écouter l'évènement il faut écrire du code pour dire que tel évènement doit appeler telle void
    visual studio lors du double clic sur un controle génère le code pour s'attacher à l'évènement mais on peut écrire ce même code soit même
    il est aussi possible de détacher un évènement (c'est plus que conseillé en cas d'abonnement manuel, sinon ca peut faire une fuite mémoire)

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 38
    Points : 26
    Points
    26
    Par défaut
    D'accord même si concrètement je vois encore mal à quoi ça peut servir de créer ses propres évènements (j'ai pas d'exemple en tête autre que les composants graphiques).
    Par contre je ne vois pas trop ce que tu entend par "détacher un évènement".

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 125
    Points
    25 125
    Par défaut
    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
    public class ChatTcpIpMsgEventArgs : System.EventArgs
    {
        //(constructeur et autres non codés ...) 
        public string Message { get; set; }
        public string Expéditeur { get; set; }
    }
     
    public class ChatTcpIp
    {
     
        public event MessageRecuEventHandler MessageRecu;
        public delegate void MessageRecuEventHandler(object sender, ChatTcpIpMsgEventArgs e);
     
        protected virtual void OnMessageRecu(string message, string expéditeur) // pour déclencher l'évènement
        {
            if (MessageRecu != null) {
                MessageRecu(this, new ChatTcpIpMsgEventArgs {
                    Message = message,
                    Expéditeur = expéditeur
                }); // je suis pas sûr de la traduction automatique vb.net vers c# ici, c'est une instanciation avec définition de propriétés
            }
        }
     
    }
     
     
     
    public class FormChat : Form
    {
        private ChatTcpIp _chat = new ChatTcpIp();
        public FormChat()
        {
            _chat.MessageRecu += AfficheMessage;
        }
     
        private void AfficheMessage(object sender, ChatTcpIpMsgEventArgs e)
        {
            listbox1.items.@add(e.Expéditeur + ": " + e.Message);
        }
     
        protected override void OnFormClosed(System.Windows.Forms.FormClosedEventArgs e)
        {
            base.OnFormClosed(e);
            _chat.MessageRecu -= AfficheMessage;
        }
     
    }
    ici une classe non graphique qui gère la communication d'un chat a un évènement pour le message reçu
    on peut imaginer un form qui instancie un chat avec des paramètres dont l'ip et la room, et on s'abonne au passage à l'évènement messagerecu
    la classe gère la comm, sur un message entrant elle lève l'évènement sans se préoccuper de qui écoute l'évènement
    le form lui s'occupe de l'affichage

    j'ai suivi ici le codage de microsoft qu'on trouve dans le framework, à savoir que tous les évènements ont sender as object et e as system.eventargs (ou un dérivé comme ici)
    celà permet d'avoir plusieurs évènement même totalement différents qui sont traités par le même void

    on peut tester le type de sender et le caster pour ensuite faire quelque chose avec
    e dans sa classe héritée contient des propriétés spécifiques à l'évènement, là aussi on peut le caster si nécessaire (si 3 évènement différents tombent sur le même void, e sera déclaré sur la classe de base eventargs et castable sur une classe dérivée pour accéder au propriétés)

    dans le framework microsoft fait aussi en sorte que les évènements soient déclenchés par des protected virtual void nommé type OnEvent, l'héritier peut alors faire ce qu'il veut (par contre mon OnMessageRecu devrait pour bien faire recevoir le e plutot que les valeurs des propriétés de e)

  9. #9
    Membre éprouvé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2011
    Messages
    487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 487
    Points : 945
    Points
    945
    Par défaut
    Ce que cherche notre collègue Java est, je pense, savoir comment gérer les évènements de l'interface graphique, comme les clicks sur des boutons ou autre.

    Pour cela, tu sélectionnes ton control (bouton, combo box, autre ...) tu vas dans les propriétés et tout en haut de la fenêtre tu auras une petite icone pour aller dans les évènements. Tu verras toute la liste des évènements disponibles pour le control (OnClick, OnMouseEnter, etc ...) et tu as juste à mettre le nom de la fonction que tu veux comme callback dans la case correspondante à l'action.

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 38
    Points : 26
    Points
    26
    Par défaut
    Oui c'est ça, merci à vous deux.

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

Discussions similaires

  1. [VB6][impression]Comment faire des effets sur les polices ?
    Par le.dod dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 08/11/2002, 10h31
  2. comment faire evoluer ma base vers interbase6
    Par toure32 dans le forum InterBase
    Réponses: 5
    Dernier message: 23/10/2002, 10h59
  3. Réponses: 8
    Dernier message: 18/09/2002, 03h20
  4. Comment faire pour mettre l'ecran en veille ?
    Par March' dans le forum MFC
    Réponses: 6
    Dernier message: 29/08/2002, 14h25
  5. Comment faire pour créer un bitmap
    Par GliGli dans le forum C++Builder
    Réponses: 2
    Dernier message: 24/04/2002, 15h41

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