PDA

Volledige versie bekijken : Event uit class halen.


Albus
%Europe/Berlin %733 %2007, 18:35
Hallo,

Ik ben bezig met een lader class die foto's kan inladen. Nu vroeg ik me af hoe ik in mijn document kan te weten komen wanneer in de lader class het laden compleet is.
Ik heb dit geprobeerd met volgende code maar dit werkt niet:


var lader:Lader = new Lader();
addChild(lader);

lader.laadBeelden(url,ellips,70,70);
lader.addEventListener(Event.COMPLETE,lader_comple et);
function lader_compleet(gebeurtenis:Event):void {
trace("ja");
}


lader class:

package {
import flash.display.Loader;
import flash.display.MovieClip;
import flash.events.*;
import flash.net.URLRequest;

public class Lader extends MovieClip {
private var _url:Array;
private var _object:Object;
private var _object_eindB:Number;
private var _object_eindL:Number;
private var _i:Number = 0;
private var _geladenData:Number;
private var _object_b:Number;
private var _object_l:Number;
private var _beeld:Array = [""];
//private var _breedte:Array = [""];

public function Lader() {

}

/*public function breedte(beeld:Number):Number {
return _breedte[beeld];
}*/

public function laadBeelden(url:Array,object:Object,object_eindB,o bject_eindL):void {
_url = url;
_object = object;
_object_eindB = object_eindB;
_object_eindL = object_eindL;
laden();
}
private function laden():void {
var lader:Loader = new Loader();
var urlAanvraag:URLRequest = new URLRequest();
urlAanvraag.url = _url[_i];
lader.load(urlAanvraag);
addChildAt(lader,0);
configureerLuisteraars(lader.contentLoaderInfo);
}
private function configureerLuisteraars(verzender:IEventDispatcher) :void {
verzender.addEventListener(IOErrorEvent.IO_ERROR,i oFout);
verzender.addEventListener(ProgressEvent.PROGRESS, voortgang);
verzender.addEventListener(Event.COMPLETE,compleet );
}
private function ioFout(gebeurtenis:IOErrorEvent):void {

}
private function voortgang(gebeurtenis:ProgressEvent):void {
_geladenData = gebeurtenis.target.bytesLoaded/gebeurtenis.target.bytesTotal;
if(_geladenData==1) {
_object_b = _object.width;
_object_l = _object.height;
} else {
_object.width = _object_b + Math.round((_geladenData * _object_eindB)/_url.length);
_object.height = _object_l + Math.round((_geladenData * _object_eindL)/_url.length);
}
}
private function compleet(gebeurtenis:Event):void {
_beeld[_i] = gebeurtenis.target.loader.content;
//_breedte[_i] = _beeld[_i].width;
if(_i!==_url.length-1) {
_i ++;
laden();
} else {
for(var j:Number=0;j<_url.length;j++) {
_beeld[j].x = (gebeurtenis.target.loader.width/2) - (_beeld[j].width/2);
_beeld[j].y = (gebeurtenis.target.loader.height/2) - (_beeld[j].height/2);
}
}
}
}
}

theFlashWizard
%Europe/Berlin %746 %2007, 18:54
Dat komt omdat dit event niet bubbelt en dus niet buiten je class komt. Wil je dit wel bereiken moet je hem binnen je eigen class nog een keer dispatchen.

(Wel erg irritant dat nederlands hoor)

Albus
%Europe/Berlin %753 %2007, 19:05
Danku. Ik vind het makkelijker om alles nederlandse namen te geven. Maar als het makkelijker leest zal ik de volgende keer alles omzetten naar het Engels?

Albus
%Europe/Berlin %853 %2007, 21:29
Ik heb nog een kleine vraag:

Ik heb een subclass gemaakt van de Lader class. Nu wil ik de variabele _image die protected is aanhalen in deze subclass. Dit is geen probleem, maar nu blijkt dat de waarden nog steeds null zijn, en toch heb ik in de functie complete (een event), de waardes van de array _image aangevuld. Vanuit het document is _image niet null.

Mr. Black
%Europe/Berlin %631 %2007, 16:09
Zeker dat je hem dan ook "refresht"? Doe je in het begin iets als:

_image = super._image;

Als dan _image van de Lader class verandert, doet _image van de subclass dat niet automatisch. Ook in je subclass zou je dus een listener aan moeten maken (of heb je dan al gedaan?).

[btw: qua code ziet dit niet uit. Het is een Engelse scripttaal, dus zou ik de rest ook in het Engels doen. Als je je code een keer wilt sharen met een buitenlander: vergeet het maar. En ook voor ons leest het een stuk makkelijker (als je het de hele tijd doet)].

Albus
%Europe/Berlin %696 %2007, 17:43
Dus als ik het goed begrijp moet ik dat stukje script gebruiken in de subclass? Ik heb geen listener aangemaakt maar ik denk niet dat dat nodig is als ik het op deze manier doe:
Ik maak een instantie van de class Lader aan in een document. In dit document voeg ik een listener toe aan de complete status van de lader. Wanneer deze word aangehaald, maak ik een instantie van de subclass van de Lader class.

Is dit correct? Het werkt namelijk nog niet.

Albus
%Europe/Berlin %562 %2007, 14:30
Het lukt me echt niet. Ik wil gewoon in een subclass een event overbrengen van de superclass.


Dit is de vereenvoudigde superclass:

package {
public class SuperClass() {
public function SuperClass() {
configureListeners(imageLoader.contentLoaderInfo);
}

private function configureListeners(dispatcher:IEventDispatcher):vo id {
dispatcher.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
dispatcher.addEventListener(ProgressEvent.PROGRESS ,progressHandler);
dispatcher.addEventListener(Event.COMPLETE,complet eHandler);
}

protected function completeHandler(event:Event):void {
dispatchEvent(event);
}
}
}


Dit is de vereenvoudigde subclass:

package {
public class SubClass() {
private var event:Event = new Event(Event.COMPLETE);

public function SubClass() {
super.completeHandler(event);
}
}
}


Nu krijg ik deze error:

"
TypeError: Error #1009: Cannot access a property or method of a null object reference.
at Lader/Lader::compleet()
at Beelden_nav$iinit()
at beelden_nav_fla::MainTimeline/beelden_nav_fla::frame1()
"

TheDutch
%Europe/Berlin %705 %2007, 17:56
Heb je er al eens aan zitten denken om een stap terug te doen? Kennelijk snap je van het meeste nog helemaal niets. Dat is niet erg maar dat komt wel omdat je de basis kennis hebt overgeslagen. Begin nu gewoon eens bij het begin en lees rustig de LiveDocs en begin met simpele dingetjes om te maken...

ps. Leer daarnaast ook om de errors te lezen (of Engels om ze te kunnen lezen) zodat je zelf kunt kijken waar het probleem zit. Dat hoort ook bij de basis kennis en is zeer belangrijk bij het debuggen!

Albus
%Europe/Berlin %777 %2007, 19:39
Bedankt. Je hebt wel gelijk, er zijn nog veel dingen die ik kan leren over classes. Wat die errors lezen betreft: de Engelse woorden begrijpen is geen probleem maar de betekenis van de error opzich en waar deze naar verwijst verstaan is moeilijker.

TheDutch
%Europe/Berlin %799 %2007, 20:10
Ik zeg het inderdaad niet om er even een rot opmerking uit te gooien. Het is om je te helpen :).
Hier een voorbeeld hoe je errors moet lezen.


TypeError: Error #1009: Cannot access a property or method of a null object reference.
at Lader/Lader::compleet()
at Beelden_nav$iinit()
at beelden_nav_fla::MainTimeline/beelden_nav_fla::frame1()

Lees van onder naar boven:

at beelden_nav_fla::MainTimeline/beelden_nav_fla::frame1()
Frame 1 van de hoofdtijdlijn van de FLA wordt afgespeeld.

at Beelden_nav$iinit()
De iinit (implicit instance initializer) van Beelden_nav wordt uitgevoerd.

at Lader/Lader::compleet()
De compleet() functie binnen de Lader class wordt uitgevoerd.

TypeError: Error #1009: Cannot access a property or method of a null object reference.
Kan geen toegang krijgen tot property of method (functie) die null als referentie heeft.

Het is dus duidelijk dat binnen de functie compleet() er een property of method wordt aangesproken die niet bestaat of waar het op dat moment geen toegang tot heeft omdat het property of de method op dat moment bijvoorbeeld niet beschikbaar is. Wanneer je de debugger gebruikt zal het waarschijnlijk aangeven om welke regel het gaat (in Flex Builder wel). Daarna hoef je alleen nog maar wat te tracen om te bekijken om welke property of method het binnen die regel precies gaat.

Zover de uitleg. Toch wil ik je nogmaals aangeven dat je veel te snel gaat en het echt anders moet aanpakken wil je het goed kunnen leren :).