Comunidad de diseño web y desarrollo en internet online

Ambito Variables --> Novato

Citar            
MensajeEscrito el 15 Feb 2007 01:52 pm
Hola, soy programador con experiencia pero novato en ActionScript, además de nuevo en el foro. Tengo una duda que no encuentro respuesta. Mi idea es cargar un XML y los datos almancenarlos en un array para tratarlos y mostrarlos, pero me ocurre lo siguiente:
- Creo el Array
- Cargo el xml
- Hago el trace del array y me dice undefined
- Hago el trace del array dentro de la función que carga el xml y me devuelve el dato que quiero.
Creo que es un problema de ámbito de la variable, que se pierde y mira que la tengo declarada _global.

Aqui el código:

Código ActionScript :

//Nos aseguramos que se muestren bien los acentos
System.useCodepage = true;

_global.formatos = new Array();

//Creamos el objeto que guardará los datos del archivo XML
formatosXML = new XML();
formatosXML.ignoreWhite = true;

//Cargamos el archivo XML en el objeto recién creado
formatosXML.load("Formatos.xml");

//Cuando termina de cargar lo mandamos a organizar para poder mostrar los datos
formatosXML.onLoad=organizarXML;

function organizarXML(formato){
   
   //=========FORMATOS
   //Primer bucle para buscar formatos revisando todos los primeros nodos
   for (yy=0;yy<formatosXML.firstChild.childNodes.length;yy++){
      //Creamos un objeto para guardar los datos
      format = new Object();
      format.id = formatosXML.firstChild.childNodes[yy].childNodes[0].firstChild.nodeValue;
      format.nombre = formatosXML.firstChild.childNodes[yy].childNodes[1].firstChild.nodeValue;
      
      //Agrego el objeto al array de Formatos
      formatos.push(format);
         
      //Elimino el objeto
      delete format;
                                                      
   }

}
trace (formatos[0].nombre);


Si no se puede hacer de esta manera, ¿cómo se actua en estos casos? es decir, ¿cómo cargo un array para poder usarlo en otras funciones desde una función distinta?

Thanks

[zah]Usa las etiquetas code para postear código[/zah]

Por omoyo11

2 de clabLevel



 

msie7
Citar            
MensajeEscrito el 15 Feb 2007 02:13 pm

omoyo11 escribió:

Código :

//Elimino el objeto 
delete format;


:? :?

Por dmvalverde

150 de clabLevel



Genero:Masculino  

Extremadura

opera
Citar            
MensajeEscrito el 15 Feb 2007 02:45 pm
Hola, gracias por la respuesta, pero no es eso, puesto que elimino el objeto Format, que ya tengo cargado en el array Formatos. Sé que puede llegar a confundir el nombre de las variables, pero son distintas, una es Formatos --> ARRAY y la otra es Format --> Objeto

Gracias y sigo a la espera

Por omoyo11

2 de clabLevel



 

msie7
Citar            
MensajeEscrito el 15 Feb 2007 03:22 pm
ok, el código funciona correctamente.

El problema de que no puedas ver el trace() fuera de la función es la asincronía de flash: cuando se hace la función load del XML se sigue ejecutando el código que le sigue (en este caso el trace()) mientras en otro hilo de ejecución se está cargando el XML. Puede darse el caso de que se ejecute antes el trace() que la función del onLoad del XML por lo que el array dara undefined ya que no se le han asignado ningún dato.

Prueba a poner el trace tambien dentro de la función y ya veras como el que te indica undefined sale antes que el que te da el valor correcto.

Por dmvalverde

150 de clabLevel



Genero:Masculino  

Extremadura

opera
Citar            
MensajeEscrito el 15 Feb 2007 03:49 pm
Es cierto, muchas gracias, pero... como se corrige eso? qué puedo hacer?

Gracias

Por omoyo11

2 de clabLevel



 

msie7
Citar            
MensajeEscrito el 15 Feb 2007 04:18 pm
No hay nada que arreglar.
Debes hacer el trace dentro de la funcion organizarXML. O sea, lo que quieras hacer con ese array deber hacerlo desde una instruccion al final de esa funcion, antes de la ultima llave.
el problema es q el trace se ejecuta antes q el metodo onLoad del xml, por eso el array esta vacio en ese trace.

Por Dario!

28 de clabLevel



Genero:Masculino  

Capital Federal - BsAs - Argentina

firefox
Citar            
MensajeEscrito el 15 Feb 2007 04:27 pm
Ok, muchas gracias por tu ayuda

Por omoyo11

2 de clabLevel



 

msie7
Citar            
MensajeEscrito el 28 Dic 2009 01:43 pm
Necesito ayuda con esto... he intentado de todo...

Código ActionScript :

function cargaXML(){
      _global.mysaldo=this.firstChild.childNodes[0].attributes.Saldo;
      trace(_global.mysaldo); //aca me muestra correctamente el valor que hay en el XML
      estado="cargado";
      trace(estado);// hace el trace correctamente
      
   }
   var MyXML=new XML();
   MyXML.ignoreWhite=true;
   MyXML.onload=cargaXML;
   MyXML.load("saldo.xml");
                   var x=_global.mysaldo;
   trace(_global.mysaldo);// me dice indefinido...
                   trace(x);// me dice indefinido...


como me pueden ayudar, ya le he declarado global... he leido y realizado ejemplos pero nada... es muy importante resolver estoo ya que tengo el mismo problema en varios proyectos. Gracias.

Por dionissio

10 de clabLevel



 

msie8
Citar            
MensajeEscrito el 29 Dic 2009 03:01 am
Antes que nada.. El topic es del 2007, la próxima inicia uno nuevo. Por otra parte, no puedes hacer un trace sin cargar primero y esperar la carga. Esa es la función de emplear el onLoad. En otras palabras tienes que poner el código que necesita la data de tu XML sobre la cargaXML

Saludos, Hernán . -

Por Hernán

BOFH

6148 de clabLevel

19 tutoriales
23 articulos

Genero:Masculino   REC Desarrollador de GAIA

Marketing & IT

firefox
Citar            
MensajeEscrito el 29 Dic 2009 08:49 am

Por leobaraldi

351 de clabLevel

3 tutoriales

 

firefox
Citar            
MensajeEscrito el 29 Dic 2009 02:24 pm
Les agradezco mucho!! no quiero parecer ignorante!!! voy a estudiarlo y les cuento... no me preocupa el trace, me preocupa es la variable que esta dentro de la funcion que debo utilizarla por fuera de ella, tomar su valor por fuera, y no me ha funcionado declarandola como global ni nada... seguire probando.

Por dionissio

10 de clabLevel



 

msie7
Citar            
MensajeEscrito el 30 Dic 2009 01:55 am
Recuerda no ejecutar nada de código hasta asegurarte que los datos esten cargados. Por eso seguro no te debe funcionar.

Saludos, Hernán . -

Por Hernán

BOFH

6148 de clabLevel

19 tutoriales
23 articulos

Genero:Masculino   REC Desarrollador de GAIA

Marketing & IT

firefox
Citar            
MensajeEscrito el 30 Dic 2009 02:30 pm
Sigue sin solucion, los datos estan correctamente cargados en el xml, ya que cuando hago el trace dentro de la funcion me muestra el dato que tengo en el XML... ayudenme a encontrar el error... no lo veo...

Código ActionScript :

var MyXML=new XML(); 
MyXML.ignoreWhite=true; 
MyXML.onload=cargaXML; 
MyXML.load("saldo.xml"); 
_global.balanc=0; 
function cargaXML(){ 
var saldo=this.firstChild.childNodes[0].attributes.Saldo; 
trace(saldo);//funciona 

_global.balanc=saldo; 
trace(_global.balanc);//funciona 
estado="cargado"; 
trace(estado);//funciona 
} 
cargaXML(); 
trace(_global.balanc); //NO FUNCIONA DICE INDEFINIDO

Por dionissio

10 de clabLevel



 

msie7
Citar            
MensajeEscrito el 30 Dic 2009 03:06 pm
¿No lees lo que te digo?

NO PUEDES EJECUTAR ASI, claro que te dirá indefinido, si estas poniendolo fuera, la única forma es ponerlo en la función cargaXML; sino le estas diciendo a Flash que te devuelve el valor de algo que aun no ha sido cargado. Si bien para tí se carga automático, para Flash no, y el poco tiempo que tarda en cargar, te jode.

Por eso existe el onLoad, para poder saber cuando tus datos han sido efectivamente cargados.

Saludos, Hernán . -

Por Hernán

BOFH

6148 de clabLevel

19 tutoriales
23 articulos

Genero:Masculino   REC Desarrollador de GAIA

Marketing & IT

firefox
Citar            
MensajeEscrito el 30 Dic 2009 04:18 pm
OK. te entiendo, y luego como hago para mandar ese dato fuera de la funcion...? dejame tomo un respiro... refresco mis ideas... la verdad parece tan facil... sniff

Por dionissio

10 de clabLevel



 

msie7
Citar            
MensajeEscrito el 31 Dic 2009 03:24 am
Usando la función de carga misma. En esa función debes declarar que quieres ejecutar luego de tener las variables. A nivel abstracto por ejemplo:

Código ActionScript :

_global.balanc=0;

var MyXML=new XML();  
MyXML.ignoreWhite=true;  
MyXML.onLoad=cargaXML;  
MyXML.load("saldo.xml");  
  
function cargaXML():Void{  
    _global.balanc = this.firstChild.childNodes[0].attributes.Saldo;  
    estado="cargado";  
    testTrace();
}  

function testTrace():Void{
    trace(_global.balanc);
}  

cargaXML();  


Saludos, Hernán . -

Por Hernán

BOFH

6148 de clabLevel

19 tutoriales
23 articulos

Genero:Masculino   REC Desarrollador de GAIA

Marketing & IT

firefox
Citar            
MensajeEscrito el 04 Ene 2010 01:53 pm
Te entiendo perfectamente... pero no me funciona...

Por dionissio

10 de clabLevel



 

msie7
Citar            
MensajeEscrito el 05 Ene 2010 01:43 am
¿Dónde exactamente estas usando la variable _global?

Saludos, Hernán . -

Por Hernán

BOFH

6148 de clabLevel

19 tutoriales
23 articulos

Genero:Masculino   REC Desarrollador de GAIA

Marketing & IT

firefox
Citar            
MensajeEscrito el 18 Ene 2010 04:01 pm
en el script principal, entes de cargar el XML

Por dionissio

10 de clabLevel



 

msie7
Citar            
MensajeEscrito el 19 Ene 2010 03:42 am

dionissio escribió:

en el script principal, entes de cargar el XML


Entonces JAMÁS te funcionará. ¿Como esperas que el sistema sepa cuanto vale la variable global que aun no has nutrido de información desde el XML?

Saludos, Hernán . -

Por Hernán

BOFH

6148 de clabLevel

19 tutoriales
23 articulos

Genero:Masculino   REC Desarrollador de GAIA

Marketing & IT

firefox
Citar            
MensajeEscrito el 21 Ene 2010 04:48 pm
Hernan, hice lo siguiente cree un archivo nuevo... para arrancar de cero... asi no nos metemos conque este o no en algun proceso... este archivo no tiene mas codigo que esto:

var XConfig:XML = new XML();
XConfig.load("saldo.xml");
XConfig.ignoreWhite = true;

XConfig.onLoad = function(estado) {
if (estado) {
var Cantidad = XConfig.firstChild.childNodes.length;
trace(Cantidad);
xSaldo=XConfig.firstChild.childNodes[0].attributes.saldo;
trace(xSaldo);
} else {
trace("No Puede Leer el Archivo");
}
}
var conta=xSaldo;
trace(conta); //NECESITO QUE ESTE TRACE FUNCIONE... QUE CONTA TOME EL VALOR EN ESTE PUNTO DE xSaldo

//el xml es este:

<?xml version="1.0" encoding="utf-8" ?>
- <XConfig>
<Balance saldo="100" />
</XConfig>

Solo necesito que este archivo funcione bien... asi puedo continuar. La verdad no se como hacerlo y mi laburo ya peligra por este detalle... no quiero que me hagan las cosas, pero en esto necesito ver como se hace correctamente... ya que vos ves que no me ha dado nada de lo que hemos intentado.... se que se debe a mi inexperiencia en el tema...

Gracias viejo!!!

Por dionissio

10 de clabLevel



 

msie7

 

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