2009-11-25 11 views
5

Mam plik SWF, który ładuje zewnętrzny plik SWF. Swf programu ładującego ma zmienną, do której chcę uzyskać dostęp z załadowanego pliku SWF. Używam MovieClip(parent.parent).myVar jednak zwrócić ten błądJak uzyskać dostęp do zmiennej nadrzędnej movieclip z załadowanego pliku SWF

TypeError: Error #1009: Cannot access a property or method of a null object reference. at card01_fla::MainTimeline/frame1()

Ładowarka swf ma zwyczaj klasy dokumentu, który moim zdaniem jest problem.

Z góry dziękuję.

EDIT

To jako głównego swf

package 
{ 
    import flash.display.Loader; 
    import flash.display.Sprite; 
    import flash.events.Event; 
    import flash.events.MouseEvent; 
    import flash.net.URLRequest; 
    import flash.text.TextField; 

    /** 
    * ... 
    * @author chchrist 
    */ 
    public class CardSender extends Sprite 
    { 

     private var loader:Loader; 
     private var viewButtonArray:Array; 
     private var sendButtonArray:Array; 
     private var cardContainer:Sprite; 

     public var testVar:String 

     public function CardSender() { 

      testVar = "it worked!!!"; 
      init(); 
     } 

     private function init() { 
      viewButtonArray = [cardsenderMC.view01, cardsenderMC.view02, cardsenderMC.view03, cardsenderMC.view04]; 

      for each(var viewButton in viewButtonArray) { 
       viewButton.buttonMode = true; 
       viewButton.addEventListener(MouseEvent.CLICK, onViewClick); 
      } 
     } 

     private function onViewClick(e:MouseEvent):void { 
      var cardName = "card"+e.target.name.substring(4)+".swf"; 
      loader = new Loader(); 
      loader.load(new URLRequest(cardName)); 
      loader.contentLoaderInfo.addEventListener(Event.INIT, onCardInit); 
     } 

     private function onCardInit(e:Event):void { 
      addChild(loader); 
      var content:* = loader.content; 
      content.closeButton.addEventListener(MouseEvent.CLICK, onCloseClick); 
     } 

     private function onCloseClick(e:MouseEvent):void { 
      removeChild(loader); 
     } 

    } 
} 

i próbuję uzyskać dostęp do zmiennej testową z załadowanego pliku SWF z tym kodem

trace(MovieClip(parent.parent).testVar); 

EDYCJA # 2

Jeśli I addChild(loader) nie w onCardInit, ale w onViewClick iw pierwszej klatce załadowanego pliku SWF mam Object(parent.parent).testVar działa ... ale dlaczego nie chce być w funkcji onCardInit?

+0

która z nich rzuca null - parent lub parent.parent? – Amarghosh

+0

parent.parent rzuca null – chchrist

+0

co otrzymujesz dla 'trace (parent); - jaki jest jego typ danych? – Amarghosh

Odpowiedz

2

Masz tylko jeden loader zmienna i jesteś tworząc cztery Loader instancje i przypisując je do niego - tak czy klikniesz wszystkie cztery z nich w krótkim odstępie czasu, zmienna loader będzie skutecznie zawierała obiekt Loader odpowiadający ostatniemu kliknięciu. Wszystkie połączenia addChild będzie działać na tej samej Loader obiektu - inni nie będą dodawane, a ich rodzice nadal będzie null

dokonać następujących zmian w kodzie:

private function onCardInit(e:Event):void 
{ 
    addChild(LoaderInfo(e.currentTarget).loader); 
    var content:DisplayObject = loader.content; 
    trace(content); 
    trace(content.closeButton); 
    content.closeButton.addEventListener(MouseEvent.CLICK, onCloseClick); 
} 

private function onCloseClick(e:MouseEvent):void 
{ 
    trace(e.currentTarget);//should be the closeButton 
    trace(e.currentTarget.parent);//should be the loaded swf 
    trace(e.currentTarget.parent.parent);//should be the Loader object that loaded it 

    //The following will work only if last three traced correctly 
    removeChild(e.currentTarget.parent.parent); 
} 

odpowiedzi na następującą aktualizację w pytaniu:

If I addChild(loader) in the onViewClick instead of onCardInit , then Object(parent.parent).testVar in the first frame of the loaded swf works. Why doesn't it work if I addChild inside the onCardInit function?

Ponownie, to może być dlatego, że dodanie innego loader obiektu - czy kliknięcie na więcej niż jeden viewbuttons? Kliknij przycisk widoku i poczekaj, aż zostanie załadowany, aby zobaczyć, jak działa.

+0

Tak, zgadzam się, ale moim prawdziwym problemem jest teraz, jak uzyskać dostęp z załadowanej zmiennej testvar. – chchrist

+0

Gdzie próbujesz uzyskać do niego dostęp? od konstruktora klasy dokumentów? obsługa zdarzeń? klasa przycisku? - Myślę, że jakiś kod pomógłby – Amarghosh

+0

z pierwszej klatki załadowanego pliku SWF – chchrist

0

spróbować śledzenie rodzica i parent.parent, jestem pewien, że to ze względu na aditional „rodzic”

2

parent.parent jest nieprawidłowy. spróbuj:

MovieClip(MovieClip(e.currentTarget.parent).parent).myVar ; 

Trzeba pierwszy rzuci rodzica do pewnej klasy jak MovieClip, a następnie dostać rodzica tej nowej MovieClip, a potem coraz wewnątrz zmiennej.

0

loader.content NIE jest klipem filmowym, więc nie ma takich samych możliwości. spróbuj

myLoadedClip: MovieClip = MovieClip (loader.content);

wówczas myLoadedClip.parent.myVar powinno pokazać się

może chcesz, aby Twój obsługi ognia na Event.COMPLETE zamiast na Event.INIT

0

Ten jedyny kod linii w załadowanym swf rozwiązuje go! ;)

MovieClip (MovieClip (parent.parent) .root) .play();

Powiązane problemy