• › Connexion
  • Blog RIA
Section separator

Catégories

  • Annonces
  • Concepts et Usages
  • Événements
  • Général
  • Notes Techniques
  • Références
Adobe EMEA Silver Solution Partner Section separator

Abonnement

  • RSS Articles Articles (RSS)
  • RSS Articles Commentaires (RSS)
  • RSS mail Articles (Email)
  • Populaires
  • Récents
  • Commentaires
  • La courbe de deuil du Flexeur (vu 927 fois)
  • La courbe de deuil du Flexeur
  • Sortie de Kalileo 2.4
  • TestRail : on l’a testé, on l’a adopté !
  • DB2 à la page dans Hibernate 4
  • Parsley fait peau neuve
  • Sphaxslayer dans Contest logo Apache Flex : Nos propositions
  • Anonyme dans Contest logo Apache Flex : Nos propositions
  • Pbergsma dans Contest logo Apache Flex : Nos propositions
  • Liens informatiques du mois – janvier 2012 | Gestion de projet et développement informatique dans Flex est mort, vive Flex !
  • Florian Fesseler dans Flexmojos : Quick compile mode

Auteurs

  • Alexis Kartmann (12)
  • Antoine Gehl (4)
  • Benoit Kogut-Kubiak (2)
  • Cyril Daloz (10)
  • Daniel Pesic (6)
  • Delphine Estebanez (3)
  • Fadi Mansour (3)
  • Florent Hirsch (1)
  • Florian Fesseler (13)
  • Gaétane Stavaux (3)
  • Guillaume Mignard (4)
  • Java Team (1)
  • Julien Revel (22)
  • Mahmoud Ramadan (1)
  • Matthieu Jobert (1)
  • Morgan Bruneau (1)
  • Stéphane Guyot (1)
  • Stéphane Koëth (2)
  • Thomas de Verdière (1)
  • Yann Graufogel (3)
Section separator

Tags

Adobe Adobe Business Exchange Adobe MAX AIR AMF AS3 Cairngorm Corporate Flash Player Flex Framework iPhone JAVA Kap Inspect Kap Lab LCDS LiveCycle Mobile MVC PureMVC QA Reporting RIA RTMP Spark
Section separator

Archives

  • mai 2013 (1)
  • avril 2012 (1)
  • février 2012 (3)
  • janvier 2012 (4)
  • décembre 2011 (1)
  • novembre 2011 (2)
  • octobre 2011 (4)
  • août 2011 (2)
  • juillet 2011 (5)
  • juin 2011 (4)
  • mai 2011 (1)
  • mars 2011 (1)
  • janvier 2011 (1)
  • décembre 2010 (1)
  • novembre 2010 (3)
  • juin 2010 (1)
  • mars 2010 (1)
  • février 2010 (1)
  • décembre 2009 (2)
  • novembre 2009 (1)
  • octobre 2009 (3)
  • septembre 2009 (1)
  • août 2009 (1)
  • avril 2009 (2)
  • février 2009 (1)
  • janvier 2009 (3)
  • décembre 2008 (4)
  • novembre 2008 (2)
  • octobre 2008 (2)
  • septembre 2008 (2)
  • août 2008 (1)
  • juin 2008 (1)
  • avril 2008 (4)
  • mars 2008 (3)
  • février 2008 (2)
  • janvier 2008 (1)
  • décembre 2007 (3)
  • novembre 2007 (1)
  • septembre 2007 (1)
  • juillet 2007 (1)
  • juin 2007 (1)
  • mai 2007 (3)
  • avril 2007 (8)
  • mars 2007 (2)
  • février 2007 (1)

Marque-pages

  • Adobe Blogs
  • Adobe Developer Connection
  • Adobe Evangelists
  • Adobe Flex Tutorials (FR)
  • Code moi un mouton
Section separator

Kap IT

  • Site Web
  • Blog RIA
  • Kap Lab - Composants Flex
  • GitHub Kap IT

Blog RIA

Veille, Recherche et Développement RIA

Comment intégrer une application Flex dans une application Flash ou AS3

Par Fadi MansourgravatarFermerAuteur : Fadi Mansour Email : contact@kapit.fr
Site : http://www.kapit.fr
A propos : Voir les autres billets de l'auteur (3)
, publié le 10 octobre 2008

Imaginez que vous développez une application AS3 dans Flash et que vous voulez ajouter un formulaire. Vous aimeriez développer ce formulaire en utilisant les puissantes bibliothèques de Flex. Normalement ce n’est pas possible. Nous allons expliquer comment contourner cette limite.

Principe

Le problème vient du mécanisme de chargement d’une application Flex  pour initialiser le Framework. Il est possible de reproduire ce mécanisme dans une application Flash une fois qu’on a compris son principe.

Voici le principe :

  • Compiler une application Flex contenant le formulaire (ou tout autre application) pour obtenir un fichier SWF.
  • Charger le fichier SWF de l’application Flex dans l’application Flash.
  • Attendre la fin de l’initialisation de l’application Flex et récupérer l’objet application.
  • Utiliser l’objet application pour interagir avec le formulaire.

Mise en œuvre

Classe utilitaire de chargement

Nous allons écrire une classe utilitaire dérivée de MovieClip qui permettra de charger l’application Flex, l’initialiser et enfin l’afficher.

La classe « Loader » du package flash.display est utilisée pour charger des fichiers swf et des images. La fonction load() de cette classe prend en paramètre un URLRequest qui prend en paramètre le chemin vers le fichier swf ou bien l’image à charger.

A partir de la propriété « contentLoaderInfo » de la classe Loader qui retourne un objet « LoaderInfo », nous pouvons avoir des informations sur le swf chargé. Les informations fournies incluent la progression du chargement, l’URL du chargeur et le contenu chargé, et le nombre d’octets de médias chargés.

L’objet LoaderInfo déclenche un événement lors du chargement de swf ou bien d’une image, cet événement peut être un « Event.COMPLETE » lorsque le chargement a réussi ou bien un « IOErrorEvent.IO_ERROR » lorsque le chargement échoue.

public function FlexAS3Loader(url:String)
{
__loader = new Loader();
var info:LoaderInfo = __loader.contentLoaderInfo;
info.addEventListener(Event.COMPLETE, onComplete);
info.addEventListener(IOErrorEvent.IO_ERROR , onIOError );
var urlRequest:URLRequest = new URLRequest(url);
var loaderContext:LoaderContext = new LoaderContext();
loaderContext.applicationDomain = ApplicationDomain.currentDomain;
__loader.load(urlRequest, loaderContext);
}

Une fois l’événement COMPLETE capté, l’objet Loader est ajouté au stage. Une fois ces procédures effectuées nous pouvons voir l’application Flex s’afficher dans le Flash player. Cependant nous n’avons pas encore accès aux différentes propriétés de l’application.

Une application Flex a deux « frames », la première est pour le chargement et il faut attendre la deuxième frame pour pouvoir faire référence à l’application et accéder aux différentes propriétés.

Pour cela, nous avons créé un objet de type MovieClip et nous lui avons affecté le contenu de Loader, et nous avons ajouté un listener «Event.ENTER_FRAME » sur cet objet.

private function onComplete(_evt:Event):void
{
addChild(__loader);
__loadedClip = __loader.content as MovieClip;
__loadedClip.addEventListener(Event.ENTER_FRAME, onFlexAppLoaded);
}

Cet événement va être capté deux fois parce que – comme nous l’avons déjà vu – une application Flex a deux frames. La deuxième fois que cet événement est capté nous aurons accès à l’application Flex.

private function onFlexAppLoaded(_evt:Event):void
{
//application is a property of mx.managers.SystemManager and it represents the application parented by the SystemManager
//The first time we enter this function the property application will be null and the second time application will contain the Flex application
if( __loadedClip.application != null )
{
__loadedClip.removeEventListener(Event.ENTER_FRAME, onFlexAppLoaded);
application = __loadedClip.application;
dispatchEvent(new Event("FlexAppLoadingDone"));
}
}
Exemple d’utilisation

Pour illustrer le chargement d’une application Flex dans une application Flash, nous avons créé un formulaire en Flex « FormulaireFlex.mxml ». Ce formulaire est chargé dans une application Flash « FormulaireFlexIntoAS3.as » en utilisant la classe « FlexAS3Loader.as » dont le fonctionnement a déjà été expliqué.

public function FormulaireFlexIntoAS3()
{
fal = new FlexAS3Loader("FormulaireFlex.swf");
addChild(fal);
fal.addEventListener("FlexAppLoadingDone", _onFlexAppLoaded);
}

Une fois le chargement du formulaire réussi, la classe FlexAS3Loader déclenche l’événement « FlexAppLoadingDone ».

Une fois les champs dans le formulaire saisis correctement un événement « showButton » est déclenché.

private function validChange(event:ValidationResultEvent):void
{
if(fname.text.length != 0 && dob.text.length !=0 && email.text.length != 0 && age.text.length != 0 && ssn.text.length != 0 && zip.text.length != 0 && phone.text.length != 0 && !valid)
{
dispatchEvent(new Event('showButton'));
valid = true;
}
}

Cet événement va être capté dans l’application Flash et un bouton sera affiché.

private function showButton(e:Event):void
{
button = new myButton();
button.y = 350;
button.x = 200;
button.addEventListener(MouseEvent.CLICK, initializeForm);
addChild(button);
}

Le click du bouton va réinitialiser le formulaire. Dans notre exemple nous accédons aux différents champs de formulaire à partir de l’application Flash et en les réinitialisant.

private function initializeForm(e:MouseEvent):void
{
fal.application.fname.text = "";
fal.application.dob.text = "";
fal.application.email.text = "";
fal.application.age.text = "";
fal.application.ssn.text = "";
fal.application.zip.text = "";
fal.application.phone.text = "";
}

Une façon plus simple de faire cela sera de déclencher un événement à partir de l’application Flash qui sera capté par l’application Flex. Cet événement sera responsable d’appeler une fonction qui va réinitialiser les champs de formulaire.

Téléchargement

Le code source du programme Flash
Le code source du Formulaire Flex

Conclusion

Cette méthode présente aussi l’avantage de retarder le chargement du Framework Flex dont le poids est souvent un frein à son utilisation dans un site à fort trafic par rapport à de l’AS3 pur.
On peut ainsi avoir le meilleur des deux mondes : une application AS3 très vite chargée à l’affichage du site, et des formulaires riches très vite développés qui sont chargés lorsque nécessaire.

Catégories: Notes Techniques
Mots-clefs :AS3, flash, Flex, Loader, SWF, SystemManager
  • yoann

    Bonjour,

    J’aimerai savoir comment faire pour ajouter un bouton par exemple au formulaire donné en exemple.

    Pour le moment avec la propriété AddChild a la propriété application j’obtiens l’erreur suivante.

    TypeError: Error #1007: Tentative d’instanciation sur un élément non constructeur.
    at mx.preloaders::Preloader/initialize()[E:\dev\gumbo_beta2\frameworks\projects\framework\src\mx\preloaders\Preloader.as:253]
    at mx.managers::SystemManager/http://www.adobe.com/2006/flex/mx/internal::initialize()[E:\dev\gumbo_beta2\frameworks\projects\framework\src\mx\managers\SystemManager.as:1923]
    at mx.managers::SystemManager/initHandler()[E:\dev\gumbo_beta2\frameworks\projects\framework\src\mx\managers\SystemManager.as:2412]

    Mon projet est en pure AS3

    Merci d’avance

  • http://kapit.fr Fadi Mansour

    Bonjour Yoan,

    La solution présentée ci-dessus est pour montrer comment faire pour communiquer entre un appication Flash et une application Flex. Du coup la création d’un composant à base du UIComponent coté Flash et de l’ajouter dans l’application Flex ne passera pas.

    Une solution sera de créer une fonction coté Flex par example:

    public function addButton(label:String, parent:String):void
    {
    var b:Button = new Button()
    b.label = label;
    this[parent].addChild(b);
    }
    

    label c’est le label à afficher dans le bouton et parent c’est l’id du composant parent où il faut ajouter le bouton.

    Coté Flash nous appelons cette fonction. Dans l’exemple ci-dessus nous ajouterons dans la fonction initializeForm la ligne suivante:

    fal.application.addButton('hello', 'myForm');
    

    J’espère avoir répondu à ta question.

  • kimlaw95

    Hello, merci pour l’exemple.
    J’ai une question spécifique flex.
    imaginons que tu es un DateField dans ton formulaire. Comment ferais-tu pour la réinitialiser ? j’ai essayé avec un DateField.selectedDate = null;
    mais quand je retourne sur la page j’ai une erreur de validation comme quoi la date est obligatoire.

    Merci

Article précédent
Article suivant
 
Haut de page

Copyright © 2009 Kap IT - Blog RIA - Kap Lab

Motorisé par Wordpress - Thème avec YAML par Kap IT