Comunidad de diseño web y desarrollo en internet online

Pasar valor de Flex a SWF

Citar            
MensajeEscrito el 15 Sep 2009 12:52 am
Hola a todos!
Resulta que estoy haciendo un pequeño programita en Flex. Tengo un SWFLoader en el que he cargado un SWF que contiene dos botones y un campo de texto. Lo que hacen los botones es interactuar con Flex para que mediante una serie de funciones y demas se pueda: con uno guardar lo que hay en el campo de texto en un archivo, abriendose un cuadro de dialogo para elegir lugar donde guardarlo y nombre. Y con el otro boton lo que quiero es cargar el .txt que quiera en el campo de texto, es decir, que una vez pinchamos se abra el cuadro de dialogo, se elija el archivo que se quiere cargar y se acepte.
Me funciona el primero (el de salvar) a la perfeccion, pero con el segundo tengo un pequeño problema.
Resulta que la primera vez que cargo un archivo, el contenido lo cargo en una variable de tipo string. Al flash le digo que la lea, pero creo que la lee demasiado pronto, porque no carga lo que tiene que cargar, carga lo anterior. Lo se porque si no ha cargado nada y vuelvo a darle al boton de cargar, lee la variable y pone lo que hay que poner mientras yo estoy con el cuadro de dialogo. Diciendolo de otro modo, para cargar el contenido de un archivo tengo que elegir el archivo, aceptar, volver a darle a cargar y cancelar (porque no quiero cargar otro archivo o el mismo).

Aqui os pongo el codigo que estoy usando, aunque no todo, faltan unas clases que tengo en .as

Codigo de Flex:

Código Flex :

<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="253" height="302" borderColor="#B05656" backgroundGradientAlphas="[1.0, 1.0]" backgroundGradientColors="[#D18282, #D18282]">
   <mx:SWFLoader source="prueba2.swf" y="10" width="140" height="231" horizontalCenter="0">
   <mx:Script>
      <![CDATA[
         import com.zigzah.utils.*; 
         [Bindable]
         public var mensaje:String = ""; 
         
         public function ponerTexto():void
         {
         var ba:ByteArray = new ByteArray(); 
               ba.writeUTFBytes(mensaje); 
               var fsaver:FileSaver = new FileSaver (ba); 
               fsaver.save("newtxt.txt","savedTXT"); 
         }
            
             [Bindable]
             public var cf:String = "kk";
             
            public function load ():void 
            { 
               var ff:FileFilter = new FileFilter ("txt" , "*.txt"); 
               var fldr:FileLoader = new FileLoader (ff , "loadedTXT"); 
               fldr.getBytes(); 
               fldr.addEventListener(LoadFileEvent.BYTES_LOADED,loadHandler); 
            } 
             
            private function loadHandler (event:LoadFileEvent):void 
            { 
                
               var ba:ByteArray = event.bytes; 
               cf = ba.readUTFBytes(ba.length);
            } 
      ]]>
   </mx:Script>   
   </mx:SWFLoader>
   <mx:Label id="resultado" fontWeight="bold" fontSize="12" color="#FBFCFC" width="200" verticalCenter="109" x="25.5" height="65"/>   
</mx:WindowedApplication>


Codigo de AS3:

Código ActionScript :

btnguardar.addEventListener(MouseEvent.CLICK, guardar);
btncargar.addEventListener(MouseEvent.CLICK, cargar);

function guardar(evento:MouseEvent):void {
   root.parent.parent['parentApplication']['mensaje'] = texto.text;
   root.parent.parent['parentApplication'].ponerTexto();
}

function cargar(evento:MouseEvent):void {
   root.parent.parent['parentApplication'].load();
   texto.text = root.parent.parent['parentApplication']['cf'];
}
stop();


Bueno, pues eso, lo que me gustaria saber es una manera de pasarle el contenido sin tener que volver a apretar el boton.
A ver si alguien me puede ayudar.
Muchas gracias. :P

Por SeiyaJapon

54 de clabLevel



 

España

firefox
Citar            
MensajeEscrito el 15 Sep 2009 01:44 pm
Estas cargando y usando inmediatamente el contenido sin esperar que realmente se carga (por eso ves lo anterior) El loadHandler indica cuando se ha leído ... intenta por ejemplo agregar un listener a Application y disparar un evento cuando termine de cargar

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 15 Sep 2009 10:24 pm
Te pido disculpas, pero no acabo de entender a que te refieres :?
Supongo que sera porque hace poco que estoy trabajando con AS3 y lo de los listener me tiene un poco verde.
¿Te refieres que lo ponga en el codigo de Flex o en el de Flash?
Y luego hay algo que si que me gustaria comprender para poder hacerlo: Si un listener necesita como primer parametro una instancia y si ya he instanciado al boton para cargar con el listener para que ejecute el load ¿puedo darle al mismo boton otro listener? ¿y como se que la variable cf tiene ya la carga?
Son cosas con las que nunca he trabajado y que no conozco.

Por SeiyaJapon

54 de clabLevel



 

España

firefox
Citar            
MensajeEscrito el 16 Sep 2009 10:45 am
A ver si lo digo mas simple:

Código ActionScript :

root.parent.parent['parentApplication'].load(); 
//sin dar tiempo a cargar enseguida asigno, nomal que salga undefined
texto.text = root.parent.parent['parentApplication']['cf']; 


Entonces mejor uso un listener

Código ActionScript :

root.parent.parent['parentApplication'].addEventListener(Event.COMPLETE, show)
function show(evt:Event):void{
  texto.text = root.parent.parent['parentApplication']['cf']; 
}


Que desde Flex disparo

Código ActionScript :

private function loadHandler (event:LoadFileEvent):void  
            {  
                 
               var ba:ByteArray = event.bytes;  
               cf = ba.readUTFBytes(ba.length); 
               dispatchEvent(new Event(Event.COMPLETE))
            }  


Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 16 Sep 2009 11:45 am
De acueeeeerdo...
Ahora creo que comprendo como funciona el evet.COMPLETE y el dispatchEvent... Lo estube intentando con COMPLETE pero no sabia que tenia que poner dispatchEvent. Mucha gracias!
Voy a ver si funciona!

Por SeiyaJapon

54 de clabLevel



 

España

firefox
Citar            
MensajeEscrito el 16 Sep 2009 11:54 am
Ha funcionado a la perfeccion!!
Mucha gracias, porque ademas he comprendido como lanzar el evento y como saber captarlo.
Saludos!

Por SeiyaJapon

54 de clabLevel



 

España

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.