Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > Flash/Flex > Flex
Flex Forum d'entraide sur la programmation Adobe Flex : applications Internet riches (RIA)
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 14/08/2011, 23h18   #1
Futur Membre du Club
 
Luc
Inscription : février 2003
Messages : 47
Détails du profil
Informations personnelles :
Nom : Luc

Informations forums :
Inscription : février 2003
Messages : 47
Points : 16
Points : 16
Par défaut Custom event et listener

Bonjour,
j'ai tourné le problème dans tous les sens, j'arrive pas à comprendre où j'ai déconné. Mon problème est le suivant : j'ai une classe MyClass qui émet un événement custom, et y a rien à faire j'arrive pas à le "catcher".
Ci-dessous le code en tris partie :
Ma classe qui va émettre l’événement :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
package
{
	import mx.controls.Label;
 
	public class MyClass extends Label
	{
 
		public function MyClass()
		{
 
		}
 
		public function emitEvent():void
		{
			dispatchEvent(new MyClassEvent(MyClassEvent.MY_EVENT,true));
			trace("event emitted");
		}
 
	}
}
Mon événement custom :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
package
{
	import flash.display.InteractiveObject;
	import flash.events.MouseEvent;
 
	public class MyClassEvent extends MouseEvent
	{
		public static const MY_EVENT:String = "MY_EVENT";
 
		public function MyClassEvent(type:String, bubbles:Boolean=true)
		{
			super(type, bubbles);
			trace("event created");
		}
 
	}
}
Et enfin mon application :
Code :
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
48
49
 
<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication
	xmlns:mx="http://www.adobe.com/2006/mxml"
	layout="absolute"
	width="400" height="400">
 
	<mx:Script>
		<![CDATA[
			import MyClass;
 
			private var _mc:MyClass;
 
			private function createMyClass():void {
				_mc = new MyClass();
				trace("class created");
			}
 
			public function createListener():void {
				this.addEventListener(MyClassEvent.MY_EVENT, catchEvent);
				trace("listener added");
			}
 
			public function verifyListener():void {
				if (this.willTrigger(MyClassEvent.MY_EVENT))
					trace("listener verified by willTrigger");
				if (this.hasEventListener(MyClassEvent.MY_EVENT))
					trace("listener verified by hasEventListener");
			}
 
			private function launchSignal():void {
				_mc.emitEvent();
			}
 
			private function catchEvent(event:MyClassEvent):void {
				trace("event catched !!");
			}
 
 
		]]>
	</mx:Script>
 
	<mx:VBox width="100%" height="100%" paddingTop="10" paddingLeft="10" paddingRight="10" paddingBottom="10">
		<mx:Button label="Create" click="createMyClass();" />
		<mx:Button label="Add listener" click="createListener();" />
		<mx:Button label="Verify listener" click="verifyListener();" />
		<mx:Button label="Signal" click="launchSignal();" />		
	</mx:VBox>
</mx:WindowedApplication>
Lorsque j'execute mon programme et que je clique successivement sur les 4 boutons, toutes les étapes se réalisent correctement mais au final la dernière ne me permet pas de "catcher" mon événement comme en atteste la sortie console ci-dessous :
Citation:
[SWF] preview.swf - 1*040*971 bytes after decompression
class created
listener added
listener verified by willTrigger
listener verified by hasEventListener
event created
event emitted
Je n'ai pas le message "event catched !!" indiquant que mon événement à bien été intercepté

Ca fait plusieurs jours que je creuse, et j'ai pas trouvé, j'imagine que ça doit être tout con, mais je vois pas ce que j'ai oublié. Quelqu'un a t'il une idée pour me mettre sur la voie ?
D'avance merci.
Chance666 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/08/2011, 10h16   #2
Membre Expert
 
Avatar de Madfrix
 
Inscription : juin 2007
Messages : 2 278
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : juin 2007
Messages : 2 278
Points : 2 324
Points : 2 324
Bonjour,

Citation:
If you want an MXML component to be able to register a listener for the event, you must make the event known to the Flex compiler by using the [Event] metadata tag. For each public event that your custom component dispatches, you add an [Event] metadata keyword before the class definition that defines that event, as the following example shows:
essaie de modifier ta classe MyClass de la sorte :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 
package
{
	import mx.controls.Label;
 
        [Event(name="MY_EVENT", type="MyClassEvent")]
	public class MyClass extends Label
	{
 
		public function MyClass()
		{
 
		}
 
		public function emitEvent():void
		{
			dispatchEvent(new MyClassEvent(MyClassEvent.MY_EVENT,true));
			trace("event emitted");
		}
 
	}
}
PS: ne pas créer de package, c'est moche

++
__________________
Je ne réponds pas aux questions envoyées par mp
Madfrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/08/2011, 10h41   #3
Futur Membre du Club
 
Luc
Inscription : février 2003
Messages : 47
Détails du profil
Informations personnelles :
Nom : Luc

Informations forums :
Inscription : février 2003
Messages : 47
Points : 16
Points : 16
Merci MadFrix pour cette réponse, j'avais effectivement déjà vu cette info. dans la doc, et j'ai déjà essayé avec et sans ce metadata, ça change rien, toujours pas d’événement catched

P.S. : A titre d'info et sans faire dériver le sujet, pourquoi c'est mal les packages ?
Chance666 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/08/2011, 11h42   #4
Membre Expert
 
Avatar de Madfrix
 
Inscription : juin 2007
Messages : 2 278
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : juin 2007
Messages : 2 278
Points : 2 324
Points : 2 324
Citation:
Envoyé par Chance666 Voir le message
P.S. : A titre d'info et sans faire dériver le sujet, pourquoi c'est mal les packages ?
en fait je disais que tu n'utilises pas de package (enfin tu utilises celui par défaut). C'est pas très structuré, mais je me doute que tu fais des tests donc que tu codes pas forcément très "proprement" pour le moment.

Concernant ton problème, tout marche bien et tout est correctement dispatché sauf que tu ecoutes pas au bon endroit. C'est _mc qui dispatche l'événement, place donc un ecouteur sur lui au lieu de l'application
__________________
Je ne réponds pas aux questions envoyées par mp
Madfrix est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 16/08/2011, 12h14   #5
Futur Membre du Club
 
Luc
Inscription : février 2003
Messages : 47
Détails du profil
Informations personnelles :
Nom : Luc

Informations forums :
Inscription : février 2003
Messages : 47
Points : 16
Points : 16
Yeahhhhhhhhhh !!!!
Merci beaucoup Madfrix, ça fait bien 2 semaines que je traine sur ce pb, je le laisse reposer quelques jours avant d'y revenir régulièrement en me disant qu'avec le temps j'aurai peut-être la bonne solution, mais rien n'y a fait, ta dernière solution est effectivement la bonne.

P.S. : effectivement pour le package, j'ai développé ce use-case pour illustrer mon problème, mon code original est mieux structuré ;-)
Chance666 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/08/2011, 12h37   #6
Membre Expert
 
Avatar de Madfrix
 
Inscription : juin 2007
Messages : 2 278
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : juin 2007
Messages : 2 278
Points : 2 324
Points : 2 324
Si je peux me permettre un conseil aussi pour ta future appli, utilise un framework comme PureMVC, certes tu vas perdre quelques jours pour connaitre le fonctionnement, mais le système d'événement est bien mieux géré je trouve (basé sur le pattern Observer). En plus une fois que tu as le framework en main, tu codes plus vite et plus proprement

Et puis dernier conseil, passe de Flex3 à Flex4
__________________
Je ne réponds pas aux questions envoyées par mp
Madfrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h58.


 
 
 
 
Partenaires

Hébergement Web