Aide - Recherche - Membres - Calendrier
Version complète : classe externe Apollo
Centre de Formation Flash - Forums Adobe Flash > Rich media et intégration > Flex
jeanphilippe
salut
Dans une application Apollo et sur Flex Builder, j'ai besoin d'utiliser une classe externe, on va l'appeler MyApp.as
Pour exemple on va dire qu'elle contient ceci :
CODE
package
{
    import flash.display.Sprite;
    import flash.events.MouseEvent;

    public class MyApp extends Sprite
    {
        public function MyApp()
        {
            graphics.beginFill(0xff0000);
            graphics.drawRect(0, 0, stage.stageWidth, stage.stageHeight);
            
            var titleBar:Sprite = new Sprite();
            titleBar.graphics.beginFill(0x0000ff);
            titleBar.graphics.drawRect(0, 0, stage.stageWidth, 20);
            addChild(titleBar);
            
            titleBar.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDowwn);
        }
        
        private function onMouseDowwn(event:MouseEvent):void
        {
            stage.window.startMove();
        }
        
    }
}

J'ai donc mis le fichier MyApp.as dans mon projet Apollo, tout est ok.
Là ou je bloque, c'est comment appeler MyApp.as dans mon projet Apollo
CODE
<?xml version="1.0" encoding="utf-8"?>
<mx:ApolloApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical">
<mx:Script>
        <![CDATA[
]]>
    </mx:Script>
</mx:ApolloApplication>


merci
Tonic
Salut JeanPhi,

pour importer une classe, il te suffit de créer un package contenant ta classe (tu créé un dossier "mesClasses" par exemple). Ex :

CODE
package mesClasses
{
    import flash.display.Sprite;

    public class MyApp extends Sprite
    {
        public function MyApp():void
        {
            trace("coucou");
        }
    }
}


Ensuite, côté mxml, il te suffit d'importer ta classe :

CODE
<?xml version="1.0" encoding="utf-8"?>
<mx:ApolloApplication creationComplete="test()" xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
    <mx:Script>
        <![CDATA[
            import mesClasses.MyApp;
            
            public function test():void
            {
                    var myApp : MyApp = new MyApp();
            }
        ]]>
    </mx:Script>
</mx:ApolloApplication>


Voilou icon_smile.gif
jeanphilippe
merci Tonic , t'es un chef icon_smile.gif
jeanphilippe
bon... en fait je viens de tester mais c'est un échec icon_neutral.gif icon_neutral.gif icon_neutral.gif
la classe n'est pas prise en compte
Je pose en pièce jointe le projet Flex
merci
JP
Johan P
J'ai essayé ton projet chez moi et il n'y aucun problème, la classe est prise en compte.
Je sais pas d'où peut venir le problème de ton côté.

Johan
deuns
Salut,

désolé de faire remonter ce topic des abîmes, mais il se trouve que j'ai le même problème.
Et comme la solution n'y est pas je me suis permis cette action (promis je recommencerais pas icon_razz.gif )

Je viens de faire comme le recommande Tonic pour l'import des classes, j'ai mis également ma classe dans un dossier et je l'appelle depuis mon fichier MXML.
Mais ma classe n'est pas prise en compte (j'ai bien vérifié que ce n'est pas une erreur débile) et j'ai mis un trace en dehors de ma classe pour voir s'il était bien chargé, mais rien...

Du coup j'aimerais savoir si t'avais trouvé, JeanPhilippe (ou autre), d'où venait l'erreur ?!

Merci pour votre attention wink.gif
plop...
Gauthier
bonjour, bonjour

on pourrait avoir un petit bout de code pour voir d'ou ça pourrait venir? (genre la class et son import dans le mxml) wink.gif
deuns
Oui bien sûr smile.gif

Pour la classe
CODE
package modeles{
    import mx.collections.ArrayCollection;
    
    public class BandeauTournant{
        //Element de la classe
        private var _tableau : ArrayCollection;
        
        /*CONSTRUCTEUR*/
        public function BandeauTournant(){
        }
    }
}


Pour l'import dans mxml:
CODE
import modeles.BandeauTournant;


Pour la déclaration d'un objet:
CODE
private var bandeau:BandeauTournant = new BandeauTournant;
Gauthier
etrange, mis a par la declaration

CODE
private var bandeau:BandeauTournant = new BandeauTournant


par

CODE
private var bandeau:BandeauTournant = new BandeauTournant()

je vois pas de probleme dans ton appel
Tonic
Et si tu déclares "bandeau" comme étant une prorpiété d'une classe, c'est ok, mais sinon tu ne peux pas utiliser l'attribut private pour déclarer une variable.
deuns
Bon j'ai réinstallé flex (c'est la bêta version 3 gratuite que j'ai), et maintenant ça fonctionne correctement smile.gif tant mieux ^^

Heu oui effectivement il me manquait les "()" dans la déclaration de l'objet c'était un oubli smile.gif et pas une nouvelle mode de programmation icon_razz.gif

=>Tonic : effectivement pour le private (ce flex me destabilise o_O), je vais de ce pas me flageller !

Merci pour vos réponses smile.gif
deuns
jeanphilippe
ben moi je suis toujours avec mon problème
je n'y arrive pas icon_rolleyes.gif
Flex 3 ne m'indique pas d'erreur mais je n'ai rien quand je teste ou je debug
Faut il importer quelquechose de special pour utiliser des calsses dans Flex ???
je vous joins mon exemple
merci
deuns
Heu moi personnelement j'ai rien eu besoin pour importer ma classe (à part ce qui a été dis plus haut), mais comme j'ai pu m'en apercevoir, flex bugue quand même pas mal :/

As tu essayé comme moi de réinstaller le logiciel ?
deuns
_pil_
j'ai du rater quelque chose, mais a quel moment tu appel le methode test() de ta WindowedApplication?
iteratif
JeanPhilippe, tu ne peux pas utiliser la propriété stage d'une instance de Sprite si elle cette instance n'a pas été ajouté à la liste d'affichage à l'aide de addChild() :

CODE
var myApp:MyAppClass = new MyAppClass();
addChild(myApp);


d'ailleurs même avec ca, tu auras encore un erreur. Lorsque l'on developpe avec Flex il faut oublier les types natives au flash player et travailler avec l'architecture de Flex. Dans ton cas, si tu veux dessiner sur un objet, il faut que ta classe hérite de UIComponent (classe de base pour tous les composants Flex) :

CODE
...
import mx.core.UIComponent;

public class MyAppClass extends UIComponent {
...
jeanphilippe
merci mais ça ne fonctionne toujours pas
PeZ
CITATION(jeanphilippe @ Jun 24 2007, 09:49 AM) *
merci mais ça ne fonctionne toujours pas

La fonction test n'est pas appelée dans l'exemple que tu as posté.

Parce qu'en faisant un addChild, ca devrait fonctionner.
iteratif
Même s'il fait un addChild, ca ne marchera pas... le fait de passer par stage pour récuperer la taille de l'application ne marche pas. Alors pourquoi me dira-t-on et bien parce que flex utilise une architecture de composant qui lui est propre, surtout au niveau du placement et redimmensionnement.

Voici une solution:

CODE
<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
    creationComplete="test()">
        <mx:Script>
        <![CDATA[
            import classes.MyAppClass;
            
            public function test():void
            {
                    var myApp : MyAppClass = new MyAppClass();
                    myApp.percentWidth = 100;
                    myApp.percentHeight = 100;
                    addChild(myApp);
            }
        ]]>
    </mx:Script>
</mx:WindowedApplication>


et la classe :

CODE
package classes
{
    import flash.events.MouseEvent;
    import mx.core.UIComponent;
    import mx.core.FlexSprite;

    public class MyAppClass extends UIComponent
    {
        private var titleBar:FlexSprite;
        
        public function MyAppClass()
        {
            super();
        }
        
        protected override function createChildren():void {
            super.createChildren();
            
            titleBar= new FlexSprite();
            addChild(titleBar);
            
            titleBar.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDowwn);
        }
        
        protected override function measure():void {
            super.measure();
            
            measuredWidth = measuredHeight = 100;
        }
        
        protected override function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void {
            super.updateDisplayList(unscaledWidth,unscaledHeight);
            
            graphics.beginFill(0xff0000);
            graphics.drawRect(0, 0, unscaledWidth, unscaledHeight);
            graphics.endFill();
            
            titleBar.graphics.beginFill(0x0000ff);
            titleBar.graphics.drawRect(0, 0, unscaledWidth, 20);
        }
        
        private function onMouseDowwn(event:MouseEvent):void
        {
            stage.window.startMove();
        }
        
    }
}


Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'informations, la mise en page et les images, veuillez cliquer ici.
Invision Power Board © 2001-2008 Invision Power Services, Inc.