Il peut être étonnant de voir des méthodes telle que
Chargement()
qui semblent fonctionner comme des évènements mais ce sont en fait des méthodes. Quelques explications sont nécessaires... Certaines classes, comme
Screen
ou
Applet
, possèdent des méthodes qui nécessitent toujours une implémentation pour être activées. Prenons l'exemple de la classe
Applet
. Une applet aura pratiquement toujours quelque chose à mettre à jour lorsqu'elle est activée donc si la classe
Applet
fournit une méthode
Activated()
elle sera invoquée par le moteur de script, Cela aurait pu être réalisé de la même façon avec un évènement de type
OnActivated()
mais cela signifierait alors que chaque applet que vous codez nécessiterait la création d'une méthode pour manipuler un évènement (avec un
handle) et ensuite reprendre cet évènement pour l'exécuter ; cela fonctionnerait de la même manière et il n' y a rien de mauvais dans cette approche, excepté que nous avons pensé que pour rendre ceci plus simple (c'est de là que peux venir la confusion), nous laisserions le moteur de script appeler directement les méthodes pour la plupart des choses. C'est pourquoi il existe une méthode
Screen.Load()
qui est appelée (vous étiez peut être habitués à voir des évènements de type
OnLoad
dans d'autres langages). Si pour une raison ou une autre vous désirez créer un véritable évènement, rien ne vous en empêche. Voilà comment cela peut être réalisé pour la méthode
Load()
d'un écran :
class MonSuperbeEcran : Screen
{
Event OnLoad;
void Load()
{
//Cette méthode Load() est abandonnée par le moteur de script une fois que le
//controle est initialisé
//trigger (déclencheur) d'évènement – qui permet de piloter le comportement
//du handle de l'évènement
OnLoad();
}
}
Pourquoi s'embêter avec ça ? Parce qu'un véritable évènement comme le
OnLoad()
décrit ci-dessus peut voir son
handle changé à la volée et peut même avoir plusieurs
handles qui lui sont assignés, alors que la méthode
Load()
sera seulement appelée directement par le moteur de script.
La plupart du temps vous aurez juste besoin de fournir une méthode d'implémentation.
Tous les évènements doivent être du type
Event
, et ne jamais inclure de définition complète comme une liste de paramètre. Fondamentalement, un évènement est défini et rend possible l'assignation d'un ou de plusieurs
handles. Les évènements ne peuvent jamais retourner de valeurs.
Un évènement est simplement invoqué en l'appelant avec une syntaxe identique à celle utilisée pour appeler une méthode (voir exemple précédent). Aucun mot clé spécial n'est requis.
- Paramètres d'un évènement
Les évènements peuvent inclure des paramètres, mais assurez-vous que vous avez toujours le bon nombre de paramètres dans la méthode qui le manipule ainsi que lors des appels de cet évènement. Voilà un exemple :
class Exemple
{
Event ActiverPause;
void Load()
{
//initalisation du manipulateur (handler)
ActiverPause = ActiverPause_Handler;
}
void ActiverPause_Handler(int param1, int param2)
{
}
void Pause()
{
//appel de l'évènement ActiverPause avec certains paramètres
ActiverPause(1234, 5678);
}
}
- Manipulateurs (handlers) multiples
Nous avons construit un moteur permettant d'assigner des manipulateurs multiples à un seul évènement, principalement parce que cela semble être une chose intéressante à faire. Nous ne l'avons pas encore utilisé, peut être en aurez vous besoin.
Voilà un exemple (remarquez au passage l'utilisation de l'opérateur "
+=
") :
class Exemple
{
Event TelechargementTermine;
void Demarrer()
{
//initialisation de deux manipulateurs (handlers) pour l'évènement
//Les deux manipulateurs Handler1() and Handler2() seront appelés lorsque
//l'évènement est déclenché
TelechargementTermine += Handler1;
TelechargementTermine += Handler2;
}
void Arreter()
{
//suppresion des manipulateurs (handlers)
TelechargementTermine -= Handler1;
TelechargementTermine -= Handler2;
}
void Handler1()
{
}
void Handler2()
{
}
}
L'usage de l'opérateur “
=
” effacera tous les
handlers préalablement créés et les remplacera par un simple
handler qui sera assigné.
Il n'est pas possible pour le moment d'effacer des
handlers multiples autrement qu'en utilisant l'opérateur "
=
", ou individuellement avec l'opérateur “
-=
”.