Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 19
  1. #1

    persi i riferimenti nelle classi

    ho un problema di cui nn riesco proprio a determinare la causa. Sto cercando di fare un menu' dinamico con l'ausilio di un file xml, ma c'e' una cosa che proprio nn riesco a capire...

    Ho creato una classe "MenuBar" che accetta, tra gli altri parametri, un parametro di tipo movieclip che rappresenta il movieclip all'interno del quale verra' creato il menu'. Ecco l'intestazione del costruttore di MenuBar

    codice:
    function MenuBar(xmldef: String, dove_mc: MovieClip)
    poi importo i dati dal file xml usando una istanza chiamata proprio xml. Ho implementato il codice dell'evento onLoad per essere sicuro che i movieclip vengano creati solo quando tutto il file e' stato caricato

    codice:
    var thisObj = this;
    		
    xml.onLoad = function(success:Boolean){
    			
    if(success){
    
    thisObj.container_mc = thisObj.parent_mc.createEmptyMovieClip(this.firstChild.attributes.name, thisObj.parent_mc.getNextHighestDepth());
    ...resto del codice che crea i movieclip all'interno di container_mc...

    Ho creato un riferimento all'oggetto corrente (thisObj = this) perche' all'interno dell'oggetto xml il this si riferisce a quest'ultimo. Tutto ok, fin qui, il menu' viene creato all'interno di container_mc

    la classe MenuBar pero' ha anche questo metodo:

    codice:
    function get _width():Number{
     return this.container_mc._width;
    }
    ebbene...nn riesco a spiegarmelo ma this.container_mc nn e' definito! Come cavolo e' possibile?

    grazie in anticipo per ogni aiuto!
    Gabriele B. - http://9thcircle.it

  2. #2
    il problema sembra essere nei riferimenti utilizzati all'interno di onLoad.

    quando vado a fare thisObj.container_mc = thisObj.parent_mc.createEmptyMovieClip ecc.ecc.

    dovrebbe essere ugualmente definito this.container_mc allo stesso modo essendo thisObj = this

    invece nn e' cosi', come e' possibile vedere facendo due trace

    trace(thisObj.container_mc) all'interno dell'onLoad e' ok
    trace(this.container_mc) in qualunque altro metodo della classe mi da' undefined

    tuttavia nn riesco proprio a spiegarmi come questo sia possibile...
    Gabriele B. - http://9thcircle.it

  3. #3
    Utente di HTML.it L'avatar di and80
    Registrato dal
    Mar 2003
    Messaggi
    15,182
    nella classe, prima di entrare negli eventi tipo onLoad, crea una variabile var path:Object = this; e usa quella come riferimento, io la uso con le stringhe e funziona bene
    se ad esempio ho un metodo faiQualcosa, all'interno degli eventi scrivo path['faiQualcosa']() ecc...
    stessa cosa per le variabili

  4. #4
    sembra una buona idea, ora la provo.

    anche se non e' una soluzione definitiva, visto che io nn devo chiamare un metodo del padre, devo settare dei suoi attributi da dentro l'onLoad (nella fattispecier il container_mc). magari potrei aggiungerer un metodo di set privato tipo

    private function setMenuContainerMC(pippo:MovieClip){
    this.container_mc = pippo;
    }

    e chiamare questo meotodo da dentro onLoad col metodo che mi hai suggerito tu...forse nn molto pulito...ma dovrebbe funzionare...ora provo
    Gabriele B. - http://9thcircle.it

  5. #5
    Utente di HTML.it L'avatar di and80
    Registrato dal
    Mar 2003
    Messaggi
    15,182
    di solito lo faccio quando perdo i riferimenti nella classe, dovrebbe valere per tutto, metodi proprietà e variabili

  6. #6
    ho provato il tuo metodo...niente da fare :/

    questo e' il codice completo:

    http://no-paste.it/?58
    Gabriele B. - http://9thcircle.it

  7. #7
    Utente di HTML.it L'avatar di and80
    Registrato dal
    Mar 2003
    Messaggi
    15,182
    non era questo che intendevo
    ecco
    codice:
    [...]
    private function inizializza(xmlstring:String):Void{
    [...]		
    		var path:Object = this;
    
    		xml.onLoad = function(success:Boolean){
    [...]
    path['menu'].push(new Menu(shortcut.attributes['name'], shortcut.attributes['value'], elementimenu, path['menusymbol'], path['itemsymbol'], path['container_mc']));
    				} 
    			path['disegna']();
    [...]
    ho corretto in fretta, magari c'è qualche errore di sintassi

  8. #8
    o sono io o e' imbecille il flash: ho provato a modificare la funzione disegna() in public e dentro c'ho messo un trace(this.container_mc), quindi l'ho chiamata manualmente

    quando la chiamo da dentro l'onLoad con thisObj.disegna() il trace mi stampa _level0.<nome del movieclip> perfettamente

    quando la chiamo manualmente con <nome istanza oggetto MenuBar).disegna mi restituisce undefined

    Gabriele B. - http://9thcircle.it

  9. #9
    Utente di HTML.it L'avatar di and80
    Registrato dal
    Mar 2003
    Messaggi
    15,182
    Originariamente inviato da TheClue/Nash
    o sono io o e' imbecille il flash: ho provato a modificare la funzione disegna() in public e dentro c'ho messo un trace(this.container_mc), quindi l'ho chiamata manualmente

    quando la chiamo da dentro l'onLoad con thisObj.disegna() il trace mi stampa _level0.<nome del movieclip> perfettamente

    quando la chiamo manualmente con <nome istanza oggetto MenuBar).disegna mi restituisce undefined

    prova a passargli i parametri che utilizza il metodo, vedo un "menu", forse è quello che dentro la funzione risulta undefined

  10. #10
    ho capito e sono un coglione!

    nn era un problema di scope ma un problema di tempo! infatti la mia chiamata a _width avveniva quando onLoad nn era stata ancora chiamata (perchè ancora doveva tornare xml.load) ecco perche' gli elementi nn erano definiti!

    se provo a fare un trace(barramenu._width) al frame 99 torna correttamente il valore

    a questo punto si apre un nuovo fronte: come forzare un caricamento sincrono per evitare di chiamare troppo presto metodi o di leggere attributi nn ancora inizializzati? Parlo di un metodo che pero' cmq mi conservi la natura asincrona del resto del codice. Altrimenti sarebbe semplice con, chesso':

    while(!barramenu.loaded){}
    Gabriele B. - http://9thcircle.it

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.