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;
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
+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…
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);
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…