Comunidad de diseño web y desarrollo en internet online

Titlewindow, textinput y demas vainas

Citar            
MensajeEscrito el 01 Abr 2009 06:08 pm
Prometo que lo he intentado muy mucho, he buscado y requetebuscado, pero entre q no me entero de lo largas y raras q son las explicaciones de adobe, he buscado en ingles, en español, de todo tipo, pero aunque se que sera algo muy basico, no he encontrado nada :S

Mi duda es la siguiente, en una aplicacion tengo una popup, un titlewindow con un mx:textinput que pide al usuario cual quiere que sea su nuevo nombre. Por detras, en su parent, esta todo preparado para hacer un cambios.cambionombre('TALTALTAL'); pero no doy conseguido que en usuario.text (que en el titlewindow si se muestra correctamente, pero en el titlewindow no puede ejecutar el cambios.cambionombre) llegue a la parent!!!!

Hasta ahora, mas o menos iba zafando utilizando application.application.funcion, pero ahora necesito que llegue ese dato (el TALTALTAL que escribe el usuario) y no da llegadoooooooooooo

Socorro :(

Por PimPamPum

14 de clabLevel



 

chrome
Citar            
MensajeEscrito el 01 Abr 2009 06:32 pm
Las explicaciones de adobe no las encuentro rara, pero la tuya sí.

No entendí tu problema.

Por w00p

24 de clabLevel



 

safari
Citar            
MensajeEscrito el 01 Abr 2009 06:42 pm
Jejeje. Si es q nunca me se explicar, defecto del animal :P

A ve, tengo la aplicacion principal, con todo ya bien montado, etc. Esta todo cargado y perfecto funcionando bla bla bla.
De esa principal, salen varias titlewindows con informacion, y tonterias asi. Como hasta ahora siempre habia usado funciones estaticas, quien tiene todo cargado es principal.mxml, los titlewindow tienen cargado el popupmanager, mx.application y poco mas.

Hasta ahora, si queria hacer que "algo" fuera lo que fuera se ejecutara, como siempre eran rutinas estaticas, las declaraba en principal.mxml y desde por ejemplo los botones de una de las titlewindows, simplemente hacia una llamada de Application.application.funcion.

Pero ahora la cosa se complica, ya que quiero pedir al usuario datos. En este caso, un nombre. Tengo una funcion que es la que se encarga de ello desde el principal, cambios.cambionombre, que funciona perfectamente... solo en la principal. Si intento ponerla en cualquier titlewindow me dice que me vaya a freir esparragos.

Lo que quiero, es que un popup donde tengo 3 campos, pasen el resultado del textinput (por ejemplo uno de los campos es nombre) y que pase el resultado de nombre.text a la principal, pero no consigo que llegue. En el popup esta bien, ya que le meti un par de alerts a ver si es q estaba metiendo la pata, pero en ellos me muestra lo que se ha escrito perfectamente, la cuestion es que a la principal... no llega.

Los eventos no los controlo absolutamente nada, por eso ni siquiera se si estoy diciendo una tonteria, y no puedo poner 3 textinputs con una funcion distinta cada uno en el mismo popup, pero la verdad es q me estoy volviendo loco, porque no me llega a la principal ni con uno, ni con dos, ni con cincuenta :S.

Si no me entendiste te lo explico otra vez, nunca me explico bien jejeje

Por PimPamPum

14 de clabLevel



 

chrome
Citar            
MensajeEscrito el 01 Abr 2009 06:47 pm
Incluso mira, con saber como podria hacer que nombre.text se convirtiera en un var global, para poder llamarlo directamente desde alli, creo que apañaria perfectamente...

Por PimPamPum

14 de clabLevel



 

chrome
Citar            
MensajeEscrito el 01 Abr 2009 07:20 pm
Hola PimPamPum, como estas?

Bueno, la idea de comunicacion entre un popup y un componente de flex (ya sea el application o no) se debe hacer de 2 maneras, por intermedio de eventos, o bien llamando directametne a una funcion de este componente (sea el padre o no) esto se puede hacer con la ayuda de una tecnica llamada "depency injection".

Como decis q no manejas eventos, te explico en un ejemplo bien claro como hacerlo de la otra manera.

Lo primero q necesitas es ahcer un contrato de comunicacion, eso se hace por intermedio de interfaces, o sea declaras la manera en q un componente puede ser usado por otros (explicado muy a grandes rasgos) (aca una mejor explcacion de las interfaces http://foros.cristalab.com/no-entiendo-las-interfaces-t69382/

com.ISetUserData (/com/ISetUserData.as)

Código ActionScript :

package com
{
   public interface ISetUserData
   {
      function setData(userName:String, userAge:Number):void;
   }
}


Ahora creamos el formulario para el popup

com.UserDataPopUp (com/UserDataPopUp.mxml)

Código ActionScript :

<?xml version="1.0" encoding="utf-8"?>
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" width="400" height="300">

   <mx:Script>
      <![CDATA[
         import mx.controls.Alert;
         import mx.core.UIComponent;
         
         public var targetParent:ISetUserData;
         
         public function onSubmit():void
         {
            if (targetParent == null)
               Alert.show("No se q hacer", "Atencion!");
            
            targetParent.setData(this.nombre.text, Number(this.edad.text));
         }
      ]]>
   </mx:Script>
   <mx:Form>
      <mx:FormItem label="Nombre:" >
         <mx:TextInput id="nombre" />
      </mx:FormItem>
      <mx:FormItem label="Edad:" >
         <mx:TextInput id="edad" restrict="0-9" />
      </mx:FormItem>
      <mx:FormItem label="" >
         <mx:Button label="Submit" click="onSubmit();" />
      </mx:FormItem>
   </mx:Form>
</mx:Canvas>


Y ahroa la aplicacion

Código ActionScript :

<?xml version="1.0" encoding="utf-8"?>
<mx:Application 
   xmlns:mx="http://www.adobe.com/2006/mxml" 
   layout="absolute"
   implements="com.ISetUserData">
   
   <mx:Script>
      <![CDATA[
         import mx.managers.PopUpManager;
         import com.ISetUserData;
         import com.UserDataPopUp;
         import mx.controls.Alert;
         
         private var userData:UserDataPopUp;
         
         public function setData(userName:String, userAge:Number):void
         {
            PopUpManager.removePopUp(userData);
            Alert.show("UserName: "+userName+"\nUserAge: "+userAge, "Promt");
         }
         
         private function onOpen():void
         {
            userData = new UserDataPopUp();
            userData.targetParent = this as ISetUserData;
            PopUpManager.addPopUp(userData,this, true);
            PopUpManager.centerPopUp(userData);
         }
      ]]>
   </mx:Script>
   
   <mx:Button label="Abrir Popup" click="onOpen();" />
</mx:Application>



Como ves, el componente application implenta la interfaz, o sea, el contrato. Cuando abre el popup le pasa a este una referencia a si mismo (se deveria trata de no usar nunca el Application.application). Fijate q la variable en donde se setea es del tipo de la interfaz, por lo tanto este componente podes utilizarlo en cualqueir lado (aumenta la reutilizacion) y luego desde el popup llamamos a la funcion q especificamos en la interfaz.

Como veras es muy sencillo, create un proyecto neuvo y copiate los archivos vas a ver q anda de maravillas...

Espero q te sirva y cualquier cosa avisa

Saludos!

Por alfathenus

833 de clabLevel

5 tutoriales

 

buenos aires || Argentina

firefox
Citar            
MensajeEscrito el 01 Abr 2009 08:09 pm
:( ... Como com.ISetUserData me dice que ni pagandole encuentra la interfaz... (Y se que esta ahi que la he visto!)
He probado tb a cambiarle en vez de com, el package y todo eso, a otro... pero me dio error 1144 ... y tengo flex3 :S

Lo de los eventos es mu complicao?

Asias por intentarlo de todas formas jejeje

Por PimPamPum

14 de clabLevel



 

chrome
Citar            
MensajeEscrito el 01 Abr 2009 08:26 pm
Estem...yo tengo el proyecto con ese codigo y funciona... como estas copiando el codigo?

Mira, primero create una carpeta dntro de rsc q se llame "com", luego dentro de esta crea un archivo de interfaz con elnombre ISetUserData y dentro de el copia el texto q puse. Luego dentro de esa carpeta com, crea un componente q se llame UserDataPopUp y copia dentro de el el texto del componente q puse, y ahora en el application borra todo y copia el texto q puse para el application.

Haciendo eso te va a funcionar.

Saludos!

Por alfathenus

833 de clabLevel

5 tutoriales

 

buenos aires || Argentina

firefox
Citar            
MensajeEscrito el 01 Abr 2009 11:43 pm
Si si si si si si si si, lo siento, tienes toda la razon del mundo!

Si te digo que se me fue, y cree la carpeta donde no era... Vamos, q hasta q no lo hice de nuevo no me di cuenta lo siento!
Ademas que no se si importa o no, pero lo habia puesto como actionscript en vez de seleccionar archivo de interfaz!

Ahora ya va perfecto a las mil maravillas, eres mi nuevo dios :P

Lo dicho, miles de asias!

Por PimPamPum

14 de clabLevel



 

chrome
Citar            
MensajeEscrito el 11 Abr 2009 09:02 pm
Hola...
Uffff esto de las clases, interfaces, unos herdan de otros cuando no heredan e implementan a la vez ...... vaya lio pero junto con los eventos es la base de AS3 asi que no queda otro remedio que entenderlo.

alfathenus escribió:


Bueno, la idea de comunicacion entre un popup y un componente de flex (ya sea el application o no) se debe hacer de 2 maneras, por intermedio de eventos, o bien llamando directametne a una funcion de este componente (sea el padre o no) esto se puede hacer con la ayuda de una tecnica llamada "depency injection".

Como dices en tu magnifica respuesta-explicacion tambien se puede hacer con eventos, ¿podrias poner un ejemplo de como hacerlo con eventos?

Gracias

Por willow001

52 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 13 Abr 2009 09:19 pm
Hola willow, aca te paso un ejemplo en donde podes probar la comunicacion de las dos maneras


La misma interface
com.ISetUserData (com/ISetUserData.as)

Código ActionScript :

package com
{
   public interface ISetUserData
   {
      function setData(userName:String, userAge:Number):void;
   }
}


El evento que vamos a lanzar para la comunicacion
com.events.UserDataEvent(com/events/UserDataEvent.as)

Código ActionScript :

package com.events
{
   import flash.events.Event;

   public class UserDataEvent extends Event
   {
      static public const USER_DATA_COMMIT:String = "user_data_commit";
      
      public var nombre:String;
      public var edad:Number;
      
      public function UserDataEvent(type:String, nombre:String, edad:Number, bubbles:Boolean=false, cancelable:Boolean=false)
      {
         super(type, bubbles, cancelable);
         this.nombre = nombre;
         this.edad = edad;
      }
      
   }
}


Compenente a abrir en el popup
com.UserDataPopUp(com/UserDataPopUp.mxml)

Código ActionScript :

<?xml version="1.0" encoding="utf-8"?> 
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" width="400" height="300"> 
 
   <mx:Script> 
      <![CDATA[
         import com.events.UserDataEvent; 
         import mx.controls.Alert; 
         import mx.core.UIComponent; 
          
         public var targetParent:ISetUserData; 
          
         public function onSubmit():void 
         { 
            if (targetParent == null) 
               Alert.show("No se q hacer", "Atencion!"); 
             
            targetParent.setData(this.nombre.text, Number(this.edad.text)); 
         }
         public function onSubmitEvento():void 
         { 
            if (targetParent == null) 
               Alert.show("No se q hacer", "Atencion!"); 
             
            //targetParent.setData(this.nombre.text, Number(this.edad.text));
            this.dispatchEvent(new UserDataEvent(UserDataEvent.USER_DATA_COMMIT, this.nombre.text, Number(this.edad.text))); 
         }
         
      ]]> 
   </mx:Script> 
   <mx:Form> 
      <mx:FormItem label="Nombre:" > 
         <mx:TextInput id="nombre" /> 
      </mx:FormItem> 
      <mx:FormItem label="Edad:" > 
         <mx:TextInput id="edad" restrict="0-9" /> 
      </mx:FormItem> 
      <mx:FormItem label="" direction="horizontal" > 
         <mx:Button label="Submit" click="onSubmit();" />
         <mx:Button label="Submit por evento" click="onSubmitEvento();" />  
      </mx:FormItem> 
   </mx:Form> 
</mx:Canvas>


Y el application

Código ActionScript :

<?xml version="1.0" encoding="utf-8"?> 
<mx:Application  
   xmlns:mx="http://www.adobe.com/2006/mxml"  
   layout="absolute" 
   implements="com.ISetUserData"> 
    
   <mx:Script> 
      <![CDATA[
         import com.events.UserDataEvent; 
         import mx.managers.PopUpManager; 
         import com.ISetUserData; 
         import com.UserDataPopUp; 
         import mx.controls.Alert; 
          
         private var userData:UserDataPopUp; 
          
         public function setData(userName:String, userAge:Number):void 
         { 
             this.closePopUp();
             this.viewData(userName, userAge);
         }
         public function onUserDataCommit(event:UserDataEvent):void
         {
            this.closePopUp();
            this.viewData(event.nombre, event.edad);
         }
         public function closePopUp():void
         {
            PopUpManager.removePopUp(userData);
         }
         
         public function viewData(userName:String, userAge:Number):void
         {
            Alert.show("UserName: "+userName+"\nUserAge: "+userAge, "Promt");
         }
         
         private function onOpen():void 
         { 
            userData = new UserDataPopUp(); 
            userData.targetParent = this as ISetUserData; 
            userData.addEventListener(UserDataEvent.USER_DATA_COMMIT, onUserDataCommit);
            PopUpManager.addPopUp(userData,this, true); 
            PopUpManager.centerPopUp(userData); 
         } 
      ]]> 
   </mx:Script> 
    
   <mx:Button label="Abrir Popup" click="onOpen();" /> 
</mx:Application>



Espero q les sirva, saludos!

Por alfathenus

833 de clabLevel

5 tutoriales

 

buenos aires || Argentina

firefox
Citar            
MensajeEscrito el 14 Abr 2009 12:41 pm
Hola...
Muchas gracias por tu ejemplo alfathenus, he visto algunos detalles que se me escapaban cuando intentaba hacerlo.
Perfecto, te debo unas :beer: :beer: :beer:

Gracias

Por willow001

52 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 16 Abr 2010 07:21 pm
que onda bro, muy bueno tu codigo
lo acabo de probar y corre de maravilla.

veo que el contenido de las cajas en la popUp lo pasas a unas variables
y despues esas variables las imprimes en el Alert.

ahora como puedo hacerle para que en vez que me imprima las variables en el Alert las inserte en un TextInput sobre
la aplicacion principal?

ej.

En vez de llamar a la funcion e imprimir los datos en el Alert

public function setData(userName:String, userAge:Number):void
{
PopUpManager.removePopUp(userData);
Alert.show("UserName: "+userName+"\nUserAge: "+userAge, "Promt");
}

Que imprima los datos en cajitas de texto, asi mas o menos

public function DatosRegresados(usarName:String, userAge:Number):void{
PopUpManager.removePopUp(userData);
nombrecaja.text=userName; ??????????? <--Aqui es donde no se como hacerlo
}

Me manda un error de Acceso a una propiedad userName no definida...

Espero me puedan ayudar un poco.

Saludos

Alfredo

Por iekzaer

7 de clabLevel



 

chrome
Citar            
MensajeEscrito el 06 May 2010 04:33 am
Hola, yo he tenido el mismo problema de comunicación. Con el debido respeto hacia ustedes pero tanto problema por un PopUp me parece que es unac cochinada, que los desarrolladores de flex no piensan en eso?

que pena pero enserio es una cochinada me ha tenido toda una tarde y nada.

Por alejandro-mosquera

0 de clabLevel



 

chrome

 

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