Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    as2 esportare un variabile fuori da una funzione

    salve, ho un piccolo problema che nn riesco a risolvere, ho una array dentro ad una funzione, ma non riesco ad esportarla al di fuori di essa, ho provato anche dichiarandola _global sia internamente che esternamente alla funzione.... ma non riesco a vederla in nessun modo T_T

    Codice PHP:
    filexml "data.xml";


    //lettura file XML con correzzione spazzi vuoti / bianchi
    function ApriXML() {
        
    mioxml = new XML();
        
    myarray = new Array();
        
    myarray2 = new Array();
        
    myarray3 = new Array();
        
    IDgiocatore = new Array();
        
    mioxml.load(filexml);
        
    mioxml.onLoad ElaboraXML;
        
    NomeGiocatore = new Array();

        function 
    ElaboraXML(success) {

            if (
    mioxml.loaded) {
                
    myarray mioxml.childNodes;
                
    trace("--------funzione ElaboraXML-------");
                
    trace("Tot elementi = " myarray.length);
                
    trace("----------------------------------");
                for (
    0<= myarray.lengthj++) {
                    if (
    myarray[j].nodeName == "game") {
                        
    myarray2 myarray[j].childNodes;
                        for (
    0<= myarray2.lengthi++) {
                            if (
    myarray2[i].nodeName == "giocatore") {
                                
    _root.IDgiocatore.push(myarray2[i].attributes.id);
                                
    myarray3 myarray2[i].childNodes;
                                for (
    0<= myarray3.lengthk++) {
                                    if (
    myarray3[k].nodeName == "nome") {
                                        
    _root.NomeGiocatore.push(myarray3[k].childNodes.toString());




                                    }
                                }
                            }
                        }
                    }
                }


            }

            
    delete myarray;
            
    delete myarray2;
            
    delete myarray3;
            
    delete mioxml;
            
    trace("in ----> " _root.NomeGiocatore.length);//---> qua mi restituisce correttamente 7
        
    }//fine funzione ElaboraXML

    }//fine funzione apriXML 

    ApriXML();
    trace("out ----> " _root.NomeGiocatore.length);// mi restituisce 0... uff.. dentro alla funzione mi da 7! 

  2. #2

  3. #3
    Utente di HTML.it L'avatar di and80
    Registrato dal
    Mar 2003
    Messaggi
    15,182
    Non lo puoi fare, come ti ho già descritto in precedente thread.
    Le variabili che vengono "riempite" all'interno di una funzione onLoad non possono essere usate al di fuori di essa.
    Questo dipende dal fatto che la funzione onLoad è asincrona, viene richiamata quando il caricamento è completato, ma non mette in pausa il resto del programma che continua ad essere eseguito.
    Perciò quando si imbatte nel tuo trace, la variabile non è ancora riempita con il valore e risulta undefined.

    Generalmente per rendere più pulito e leggibile il codice, mi scrivo una funzione fuori dall'onLoad a cui passo come parametri quelli che riempio, appunto nell'onLoad.
    E' comunque solo una questione di lettura e ordine del codice.

  4. #4
    Scusami, forse capisco male, ma non è all'interno di un qualcosa, è su _level0 della mia timeline la funzione. Non fa parte di nessun oggetto, o timeline secondaria.
    a me interessa in soldoni:

    1) caricare
    2) leggerre
    3) usare le variabili prese

    le prime due l'ho fatte, la 3) mi rogna... per prova nell'esempio, se vedi, ho eseguito la funzione e cercato di prendermi le variabili, nello stesso posto, senza saltare da un oggetto all'altro... ma manco da li me le prende...


    spero di nn aver capito male io ^^... se non erro ti riferivi al pulsante del precedente post..

  5. #5
    risolto il mistero della pietra azzurra in parte xD

    Allora, in soldoni, non fa tempo a caricacare e a finire la funzione... propio perchè IL CAricamento richiede del tempo, e l'actionscript non aspetta nessuno -.- infatti, le prime due ciclate mi da undefinited, poi invece me la legge egreggiamente!!

    se io la variabile esterna la metto denter a un moviclip, questo me la legge pk ha tutto il tempo di sto mondo per aspettarla riluppando il codice su se stesso... Però mi sembra un po contorta la cosa, non c'è un metodo più pratico e meno contorto per:

    - estrarre dalla mia funzione una array contenente i dati xml che mi interessano, presi da un file xml esterno, come da codice sopra, senza dover loopare il codice servendomi di un onClipEvent (enterFrame) { } di un movieclip? bho forse mettendo il codice in pausa prima di chiamare la variabile? MMM so nemmeno se esista il comando, io ora guarda xD

    ApriXML();
    gotoAndStop(2);
    anche facendo così funziona, ovvero lanciando la funzione, e passando al secondo frame, così da il tempo di leggerla e di trovarmi il valore.... ma se diventa grasso il mio xml ??? io paura... spero ci sia un modo sicuro di fa sta cosa:
    l'outuput a verifica di quanto detto:
    Codice PHP:
    out function ----> undefined       <-------prima associa la variabile e poi mi carica la funzione
    --------funzione ElaboraXML-------
    Tot elementi 3
    ----------------------------------
    in function ----> utente!!! 



    grazie, ciaooo

    P.s.
    e dire che la sto provando in locale... non oso pensare quando sarà online... mmmm

  6. #6
    risolto così in attesa di qualcosa di migliore se c'è:

    Codice PHP:
    filexml "data.xml";


    //lettura file XML con correzzione spazzi vuoti / bianchi
    function ApriXML() {

        
    mioxml = new XML();
        
    myarray = new Array();
        
    myarray2 = new Array();
        
    myarray3 = new Array();
        
    IDgiocatore = new Array();
        
    mioxml.load(filexml);
        
    mioxml.onLoad ElaboraXML;
        
    NomeGiocatore = new Array();

        function 
    ElaboraXML(success) {
            if (
    mioxml.loaded) {
                
    myarray mioxml.childNodes;
                
    trace("--------funzione ElaboraXML-------");
                
    trace("Tot elementi = " myarray.length);
                
    trace("----------------------------------");
                for (
    0<= myarray.lengthj++) {
                    if (
    myarray[j].nodeName == "game") {
                        
    myarray2 myarray[j].childNodes;
                        for (
    0<= myarray2.lengthi++) {
                            if (
    myarray2[i].nodeName == "giocatore") {
                                
    _root.IDgiocatore.push(myarray2[i].attributes.id);
                                
    myarray3 myarray2[i].childNodes;
                                for (
    0<= myarray3.lengthk++) {
                                    if (
    myarray3[k].nodeName == "nome") {
                                        
    _root.NomeGiocatore.push(myarray3[k].childNodes.toString());

                                    }
                                }
                            }
                        }
                    }
                }
            }

            
    delete myarray;
            
    delete myarray2;
            
    delete myarray3;
            
    delete mioxml;


            
    gotoAndPlay("dati xml"2);
        }
    //fine funzione ElaboraXML

    }//fine funzione ApriXML


    ApriXML(); 
    praticamente lo fermo al frame dove si trova con un stop();
    poi faccio eseguiere la funzione, ci mettesse anche 2 ore, tanto son sicuro che sarà completamente letta pk a fine funzione gli dice di caricarmi il frame sucessivo ...

  7. #7
    Utente di HTML.it L'avatar di and80
    Registrato dal
    Mar 2003
    Messaggi
    15,182
    Il meccanismo è proprio quello, i caricamenti di questo tipo sono definiti asincroni, ossia non prevedibili in fase di programmazione, ed è per questo che si usano le funzioni evento per monitorarle.
    Tali funzioni lanciano un "ascoltatore" che rimane appunto in ascolto dell'evento e dice quando eseguire la funzione legata allo stesso, nel nostro caso la funzione onLoad.

    Io ormai non uso più as2, ma quando lo usavo facevo tutto sullo stesso frame, lanciando una funzione all'interno dell'onLoad per essere sicuro del riempimento dei dati che mi servivano.

    Ovviamente anche il metodo che hai usato tu del secondo frame è largamente utilizzato ed è comunque una soluzione dignitosa

  8. #8
    Io capisce, grazie

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.