PDA

Volledige versie bekijken : this in een klasse


waldo_cosman
%Europe/Berlin %653 %2006, 15:41
Hallo,

Ik ben bezig met een listener-object te gebruiken in een klasse.
Dit is de code:

listener.onLoadProgress = function(targetMC:MovieClip, lBytes:Number, tBytes:Number) {
trace("laden");
trace(this);
};
This is hier het listener object, maar hoe kan ik m'n eigen object van m'n klasse aanspreken dan? Met _parent lukt dit niet...

waldo_cosman
%Europe/Berlin %656 %2006, 15:45
Heb een oplossing gevonden, maar ik weet niet of het de juiste is: in m'n listener object maak ik gewoon een object van m'n eigen klasse:

listener.klasse = this waar this dan het klasse object is. Zou dit kunnen kloppen dat je het zo MOET doen, of kan het anders?

Roenes
%Europe/Berlin %661 %2006, 15:52
Dat is inderdaad een manier. Een mooiere manier is door te werken met Delegate. Alleen Delegate ondersteund weer geen parameters. Maar als je deze variant (http://www.flashfocus.nl/forum/showthread.php?t=2590) van Delegate gebruikt die Narie postte, dan kan het wel :)

Maar op zich is de manier die jij gebruikt hebt goed genoeg voor deze situatie :)

Flasher
%Europe/Berlin %662 %2006, 15:53
De manier die jij gebruikt kan ook, maar de makkelijkste manier is volgens mij om de classe zelf de listener te laten zijn:

mcl.addListener(this);

en dan kan je van die onLoadProgress e.d. (private) class-functies maken

Roenes
%Europe/Berlin %663 %2006, 15:55
Een goede oplossing Flasher, daar had ik niet zo snel aan gedacht :)

waldo_cosman
%Europe/Berlin %668 %2006, 16:03
ok, ik snap je redenering voor this de listener te laten zijn, maar this kent de property onLoadProgress niet...

Roenes
%Europe/Berlin %669 %2006, 16:03
Die moet je dus zelf creëeren in je classe :)

waldo_cosman
%Europe/Berlin %673 %2006, 16:10
nu bennek nie meer mee ze :)

dus:

this zelf listener laten spelen, maar als ik dan this.onLoadProgress doe, lukt dit niet, wat logisch is. of moet ik:

class 'klasnaam' extends listener

doen?

Flasher
%Europe/Berlin %677 %2006, 16:14
Gewoon zo:
class SomeClass {

function SomeClass() {...}

function loadMC(url:String):Void {
var mcl:MovieClipLoader = new MovieClipLoader();
mcl.addListener(this);
mcl.loadClip(..);
}

function onLoadProgress(targetMC:MovieClip, lBytes:Number, tBytes:Number) {
trace("laden");
trace(this);
};
}

Dauntless
%Europe/Berlin %677 %2006, 16:15
Het is veel simpeler dan je denkt hoor.

(Ff tussendoor: Listener is geen classe dus die kan je niet extenden. Listener is gewoon een object dat je opgeeft als 'luisteraar'.).

Een voorbeeld dus:

class Foo
{
public function Foo(src:String, holder:MovieClip)
{
loadPicture(src, holder);
}
private function loadPicture(src:String, holder:MovieClip)
{
var myMCL:MovieClipLoader = new MovieClipLoader();
myMCL.loadClip(src, holder);
myMCL.addEventListeners(this);
}
//hier wordt het interessant
private function onLoadComplete(mc:MovieClip)
{
trace("laden is compleet!");
}
}

Maar zelf gebruik ik altijd Delegate.
Even een code snipit uit een classe die ik een tijd geleden had gemaakt:
public function loadPicture(p_source:String):Void
{
var listener:Object = new Object();
listener.onLoadProgress = Delegate.create(this, onLoadProgressEvent);
listener.onLoadStart = Delegate.create(this, onLoadStartEvent);
listener.onLoadComplete = Delegate.create(this, onLoadCompleteEvent);
imgMCL.addListener(listener);
imgMCL.loadClip(p_source, imgHolder);
dataArray = arguments;
}

private function onLoadStartEvent():Void
{
preloaderHolder.attachMovie(preloaderLinkage, "preloader", 1);

}
private function onLoadProgressEvent(p_mc:MovieClip, p_bl:Number, p_bt:Number):Void
{
preloaderHolder.preloader.gfx._height = (p_bl / p_bt) * stageHeight;
preloaderHolder.preloader.txt_preloader.text = Math.floor(p_bl / p_bt * 100) +"% geladen";
preloaderHolder.preloader.txt_preloader._y = (p_bl / p_bt) * stageHeight - preloaderHolder.preloader.txt_preloader._height;

}

private function onLoadCompleteEvent(p_mc:MovieClip):Void
{
preloaderHolder.preloader.removeMovieClip();
showData(dataArray);
}