Erreur de fonction dans une classe

Résolu
on_drag_on Messages postés 1236 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 6 octobre 2010 - 5 mai 2009 à 18:30
on_drag_on Messages postés 1236 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 6 octobre 2010 - 7 mai 2009 à 19:41
Bonjour à tous,

Je suis entrain de créer une classe pour un lecteur vidéo avec chargement XML. Jusque-là tout fonctionne. Maintenant j'ai créé un clip bar de classe Bar dans laquelle est imbriqué un clip play_btn.
Je crée donc une fonction functionPlay et je place ma méthode play() dedans. Là il me sort une erreur: Un terme n'est pas défini et n'a pas de propriété. at Main/functionPlay().

Alors mes questions sont: sauriez-vous m'expliquer le pourquoi de cette erreur et, étant donné que je débute dans ces classes et que j'ai encore beaucoup de peine avec la logique AS3,est-ce que mon code vous semble "propre" ?

Voici mon code:

package

{
    import flash.display.*;
    import flash.events.*;
    import flash.net.URLLoader;
    import flash.net.URLRequest;
    import fl.video.FLVPlayback;
   
    public class Main extends MovieClip
   
        {
            private var xmlURL:URLRequest = new URLRequest("videos.xml");
            private var xmlLoader:URLLoader = new URLLoader(xmlURL);
            private var player:FLVPlayback = new FLVPlayback();
            private var bar:Bar = new Bar();

                public function Main():void
       
                    {
                        xmlLoader.addEventListener(Event.COMPLETE, xmlLoaded);
                        xmlLoader.load(xmlURL);
                        bar.play_btn.addEventListener(MouseEvent.CLICK, functionPlay);
                    }
       
                public function xmlLoaded(pEvt:Event):void
       
                    {
                        bar.y = 270;
                        player.width = 480;
                        player.height = 270;
                        player.autoPlay =false;
                        addChild(player);
                        addChild(bar)
                    }
                   
                public function functionPlay(pEvt:MouseEvent):void
               
                    {
                        var xml:XML = new XML (pEvt.target.data);
                        var xmlList:XMLList = xml.elements();
                        player.play(xmlList[1].@stream);
                    }
                   
            }
                   
}

Merci à ceux qui prendront le temps de se pencher sur mon problème ^^.

@+.
telov.ch

22 réponses

gremlins7 Messages postés 380 Date d'inscription mardi 29 avril 2003 Statut Membre Dernière intervention 28 décembre 2009
5 mai 2009 à 21:26
normal qu'il la trouve pas, tu ne l'a pas define

tu rajoute la propriete
private var xml:XML;

tu construit la propriete quand le chargement est fini
public function xmlLoaded(pEvt:Event):void
{
           (...)
            xml = new XML (pEvt.target.data);
 }

puis dans la fonction qui reagit au clic tu le lance la lecture :

public function functionPlay(pEvt:MouseEvent):void
{
            player.play(xml.elements()[1].@stream);
 }
3
gremlins7 Messages postés 380 Date d'inscription mardi 29 avril 2003 Statut Membre Dernière intervention 28 décembre 2009
5 mai 2009 à 22:40
Ben si ce que je t'ai dis marche très bien  :
Tu avait fait une erreur lorsque tu construit l'objet xml, c'etait pas var xml:XML=new XML(pEvt.target.data); mais seulement xml = new XML(pEvt.target.data);

Voila le code complet & corrigé (et du coup merci pour le code)
package

{
    import flash.display.*;
    import flash.events.*;
    import flash.net.URLLoader;
    import flash.net.URLRequest;
    import fl.video.FLVPlayback;
   
    public class Main extends MovieClip
   
        {
            private var xmlURL:URLRequest = new URLRequest("videos.xml");
            private var xmlLoader:URLLoader = new URLLoader(xmlURL);
            private var player:FLVPlayback = new FLVPlayback();
            private var xml:XML = new XML();
            private var bar:Bar = new Bar();

                public function Main():void
       
                    {
                       
                        xmlLoader.addEventListener(Event.COMPLETE, xmlLoaded);
                        xmlLoader.load(xmlURL);
                    }
       
                public function xmlLoaded(pEvt:Event):void
       
                    {
                        xml = new XML(pEvt.target.data);
                        bar.y = 270;
                        player.width = 480;
                        player.height = 270;
                        player.autoPlay =false;
                        bar.play_btn.addEventListener(MouseEvent.CLICK, functionPlay);
                        addChild(player);
                        addChild(bar);
                       
                    }
   
                public function functionPlay(pEvt:MouseEvent):void
               
                    {
                        player.play(xml.elements()[1].@stream);
                    }
                   
            }
                   
}
3
gremlins7 Messages postés 380 Date d'inscription mardi 29 avril 2003 Statut Membre Dernière intervention 28 décembre 2009
5 mai 2009 à 22:41
PS: tu constatera que j'ai remit l'ecouteur dans la fonction xmlLoaded, je trouve ça plus propre
3
gremlins7 Messages postés 380 Date d'inscription mardi 29 avril 2003 Statut Membre Dernière intervention 28 décembre 2009
5 mai 2009 à 19:15
Salut,
c'est ptet ça mais je suis pas sur :
import MonRepertoire.Bar

L'erreur srvient quand tu code la fonction play ou quand tu rajoute ton objet bar ?

Sinon le code me semble propre.
a+
Grems
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
on_drag_on Messages postés 1236 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 6 octobre 2010
5 mai 2009 à 19:22
Si tu veux si je n'ai qu'un objet FLVPlayback dans ma biblio et que je place :

var xml:XML = new XML (pEvt.target.data);
var xmlList:XMLList = xml.elements();
player.play(xmlList[1].@stream);

Tout fonctionne.

Maintenant j'ajoute une barre de lecture (clip: bar) dans ma biblio. Dans cette barre de lecture j'ajoute mes clips play, pause, stop etc... je lie cette barre à l'AS en nommant sa classe Bar. J'ajoute une fonction "functionPlay" et je déplace les instructions ci-dessus dans cette fonction et là ça me génère l'erreur ...

@+.
telov.ch
0
gremlins7 Messages postés 380 Date d'inscription mardi 29 avril 2003 Statut Membre Dernière intervention 28 décembre 2009
5 mai 2009 à 19:28
Ok je crois savoir:
donc ton objet bar est dans la bibliotheque...
verifie si dans les propriètes de ton objet bar si l'option exporter pour actionscript est bien cochée, sinon choisi une classe mère movieclip ou sprite ou...(par defaut je crois qu'il met moviclip)
0
on_drag_on Messages postés 1236 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 6 octobre 2010
5 mai 2009 à 19:36
Non ça c'est bon si je trace(bar); après son addChild j'ai bien un [object Bar]...

@+.
telov.ch
0
gremlins7 Messages postés 380 Date d'inscription mardi 29 avril 2003 Statut Membre Dernière intervention 28 décembre 2009
5 mai 2009 à 19:39
On pardon, j'ai repondu un peu vite...merci de ne pas tenir compte de mon precedant post...
donc quand ton FLVPlayback est dans la biblio pas de soucis, et lorsque tu essaye de l'ecrire en fonction ça coince...mais tu as bien du mettre du code derrière tes boutons play, pause, stop ? Si oui c'est quoi ?
0
on_drag_on Messages postés 1236 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 6 octobre 2010
5 mai 2009 à 19:44
Merci déjà de prendre de ton temps ;)

En fait si je fais:

public class Main extends MovieClip
   
        {
            private var xmlURL:URLRequest = new URLRequest("videos.xml");
            private var xmlLoader:URLLoader = new URLLoader(xmlURL);
            private var player:FLVPlayback = new FLVPlayback();

                public function Main():void
       
                    {
                        xmlLoader.addEventListener(Event.COMPLETE, xmlLoaded);
                        xmlLoader.load(xmlURL);
                    }
       
                public function xmlLoaded(pEvt:Event):void
       
                    {
                        var xml:XML = new XML (pEvt.target.data);
                        var xmlList:XMLList = xml.elements();
                        player.play(xmlList[1].@stream);
                        player.width = 480;
                        player.height = 270;
                        addChild(player);
                       
                    }

Là j'ai bien ma vidéo qui se lance.
Si j' ajoutes ce que j'ai dit plus haut ça me génère l'erreur citée ...

@+.
telov.ch
0
on_drag_on Messages postés 1236 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 6 octobre 2010
5 mai 2009 à 19:47
P.S non j'ai pas encore mis le code pour pause stop etc... vu que déjà play ne fonctionne pas.
Si je trace(bar.play_btn); j'ai bien un objet movieclip je ne pense pas que ce soit un prob de ciblage (quoique) je penche plus pour une mauvaise ordonnance de mon code ...

@+.
telov.ch
0
gremlins7 Messages postés 380 Date d'inscription mardi 29 avril 2003 Statut Membre Dernière intervention 28 décembre 2009
5 mai 2009 à 19:49
Peu être que tu clique alors que le load n'est pas fini et que donc xmlList[1] n'est pas encore defini, pour eliminer cette erreur eventuelle deplace l'ajout de l'evenement click uniquement lorsque le load est fini

                public function xmlLoaded(pEvt:Event):void
       
                    {
                        bar.y = 270;
                        player.width = 480;
                        player.height = 270;
                        player.autoPlay =false;
                        addChild(player);
                        bar.play_btn.addEventListener(MouseEvent.CLICK, functionPlay);
                        addChild(bar)
                    }
0
on_drag_on Messages postés 1236 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 6 octobre 2010
5 mai 2009 à 19:55
... non , il veut toujours pas me lire cette fonction quelque soit l'endroit ou je place mon écouteur ...

@+.
telov.ch
0
gremlins7 Messages postés 380 Date d'inscription mardi 29 avril 2003 Statut Membre Dernière intervention 28 décembre 2009
5 mai 2009 à 20:09
Des trois lignes suivantes de functionPlay  :
                        var xml:XML = new XML (pEvt.target.data);
                        var xmlList:XMLList = xml.elements();
                        player.play(xmlList[1].@stream);
c'est laquelle qui provoque l'erreur ?

Au fait pourquoi tu fais AddChild(Player) ?

PS : tu dois pouvoir l'ecrire en une ligne du style player.play(xml.elements()[1].@stream);
0
on_drag_on Messages postés 1236 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 6 octobre 2010
5 mai 2009 à 20:33
En effet

var xml:XML = new XML (pEvt.target.data);
player.play(xml.elements()[1].@stream);

fonctionne tout aussi bien :) apparement pas besoin de passer par une xmlList, mais ça change pas mon problème ...

Par-contre en lisant ce que t'as dit,
Si je fais:

public function functionPlay(pEvt:MouseEvent):void
               
                    {
                        trace("ok");
                    }

Ca marche ! Donc c'est ma déclaration de la variable xml qui joue pas ...

public function functionPlay(pEvt:MouseEvent):void
               
                    {
                        trace("ok");
                        var xml:XML = new XML (pEvt.target.data);
                        player.play(xml.elements()[1].@stream);
                    }

P.S addChild(player) ne sert qu'à afficher mon objet  FLVPlayback c'est tout ;)

@+.
telov.ch
0
gremlins7 Messages postés 380 Date d'inscription mardi 29 avril 2003 Statut Membre Dernière intervention 28 décembre 2009
5 mai 2009 à 20:53
Ca y est j'ai trouvé, ça doit être ça à 95%
ta fonction functionPlau prend en MouseEvent en paramètre (pEvt.MousEvent), or dans cette fonction la ligne :

var xml:XML = new XML (pEvt.target.data);

demande en event sur l'xml : Event.COMPLETE
0
on_drag_on Messages postés 1236 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 6 octobre 2010
5 mai 2009 à 21:06
Oui ça me parait juste, donc en fait c'est plus logique de le placer dans la fonction xmlLoaded, ce que j'avais fais au début, vu que cette fonction est écoutée par xmlLoader qui lui est un event ... mais dans ce cas comment récupérer le 1er noeud dans ma fonction play car évidement si je fais du coup:

public function functionPlay(pEvt:MouseEvent):void
               
                    {
                        player.play(xml.elements()[1].@stream);
                    }

Me dit qu'il trouve pas la propriété xml ...
@+.
telov.ch
0
on_drag_on Messages postés 1236 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 6 octobre 2010
5 mai 2009 à 21:49
Non toujours pas ... me génère d'autres erreurs ... je sens que là t'es gentillement en train de regretter de m'avoir répondu :) ...

Bon si jamais t'as encore un poil de temps le plus simple le dossier est là (14Mb à cause des vidéos de test ...)

@+.
telov.ch
0
on_drag_on Messages postés 1236 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 6 octobre 2010
5 mai 2009 à 22:46
Yes ! T'es un champion !  :)
T'inquiètes, pour le code je le poserais ici d'ici quelques jours (quand j'aurais fini) et je manquerais pas d'ajouter un grand remerciement à ton égard !
Merci ;=)

@+.
telov.ch
0
gremlins7 Messages postés 380 Date d'inscription mardi 29 avril 2003 Statut Membre Dernière intervention 28 décembre 2009
5 mai 2009 à 22:52
oh de rien, ce fut un plaisir
Merci à toi aussi
@+
0
on_drag_on Messages postés 1236 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 6 octobre 2010
6 mai 2009 à 23:14
Re,

Plus qu'un détail et je poste ^^, comment puis-je dire: si les noeuds parcouru = au total du nombre de noeuds contenu dans le xml, alors on va pas plus loin ?
(Suis-je clair ?)

public function functionFwd(pEvt:MouseEvent):void
              
                    {
                        inc++;
                        player.play(xml.elements()[inc].@stream);
                        bar.infoVideo.text = (xml.elements()[inc].@title);
                    }
                   
                  public function functionRew(pEvt:MouseEvent):void
              
                    {
                        inc--;
                        player.play(xml.elements()[inc].@stream);
                        bar.infoVideo.text = (xml.elements()[inc].@title);
                    }
                   

@+.
telov.ch
0
Rejoignez-nous