[C#] Event qui n'est pas affecté

Bon voila, maintenant j’ai un petit problème. Je tiens a préciser que j’ai déjà programmé des évenements en CSharps, qui fonctionnent.

Dans le cadre de ma Dll “IRCClient”, j’ai programmé un event attaché à la classe Channel qui s’apelle “OnReceiveMessage(Message TheMessage)”. Message est une structure toute bete composée d’un DateTime, d’un string User et d’un string Message.

Dans mon programme principal, je fais ceci:

[code]main()
{
IRCClient TheClient = new IRCClient();

TheClient.Join("#cafzonegw");
TheClient["#cafzonegw"].OnReceiveMessage += new Channel.ReceiveMessageEventHandler(CafzoneMessageHandler);
}

public void CafzoneMessageHandler(Message TheMessage)
{
MessageBox.Show(TheMessage.ToString());
}[/code]

Quelques infos:

TheClient.Join("#cafzonegw");

se connecte au channel #cafzonegw, et donc ajoute une classe Channel qui peut être atteignable par TheClient[“nomduchan”].

Il faut savoir que le Channel existe sinon il me ferait une exception à l’affectation de l’event à la ligne:

TheClient["#cafzonegw"].OnReceiveMessage += new …

du moins je pense… pourtant quand je trace le code et que je tenter de lancer l’event, il me dis qu’il est nul.

Je crois que tu te melange les pinceau entre l’event et la methode OnMachinChose avec un EventArg. Ou alors ta convention de nommage est clairement pas catholique.

Ca devrait etre TheClient.MessageReceived += new ReceivedMessageEventHandled(…)

et dans ta classe tu as un

public event ReceivedMessageEventHandled MessageReceived;

ainsi qu’une methode

public virtual void OnReceivedMessage(ReceivedMEssageEventArgs arg) {
if(ReveivedMessage != null) {
ReceivedMessage(this, arg);
}
}

et quand tu recois un message sur le reseau tu le lance en faisant
OnReceivedMessage(new ReceivedMessageEventArg)

enfin ca parait clair quand on l’a fait 2/3 fois. Et en plus, inutile, mais ca m’ecorche les yeux un peu c’est MessageReceived en anglais et pas ReceivedMessage :stuck_out_tongue:

Mattes le tuto ici:

http://msdn.microsoft.com/library/default…ntstutorial.asp

+1 sauf que le OnReceivedMessage doit être protected en général, vu qu’il n’est sensé être utilisé que par la classe.

Mais pour le problème en lui même, je ne vois pas trop d’où il peut venir, sinon de là.

Tu peux envoyer le code de IRCClient ? Au moins de la déclaration de l’event et du OnReceivedMessage ?

Plus généralement, j’ai du mal à voir l’intéret de créer un évènement par channel, et pas un évènement global au client qui expose en paramètre le channel d’où provient ce client. Tu vas te retrouver avec autant de méthodes de récupération des messages (CafzoneMessageHandler) que tu as de channels… Et si tu en fais une seule, quel est l’intéret d’avoir fait les évènements à cet endroit ? Pour moi c’est de la tambouille interne entre la classe channel et la classe ircclient, qui s’occupe de factoriser un peu tout ça. C’est juste mon avis, et je connais peut-être pas tous les tenants et aboutissants de ta démarche.

Bah c’est pour un bot IRC et j’aimerais qu’il ai des comportements différents suivant les channels. Mais il est vrai que le channel en paramètre peut etre une solution…

(code sugar edit)

code
TheClient.Join("#cafzonegw");

Channel Cafzone = TheClient["#cafzonegw"];
Cafzone.OnReceiveMessage += new Channel.ReceiveMessageEventHandler(CafzoneHandlerOnReceiveMessage);

(IRCClient.cs)
public void Join(string ChannelName)
{
 if (Writer != null)
 {
     Writer.WriteLine("JOIN " + ChannelName);
     ChannelList[ChannelName.ToLower()] = new Channel(ChannelName);
 }
}

(Channel.cs)
   public class Channel
   {
       private string CurrentName;
       private List Messages = new List();
       private List Users = new List();

       public delegate void ReceiveMessageEventHandler(Message TheMessage);
       public event ReceiveMessageEventHandler OnReceiveMessage;

       public string Name
       {
           get { return (CurrentName); }
       }

       public Channel(string ChannelName)
       {
           CurrentName = ChannelName;
       }

       private string GetUser(string User)
       {
           switch (User.Substring(0, 1))
           {
               case “@”:
               case “+”:
                   User = User.Substring(1);
                   break;
               default:
                   break;
           }

           return (User);
       }

       public void AddUser(string User)
       {
           IRCRights Status;

           switch (User.Substring(0, 1))
           {
               case “@”: Status = IRCRights.Operator; break;
               case “+”: Status = IRCRights.Voice; break;
               default:
                   Status = IRCRights.Normal;
                   break;
           }

           Users.Add(new IRCUser(GetUser(User), Status));
       }

       public void AddMessage(string User, string TheMessage)
       {
           Message Insertion = new Message(GetUser(User), TheMessage);
           Messages.Add(Insertion);

           if(OnReceiveMessage!=null)
               OnReceiveMessage(Insertion);
       }
   }[/code]

Moi avec un tel code, je sens bien l'écrasage de variable...

Tu voudrais pas rajouter quelques tests de Contains(), et de Add() histoire d'être sur ?

Moi avec un tel code, je sens bien l’écrasage de variable…

Tu voudrais pas rajouter quelques tests de Contains(), et de Add() histoire d’être sur ?

Ah tiens pas con… pourquoi j’ai pas fait un Add moi? (pourtant c’est pas la première fois que j’utilise les Listes génériques…)

public void Join(string ChannelName) { if (Writer != null) { Writer.WriteLine("JOIN " + ChannelName); //ChannelList[ChannelName.ToLower()] = new Channel(ChannelName); ChannelList.Add(ChannelName.ToLower(), new Channel(ChannelName)); } }

Mais ca marche pas mieux… j’ai pas fait le test de contains vu que ca me lacherais une exception et que donc ca me bloquerais le programme, mais visiblement aucune exception est lancée…

Je vois pas trop d’où peut provenir l’erreur. Essaie de rajouter des traces ?

Oui mais tracer quoi? Parce que l’affectation de la fonction, là, on peut pas la tracer, ou bien?