Comunidad de diseño web y desarrollo en internet online

Ayuda con un script de lo más tonto

Citar            
MensajeEscrito el 13 Nov 2007 01:35 pm
Hola a todos.

Acabo de empezar con AS3 y POO, y me gustaría que me pudierais decir qué falla de este script (se que es una stupidez de script, pero yo no veo donde falla).

Comencé a hacer un book digital interactivo, para mandar con mis trabajos a los clientes y agencias, y pensé en hacer algunas clases que voy a poder reutilizar.

Tengo una clase que, dado un string que es una ruta de carpetas, carga y devuelve un xml que se encuentra en la carpeta especificada:



Código :

public class gestion
         {
            public function gestion() :void {}
            import flash.events.Event;
            import flash.net.URLLoader;
            import flash.net.URLRequest;
            
               
            
            static function cargaXML(carpeta:String) :XML
               {
                  /*busca el archivo en la carpeta especificada y lo devuelve como XML de flash*/
                  var ruta:URLRequest = new URLRequest(carpeta);
                  var loader:URLLoader = new URLLoader;
                  var listaXML:XML = new XML;
                  loader.load(ruta);
                  loader.addEventListener(Event.COMPLETE, completo)
                  function completo(evento:Event) :void
                     {
                        var loader:URLLoader = evento.target as URLLoader;
                        if (loader != null)
                           {
                              listaXML = new XML(loader.data);
                           }
                           else
                           {
                              trace("loader is not a URLLoader!");
                           }
                           
                     }
                  
                  return listaXML;
                  
               }





este es el codigo en el fla una vez importada la clase:

Código :

var gestionador:gestion = new gestion;
var contenido:XML =gestionador.cargaXML("trabajos/lista.xml");

trace(contenido.foto[0].genero[0]);




lo cual me devuelve el siguiente error:

TypeError: Error #1010: Un término no está definido y no tiene propiedades.
at interface_fla::MainTimeline/interface_fla::frame2()

El error, creo entender que se da porque el método de la clase no devuelve el xml cargado, pero dentro de la funcion llamada por el evento COMPLETE, sí carga el XML. ¿como es que la clase no devuelve el XML?

Y bueno esa es la duda que tengo, gracias de antemano por la ayuda, pero sobre todo por la existencia de esta web.

PD: Otra cosa; el comando trace ejecutado desde una clase en un .AS no aparece en la salida del .fla, ¿debería? Me sería de gran utilidad.

Por chaosburn

20 de clabLevel



Genero:Masculino  

Alicante-España

firefox
Citar            
MensajeEscrito el 13 Nov 2007 04:47 pm
1) la función "cargaXML" la debes declarar publica y no estatica.
2) La función "Completo" de tu clase se ejecuta cuando se termina de cargar el XML, por lo que "listaXML" es nulo cuando termina de contruir el objeto, por lo que te recomiendo hacer lo siguiente:

a) en el codigo del fla, donde importas la clase, crea una función que mostrara el contenido del XML cargado, y se mandara a llamar, una vez que se haya cargado el XML

Código :

var gestionador:gestion = new gestion;
gestionador.cargaXML("trabajos/lista.xml");
function ProcesaXML (contenido:XML) {
     trace(contenido.foto[0].genero[0]);
}

b) modifica el constructor de tu clase para que reciba como parametro la instancia del clip que contiene la función "ProcesaXML"

c) modifica la función "Completo" de tu clase para que mande a llamar la función ProcesaXML

Código :

class gestion         {
            import flash.events.Event;
            import flash.net.URLLoader;
            import flash.net.URLRequest;
            var Padre:DisplayObject;
            public function gestion(obj:DisplayObject) :void {
                  Padre = obj;
            }
            public function cargaXML(carpeta:String) :void  {
                  /*busca el archivo en la carpeta especificada y lo devuelve como XML de flash*/
                  var ruta:URLRequest = new URLRequest(carpeta);
                  var loader:URLLoader = new URLLoader;
                  var listaXML:XML = new XML;
                  loader.load(ruta);
                  loader.addEventListener(Event.COMPLETE, completo);
                  function completo(evento:Event) :void  {
                        var loader:URLLoader = evento.target as URLLoader;
                        if (loader != null)                           {
                              listaXML = new XML(loader.data);
                              Padre.ProcesaXML(listaXML);
                        }            else      {
                              trace("loader is not a URLLoader!");
                        }
                  }
        }

Espero que te sirva, y nos cuentas.

Por gabynufe

Claber

446 de clabLevel



 

México, D.F.

msie7
Citar            
MensajeEscrito el 13 Nov 2007 04:55 pm
esta mal tu clase, tendría que ser algo así:

Código :

package { //Gestion.as
   import flash.display.MovieClip;
   import flash.events.Event;
   import flash.net.URLLoader;
   import flash.net.URLRequest;
   
   public class Gestion extends MovieClip {
      private var ruta:URLRequest;
      private var loader:URLLoader;
      private var listaXML:XML;
      
      public function Gestion() { //el constructor no necesita tipo de dato de regreso
         cargaXML("ruta/del/XML.xml");
      }
      private function cargaXML(carpeta:String):XML {
         ruta = new URLRequest(carpeta);
         loader = new URLLoader(ruta);
         loader.addEventListener(Event.COMPLETE, completo)
      }
      private function completo(evento:Event):void {
         listaXML = new XML(evento.data);
         trace(contenido.foto[0].genero[0]);
      }
   }
}


y en tu .fla, en el Document Root ya solo pones Gestion y pruebas tu pelicula.

Saludos!

Por master_of_puppetz

Claber

2483 de clabLevel

7 tutoriales
3 articulos

Genero:Masculino   Premio_Secretos

WebDev (Flex + PHP + JS)

firefox
Citar            
MensajeEscrito el 13 Nov 2007 08:44 pm
gracias por la respuesta gabynufe.

He probado el código que me has pasado, y me da un error, pero creo que se a qué se debe:
"Llamada a un método procesaXML posiblemente no definido mediante una referencia con tipo estático flash.display:DisplayObject."

El caso es que la clase se ejecuta desde el root, no se eso influye, pero he probado a meter el código en un clip y da el mismo error.

Por chaosburn

20 de clabLevel



Genero:Masculino  

Alicante-España

firefox
Citar            
MensajeEscrito el 14 Nov 2007 01:47 pm

Código :

var Padre:MovieClip;
public function gestion(obj:MovieClip) :void {
       Padre = obj;
}

y cuando creas el objeto

Código :

var gestionador:gestion = new gestion(MovieClip(this));

Por gabynufe

Claber

446 de clabLevel



 

México, D.F.

msie7
Citar            
MensajeEscrito el 15 Nov 2007 03:42 am
Muchísimas Gracias, ha funcionado perfectamente.

Yo estaba intentándolo poniendo lo siguiente, pero claro no funcionaba:

var gestionador:gestion = new gestion(this);

Muchas gracias por todo, aunque lo más seguro que me surjan más dudas, porque estoy muy verdecillo. Cuando tenga la aplicación hecha la colgare.

Saludoss

Por chaosburn

20 de clabLevel



Genero:Masculino  

Alicante-España

firefox
Citar            
MensajeEscrito el 20 Nov 2008 12:09 pm
Pue s ami no me funciona me dice ....

1046: No se encontró el tipo o no es una constante en tiempo de compilación: MovieClip.

:(

Por Trodi

3 de clabLevel



 

firefox
Citar            
MensajeEscrito el 20 Nov 2008 02:49 pm
Trodi, es que tienes que añadir

Código ActionScript :

!import flash.display.MovieClip;

En cualquier modo, Chaos, no me gusta demasiado tu clase (funciona y es lo importante). El modo de plantear una clase es que sea "transparente". Así que, yo hubiera planteado la clase al estilo de Master of Puppetz. Claro, que cuando acabe de cargar, "dispacharía un evento". De ese modo sólo habría que, en tu película principal, escuchar ese evento. Cuando se capture, preguntaremos por el listaXML -para lo cual habrá que hacerse un método-

Por Eliseo2

710 de clabLevel



 

firefox

 

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