Comunidad de diseño web y desarrollo en internet online

¿Mi Array que no retorna?

Citar            
MensajeEscrito el 08 Jul 2008 05:47 am
Hola cristalab, esta noche me he truncado ya que tengo este problema. Bueno tengo una clase que carga un archivo xml, luego de cargarlo este lo pasa a un array , lo que deseo es recuperar los elementos del array en mi peli. Aqui les envio el script

Código :

package scripts.clases
{
   import flash.net.*;
   import flash.xml.*;
   import flash.events.*;
   public class nombres {
      private var direcciones:Array=new Array();
      private var xml:XML;
      public function nombres(){
         var cargar:URLLoader= new URLLoader();
         cargar.load(new URLRequest('xml/fotos.xml'));
         cargar.addEventListener(Event.COMPLETE,cargado);
      }
      public function cargado(event:Event):void{
         xml= new XML(event.target.data);
         enviar();
      }
      public function enviar():Array{
         for(var i:uint=0;i<xml.foto.length();i++){
            direcciones.push(xml.foto[i].direccion);
         }
         return direcciones;
      }
   }
}

Este script llamado 'nombres'
Bueno ahora lo que puse en flash en el panel de accion

Código :

import scripts.clases.nombres;
var fotos:nombres=new nombres();
var ubicaciones:Array= new Array()
ubicaciones=fotos.enviar();

el error que arroga es

Código :

TypeError: Error #1009: No se puede acceder a una propiedad o a un método de una referencia a un objeto nulo.
   at scripts.clases::nombres/enviar()
   at Practica11Galery_fla::MainTimeline/Practica11Galery_fla::frame1()

Bueno espero haber sido claro, graciasssssss .. chauu
seguire intentando rescatar mi array

Por FlexandFlash

48 de clabLevel



 

msie
Citar            
MensajeEscrito el 08 Jul 2008 10:01 am
Si llamas al método antes de que haya sido cargado el XML, la referencia del for es nula. Al separar funciones que debería cumplir una sola clase (sobre todo para operaciones asíncronas como carga de data externa) te complicas. con que hicieras:

var fotos:nombres=new nombres();

Debería ser suficiente

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 08 Jul 2008 10:14 am
Lo que podrias hacer es que la clase nombres extendiese de DispathEvent, y que la función cargado disparese un dispathEvent al estar listo el xml. Este evento lo detectarias desde fuera de la clase con un addEventListener y es ahi cuando ejecutas el enviar().
saludos

Por Zguillez

BOFH

10744 de clabLevel

85 tutoriales
17 articulos
3 ejemplos

Genero:Masculino   Bastard Operators From Hell Héroes Team Cristalab Editores

BCN

safari
Citar            
MensajeEscrito el 08 Jul 2008 04:14 pm
Gracias por sus respuestas, pero primero quisiera comentarles de que estuve intentadolo varias veces pero no tuve los resultados deseados ahora este el nuevo script 'nombres.as'

Código :

package scripts.clases
{
   import flash.net.*;
   import flash.xml.*;
   import flash.events.*;
   import flash.events.EventDispatcher;
   public class nombres {
      private var direcciones:Array=new Array();
      private var xml:XML;
      public function nombres(){
         var cargar:URLLoader= new URLLoader();
         cargar.load(new URLRequest('xml/fotos.xml'));
         cargar.addEventListener(Event.COMPLETE,cargado);
      }
      public function cargado(event:Event):void{
         xml= new XML(event.target.data);
         for(var i:uint=0;i<xml.foto.length();i++){
            direcciones.push(xml.foto[i].direccion);
         }
         trace (direcciones.length)
      }
      public function mostrar():Array{
         return direcciones;
      }
   }
}

como lo observaran el trace de la funcion cargado este script me bota 6;
ahora el codigo en el panel

Código :

import scripts.clases.nombres;
var fotos:nombres=new nombres();
var ubicaciones:Array= new Array()
ubicaciones=fotos.mostrar();
trace (ubicaciones.length)[quote]
y este trace de este me bota '0'; lo que significa que mi array direcciones se muere o pierde los datos despues de la funcion cargado, porque si invoco a trace dentro de esta funcion si me bota los correctos, pero cuando este es invocado desde la funcion mostrar este pierde los datos. Se supone que es una variable publica y que cuando la llame desde otra funcion deberia de mantener sus valores ya que se le cargo en una funcion ya invocada.

Bueno espero me expliquen porque pasa esto..
Ahora voy seguir las recomendaciones de Zguillez, y tambien te agradesco tu ayuda solisarg..
Bueno gracias amigos saber, que alguien te escucha es mas que suficiente y si puedes ayudarme mucho mejor...chau

[/quote]

Por FlexandFlash

48 de clabLevel



 

msie
Citar            
MensajeEscrito el 08 Jul 2008 04:17 pm
Gracias por sus respuestas, pero primero quisiera comentarles de que estuve intentadolo varias veces pero no tuve los resultados deseados ahora este el nuevo script 'nombres.as'

Código :

package scripts.clases
{
   import flash.net.*;
   import flash.xml.*;
   import flash.events.*;
   import flash.events.EventDispatcher;
   public class nombres {
      private var direcciones:Array=new Array();
      private var xml:XML;
      public function nombres(){
         var cargar:URLLoader= new URLLoader();
         cargar.load(new URLRequest('xml/fotos.xml'));
         cargar.addEventListener(Event.COMPLETE,cargado);
      }
      public function cargado(event:Event):void{
         xml= new XML(event.target.data);
         for(var i:uint=0;i<xml.foto.length();i++){
            direcciones.push(xml.foto[i].direccion);
         }
         trace (direcciones.length)
      }
      public function mostrar():Array{
         return direcciones;
      }
   }
}

como lo observaran el trace de la funcion cargado este script me bota 6;
ahora el codigo en el panel

Código :

import scripts.clases.nombres;
var fotos:nombres=new nombres();
var ubicaciones:Array= new Array()
ubicaciones=fotos.mostrar();
trace (ubicaciones.length)

y este trace de este me bota '0'; lo que significa que mi array direcciones se muere o pierde los datos despues de la funcion cargado, porque si invoco a trace dentro de esta funcion si me bota los correctos, pero cuando este es invocado desde la funcion mostrar este pierde los datos. Se supone que es una variable publica y que cuando la llame desde otra funcion deberia de mantener sus valores ya que se le cargo en una funcion ya invocada.

Bueno espero me expliquen porque pasa esto..
Ahora voy seguir las recomendaciones de Zguillez, y tambien te agradesco tu ayuda solisarg..
Bueno gracias amigos saber, que alguien te escucha es mas que suficiente y si puedes ayudarme mucho mejor...chau

Por FlexandFlash

48 de clabLevel



 

msie
Citar            
MensajeEscrito el 08 Jul 2008 04:24 pm
No ha sido cargado. Sigue el consejo de Zguillez y usa eventos para pasar la info

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 08 Jul 2008 04:34 pm
Lo que tienes que hacer es lo del dispatcher... asi te aseguras de no hacer la llamada antes de que el xml esté correctamente cargado y te devuelva el array a 0.

Código :

package scripts.clases
{
   import flash.net.*;
   import flash.xml.*;
   import flash.events.*;
   public class nombres extends EventDispatcher
   {
      private var direcciones:Array=new Array();
      private var xml:XML;
      public function nombres(){
         var cargar:URLLoader= new URLLoader();
         cargar.load(new URLRequest('xml/fotos.xml'));
         cargar.addEventListener(Event.COMPLETE,cargado);
      }
      private function cargado(event:Event):void{
         xml= new XML(event.target.data);
         for(var i:uint=0;i<xml.foto.length();i++){
            direcciones.push(xml.foto[i].direccion);
         }
       dispatchEvent(new Event("xmlCargado"));
      }
      public function mostrar():Array{
         return direcciones;
      }
   }
}


Código :

import  scripts.clases.nombres;
var fotos:nombres = new nombres();
var ubicaciones:Array = new Array();

fotos.addEventListener("xmlCargado", mostrar);
function mostrar(e:Event)
{
   ubicaciones = fotos.mostrar();
   trace(ubicaciones.length);
}

Por Zguillez

BOFH

10744 de clabLevel

85 tutoriales
17 articulos
3 ejemplos

Genero:Masculino   Bastard Operators From Hell Héroes Team Cristalab Editores

BCN

clabbrowser
Citar            
MensajeEscrito el 08 Jul 2008 04:53 pm
Gracias por la ayuda Zguillez y solisarg, pero al intentar mostrar el elmento 0 de mi array ubicaciones me muestra indefinido o undefined, que debo de hacer ahora..

Código :

import scripts.clases.nombres;
var fotos:nombres=new nombres();
var ubicaciones:Array= new Array()
fotos.addEventListener('arrayCargado',completo);
function completo(e:Event){
   ubicaciones=fotos.mostrar();
}
trace (ubicaciones[0]);

gracias ..por tan rapida respuesta..gracias Cristalab

Por FlexandFlash

48 de clabLevel



 

msie
Citar            
MensajeEscrito el 08 Jul 2008 04:56 pm
A ver... el trace ha de estar dentro de la función... si no lo estas ejecutando antes de que el array esté cargado...

Por Zguillez

BOFH

10744 de clabLevel

85 tutoriales
17 articulos
3 ejemplos

Genero:Masculino   Bastard Operators From Hell Héroes Team Cristalab Editores

BCN

clabbrowser
Citar            
MensajeEscrito el 08 Jul 2008 04:59 pm
Bueno ahora puese este codigo para rescatarlo

Código :

import scripts.clases.nombres;
var fotos:nombres=new nombres();
var ubicaciones:Array= new Array()
fotos.addEventListener('arrayCargado',completo);
function completo(e:Event){
   ubicaciones=fotos.mostrar();
   listado(ubicaciones);
}
function listado(lista:Array):void{
trace (lista[0]);
}

Entonces esto significa que la unica manera de poderlo recuperar es no sacandolo fuera de una funcion..o me equivoco.[/code]

Por FlexandFlash

48 de clabLevel



 

msie
Citar            
MensajeEscrito el 08 Jul 2008 05:02 pm
Pero se supone que la funcion completo ya lo ha cargado al array...y cuando se ejecute el trace ya el array esta cargado

Por FlexandFlash

48 de clabLevel



 

msie
Citar            
MensajeEscrito el 08 Jul 2008 05:21 pm

FlexandFlash escribió:

Pero se supone que la funcion completo ya lo ha cargado al array...y cuando se ejecute el trace ya el array esta cargado

Por colocar el trace debajo de la función no quiere decir que se ejecute con el array ya cargado.. ese es el problema. El trace (o cualquier acceso que quieras tener hacia el array) has de colocarlo dentro de la función "completo" (o que se ejecute a partir de esa función) que es cuando realmente el array está cargado y accesible.

Por Zguillez

BOFH

10744 de clabLevel

85 tutoriales
17 articulos
3 ejemplos

Genero:Masculino   Bastard Operators From Hell Héroes Team Cristalab Editores

BCN

clabbrowser
Citar            
MensajeEscrito el 08 Jul 2008 05:54 pm
Ok, gracias Zguillez..lo tendre siempre en cuenta es que imgine que por ser una variable, ademas el addEventListner, lo habia ejecutado antes del trace habia cargado la variable y que esta estuviera disponible fuera de la funcion...bueno graciasss, y habria forma de que este disponible fuera de esa funcion despues de cargada, y como saber que ya este cargada..eso es todo..chauuu una vez mas gracias Cristalab.

Por FlexandFlash

48 de clabLevel



 

msie

 

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