Canalblog
Editer l'article Suivre ce blog Administration + Créer mon blog
Publicité
Iteratif
Archives
21 août 2004

Les évènements et les délégués dans it.system

Dans it.system, tous les composants utilisent une classe qui fournit une liste simple de délégués.
La classe de base it.system.FControl fournit une structure de données efficace (à l'aide de la propriété Events) pour le stockage et l'extraction de délégués d'événements.La propriété Events est structure de données du type it.system.EventList qui est conçue pour un stockage et une extraction efficaces des délégués d'événements.

La classe suivante (qui d'ailleurs reprend la classe d'exemple de Colin Mook : la classe Box) montre cette structure,
le code implémenté par cette structure est mis en surbrillance et en gras.

 class Box {
      private static var EventClick:String = "EventClick";
      private static var EventRollOver:String = "EventRollOver";
      private static var EventRollOut:String = "EventRollOut";
 
      private var events:EventList;

      private var width:Number ;
      private var height:Number ;
      private var container_mc:MovieClip
      
      function Box (x:Number, y:Number,w:Number, h:Number, target:MovieClip, depth:Number ) {
           container_mc = target.createEmptyMovieClip("boxcontainer" + depth, depth);
           container_mc.onPress = Delegate.create(this ,onClick);
           container_mc.onRollOver = Delegate.create(this ,onRollOver);
           container_mc.onRollOut = Delegate.create(this ,onRollOut);
           container_mc.useHandCursor = false ;
 
           setWidth(w);
           setHeight(h);
 
           setX(x);
           setY(y);
      }
 
      function getWidth ():Number {
           return width;
      }
 
      function setWidth (w:Number ) {
             width = w;
             draw();
      }
 
      function getHeight ():Number { return height; }
 
      function setHeight (h:Number ) {
           height = h;
          draw();
      }
 
      function getX ():Number { return container_mc._x ; } 
 
      function setX (x:Number) { container_mc._x = x; } 
 
      function getY ():Number { return container_mc._y ; } 
 
      function setY (y:Number) { container_mc._y = y; }
 
      function get Events():EventList {
           if(events == null )
                events = new EventList();
           return events;
      }
 
      function addClick(value:Delegate) {
           Events.addHandler(Carre.EventClick,value);
      }
 
      function addRollOver(value:Delegate) {
           Events.addHandler(Carre.EventRollOver,value);
      }
 
      function addRollOut(value:Delegate) {
           Events.addHandler(Carre.EventRollOut,value);
      }
 
      function onRollOver() {
           var handler = events.getEntry(Carre.EventRollOver);
           if(handler != null )
                handler.invoke(this,"rollOver");
      }
 
      function onRollOut() {
           var handler = events.getEntry(Carre.EventRollOut);
           if(handler != null )
                handler.invoke(this,"rollOut");
      }
 
      function onClick() {
           var handler = events.getEntry(Carre.EventClick);
           if(handler != null )
                handler.invoke(this,"click");
      } 
 
      function draw () {
           container_mc.clear ();
           container_mc.lineStyle (1, 0x000000);
           container_mc.moveTo (0, 0);
           container_mc.beginFill (0xFFCC33, 100);
           container_mc.lineTo (width, 0);
           container_mc.lineTo (width, height);
           container_mc.lineTo (0, height);
           container_mc.lineTo (0, 0);
           container_mc.endFill ();
      }
 }

Des explications s'imposent :
...
private static var EventClick:String = "EventClick";
...

Variable statique qui définit la clé pour le stockage de(s) délégé(s).
...
     function addClick(value:Delegate) {
           Events.addHandler(Box.EventClick,value);
      }
      function onClick() {
           var handler = events.getEntry(Box.EventClick);
           if(handler != null)
                handler.invoke(this,"click");
      }
...

La première fonction permet l'enregistrement du délégué à la liste des délégués pour l'évènement Click.
La seconde permet l'appel au délégué enregistré avec l'évènement Click

Maintenant que les explications sont faites. Voici un exemple concret:

 function doIt() {
      result2.text = "coucou";
 }
 function doOtherIt() {
      result3.text = "un autre coucou";
 }
 
 function doOtherOtherIt() {
      result1.text = "hehe !!!";
 }

 function clear() {
      result1.text = "";
      result2.text = "";
      result3.text = "";
 }

 var myBox = new Box(10,10,100,100,_root,0);
 myBox.addClick(new Delegate(doOtherIt));
 myBox.addClick(new Delegate(doIt));
 myBox.addRollOver(new Delegate(doOtherOtherIt));
 myBox.addRollOut(new Delegate(clear));

On définit des gestionnaires d'événements.
On instancie la classe Box.
On connecte le gestionnaire d'événements à Box, en créant un délégué qui contient une référence à doIt dans son argument et ajouter cette instance déléguée à l'événement Click.

Un apercu (en live) : survolez le carre et cliquez dessus
Publicité
Commentaires
Iteratif
Publicité
Publicité