PDA

Volledige versie bekijken : Problemen met returnen van een array


Jitze.Pieter
%Europe/Berlin %692 %2010, 16:37
Hallo allemaal,

Ik gebruik op het moment 2 classes: Main en LoadImages.
De main class doet nog niet zo veel die vult alleen een array met de data die wordt opgehaald door LoadImages uit een extern xml file.

Ik Krijg alleen de array niet terug terwijl hij wel de gehele code uitvoert van LoadImages.

Waarom kent hij de array niet waar hij hem moet returnen?
Hoop dat iemand mij kan helpen? alvast bedankt.

Code

package src
{
import flash.display.MovieClip;

public class Main extends MovieClip
{
public var loadImages:LoadImages = new LoadImages();
public var imageArray:Array = new Array();

public function Main()
{
this.imageArray = this.loadImages.getImages();

trace(this.imageArray);
}
}
}

Loadimages:

package src
{
import flash.display.Loader;
import flash.events.Event;
import flash.net.URLLoader;
import flash.net.URLRequest;

public class LoadImages
{
public var loader:URLLoader = new URLLoader();
public var urlRequest:URLRequest = new URLRequest("xml/images.xml");

private var _imgList:XML;//holds the content of the loaded xml file
public var sourceArray:Array = new Array();//array to hold all the source locations from the xml file

//constructor
public function LoadImages()
{
trace(" hello from constructor LoadImages ");// hij komt hier

/*this.loader.load(this.urlRequest);
this.loader.addEventListener(Event.COMPLETE, onCompleteHandler);*/

}

public function getImages():Array
{
trace(" hello from function getImages ");// hij komt hier

this.loader.load(this.urlRequest);
this.loader.addEventListener(Event.COMPLETE, onCompleteHandler);

trace(sourceArray);
return(sourceArray);
}

private function onCompleteHandler(event:Event):void
{
trace(" hello from function onCompleteHandler ");// hij komt hier

_imgList = new XML(event.target.data);// _imgList contains all the xml data from the xml file

// loop to push all the source locations from the xml file into an array
for (var i:int = 0; i < _imgList.image.source.length(); i++)
{
sourceArray.push(_imgList.image.source[i]);
}
}
}
}

Nidd
%Europe/Berlin %704 %2010, 16:54
Hey,

Het laden begin je gewoon in de constructor van LoadImages. Als je de LoadImages class EventDispatcher laat extenden, kun je aan het eind van de onCompleteHandler (wanneer de array gevuld is) een event door-dispatchen voor de Main class. Dus bijvoorbeeld:
dispatchEvent(new Event(Event.COMPLETE));
In de constructor van de Main class hang je een listener aan de LoadImages class.
loadImages.addEventListener(Event.COMPLETE, onImagesLoaded);
En in deze handler (in de Main class) roep je vervolgens de getImages() methode aan.

Grtz,
Niels.

Jitze.Pieter
%Europe/Berlin %729 %2010, 17:30
Hey,

Het laden begin je gewoon in de constructor van LoadImages. Als je de LoadImages class EventDispatcher laat extenden, kun je aan het eind van de onCompleteHandler (wanneer de array gevuld is) een event door-dispatchen voor de Main class. Dus bijvoorbeeld:
dispatchEvent(new Event(Event.COMPLETE));



Ik krijg als ik dat gebruik de volgende foutmelding:
1119: Access of possibly undefined property COMPLETE through a reference with static type flash.events:Event.

Ik gebruik ook al een event.COMPLETE in de fuctie getImages zorgt dat niet voor problemen?

Nidd
%Europe/Berlin %740 %2010, 17:45
Nee, dit zorgt niet voor problemen. Je kunt een event dispatchen wanneer je wil. Daarnaast is het in dit geval de LoadImages class die een event dispatched en niet het loader object.

Weet je zeker dat je niet iets bent vergeten? Event.COMPLETE zou gewoon moeten werken.

Niels.

Jitze.Pieter
%Europe/Berlin %745 %2010, 17:53
Dit is nu de code

main:

package src
{
import flash.display.MovieClip;
import flash.events.Event;

public class Main extends MovieClip
{
public var loadImages:LoadImages = new LoadImages();
public var imageArray:Array = new Array();

public function Main()
{
//this.imageArray = this.loadImages.getImages();

//trace(this.imageArray);

this.loadImages.addEventListener(Event.COMPLETE, onImagesLoaded);
}

public function onImagesLoaded(e:Event):void
{
loadImages.getImages();
}
}
}


LoadImages

package src
{
import flash.display.Loader;
import flash.events.Event;
import flash.events.EventDispatcher;
import flash.net.URLLoader;
import flash.net.URLRequest;

public class LoadImages extends EventDispatcher
{
public var loader:URLLoader = new URLLoader();
public var urlRequest:URLRequest = new URLRequest("xml/images.xml");

private var _imgList:XML;//holds the content of the loaded xml file
public var sourceArray:Array = new Array();//array to hold all the source locations from the xml file

//constructor
public function LoadImages()
{
trace(" hello from constructor LoadImages ");// hij komt hier

/*this.loader.load(this.urlRequest);
this.loader.addEventListener(Event.COMPLETE, onCompleteHandler);*/

}

public function getImages():Array
{
trace(" hello from function getImages ");// hij komt hier

this.loader.load(this.urlRequest);
this.loader.addEventListener(Event.COMPLETE, onCompleteHandler);

trace(sourceArray);
return(sourceArray);
}

private function onCompleteHandler(event:Event):void
{
trace(" hello from function onCompleteHandler ");// hij komt hier

_imgList = new XML(event.target.data);// _imgList contains all the xml data from the xml file

// loop to push all the source locations from the xml file into an array
for (var i:int = 0; i < _imgList.image.source.length(); i++)
{
sourceArray.push(_imgList.image.source[i]);
}

dispatchEvent(new Event(event.COMPLETE));//dit is line 50
}
}
}



En krijg deze foutmelding:
1119: Access of possibly undefined property COMPLETE through a reference with static type flash.events:Event.
(loadimages.as, line 50

Nidd
%Europe/Berlin %748 %2010, 17:58
Hey,

Het laden doe je nu nog in getImages() methode. Haal deze hier weg, en plaats 'm weer in de constructor van LoadImages. De fout krijg je, omdat je event niet met een hoofdletter hebt ;)

Wat je nu precies doet:
- Main maakt een instantie aan van LoadImages en zegt "haal de array op wanneer loadImages Event.COMPLETE dispatched".
- De constructor van LoadImages wordt aangeroepen, dus het laden van de XML begint.
- Het laden is voltooid. In de handler van loadImages wordt de array gevuld.
- De LoadImages class geeft dmv dispatchEvent aan dat de array gevuld is.
- De main haalt de array op.

Good luck!
Niels.

Jitze.Pieter
%Europe/Berlin %755 %2010, 18:08
Hey,

Many thanks het werkt, erg handig om een complete event te dispatchen weer wat geleerd.

Jitze.Pieter
%Europe/Berlin %758 %2010, 18:11
Ik vraag me nog 1 ding af:

Ik trace 2x de imagearray in main maar hij kent hem alleen maar in de functie onimagesloaded.
Weet je hoe dit kan?


package src
{
import flash.display.MovieClip;
import flash.events.Event;

public class Main extends MovieClip
{
public var loadImages:LoadImages = new LoadImages();
public var imageArray:Array = new Array();

public function Main()
{
this.loadImages.addEventListener(Event.COMPLETE, onImagesLoaded);

trace(this.imageArray);//deze doet het niet
}

public function onImagesLoaded(e:Event):void
{
imageArray = loadImages.getImages();
trace(this.imageArray);//deze doet het wel
}
}
}

jaspermuts
%Europe/Berlin %785 %2010, 18:51
Het inladen van data gebeurt op de achtergrond. Flash stopt niet met het uitvoeren van de regels omdat je een load() hebt aangeroepen, flash gaat gewoon door. Die 1e trace is dus eerder Meestal uitgeveord dan dat je data is ingeladen. tijdens de trace is het laden nog aan de gang. Dat is ook de hele essentie van dit topic/niels' oplossing.