PDA

Volledige versie bekijken : Events en Arguments


NicoEshuis
%Europe/Berlin %390 %2008, 10:22
Ik heb een code geschreven in AS 3.0 waarbij ik gebruik maak van een MouseEvent.
Gaat ongeveer als volgt:

button.addEventListener(MouseEvent.MOUSE_OVER, SetDropDown)

private function SetDropDown(event:MouseEvent) {}

Maar eigenlijk wil ik ook nog arguments meegeven aan die SetDropDown-functie,
Logisch is dat dit dan ook niet werkt:

button.addEventListener(MouseEvent.MOUSE_OVER, SetDropDown(button))

private function SetDropDown(event:MouseEvent, button) {}

want er wordt dan om 2 arguments gevraagd. Kan iemand helpen?

Dauntless
%Europe/Berlin %406 %2008, 10:45
Je wil gewoon een referentie hebben naar de button? Die heb je namelijk al: event.currentTarget :). (In je SetDropDown functie dus)

NicoEshuis
%Europe/Berlin %414 %2008, 10:56
In ieder geval bedankt dat wist ik namelijk nog niet. maar ik heb nog een xml bestand waar ik de verschillende sub buttons uit wil lezen. Die wil ik dus ook meegeven.

Als volgt:

private function InitButtons() {
LoadXmlData();

}
private function LoadXmlData() {
var xmlLoader:URLLoader = new URLLoader();
xmlData = new XML();

xmlLoader.addEventListener(Event.COMPLETE, LoadXML);


xmlLoader.load(new URLRequest("xml/movies.xml"));

}
private function LoadXML(e:Event):void {
xmlData = new XML(e.target.data);
SetButtons(xmlData);

}
private function SetButtons(movies:XML) {
var chapterList:XMLList = movies.hoofdstuk;
for each(var chapter:XML in chapterList) {

var button = new UpButton();
button = SetButtonPos(button);
button.htitle.text = chapter.attribute("ht");
button.addEventListener(MouseEvent.MOUSE_OVER, SetDropDown)
addChild(button);
numButtons++;
}
}
private function SetDropDown(event:MouseEvent) {


}
private function SetButtonPos(button) {
button.x = 30+120*numButtons;
button.y = 3;
return button;
}

Ik wil ook nog de xml-node hoofdstuk aan de functie meegeven zodat hij hieruit weer de
childnodes kan lezen waar vervolgens de subbuttons uit worden bepaald.

Het zou gewoon handiger zijn als ik ook nog arguments kan meegeven. Maar dit kan dus niet?

Dauntless
%Europe/Berlin %415 %2008, 10:58
Argumenten meegeven kan dacht ik niet nee, maar je kan wel gewoon een methode maken op je button die deze dan teruggeeft. Je kan ze dan benaderen via event.currentTarget.getXMLNodes() oid. (Dit is ook een mooiere oplossing dan die dingen meegeven als argument)

Ps: Het kan wel als je je eigen Events maakt die argumenten meekrijgen. Of je maakt je eigen eventDispatcher, wat ook kan, maar bovenstaande oplossing is wel een stuk eenvoudiger dan :).

NicoEshuis
%Europe/Berlin %420 %2008, 11:05
Oke dankjewel, ik had eigenlijk geen zin om een UpButton() klasse aan te maken vandaar ;) maar nu moet ik er dus wel aangeloven:P.

Dauntless
%Europe/Berlin %421 %2008, 11:07
Probeer ook je methodes met een kleine letter te laten beginnen.
Classes = CamelCase
Methods = camelCase
package = nocamelcase

NicoEshuis
%Europe/Berlin %427 %2008, 11:15
Ik wil niet lastig zijn maar wat bedoelen programmeurs nou precies met netter, want als ik (als dat mogelijk was) arguments zou gebruiken zou ik veel minder code hoeven te typen. Nu moet ik deze klasse helemaal typen om die xml in die functie te krijgen:

package {

public class UpButton extends MovieClip {

var chapter:XML;

public function UpButton(chapter:XML) {
this.chapter = chapter;

}
public function GetChapterXML() {
return chapter;
}

}}

btw bedankt voor je tip!

Dauntless
%Europe/Berlin %431 %2008, 11:20
Op deze manier is de xml data veel dichter gebonden bij de button waar hij bij hoort. Het is dus OO gezien een mooiere manier.

(GetChapterXML zou dan ook wel met een kleine letter zijn :))

NicoEshuis
%Europe/Berlin %435 %2008, 11:26
Oke dus zo zit dat.

Ja ik moet dan nog ff al mn functies bijlangs. Tot die tijd blijf ik consistent :P.

Sunnl
%Europe/Berlin %643 %2008, 16:26
Meergeven van meerdere parameters bij een Event zou ook moeten kunnen met custom events toch? Ben er een tijd geleden mee bezig geweest maar helaas niet uitgekomen. Je zou dat misschien ook kunnen gebruiken.

yeaha
%Europe/Berlin %748 %2008, 18:57
Meergeven van meerdere parameters bij een Event zou ook moeten kunnen met custom events toch? Ben er een tijd geleden mee bezig geweest maar helaas niet uitgekomen. Je zou dat misschien ook kunnen gebruiken.

hoe doe je dat dan precies? :S

Dauntless
%Europe/Berlin %922 %2008, 23:08
Dan moet je nog veel meer werk doen... Je extend dan je Button (dmv de UpButton). Die laat je dan ook nog eens de IDispatcher (of was het IEventDispatcher?) implementeren en je implementeert je werkt heel het Dispatcher systeem uit. Dan maak je een nieuwe Custom event waarin je dat kan opslaan (Je custom event extends flash.events.Event). Je hangt dan een andere listener aan de UpButton class waarnaar je luistert, en die dispatcht dan de CustomEvent events... Maar dat is echt meer werk hoor :).

theFlashWizard
%Europe/Berlin %793 %2008, 20:02
Dauntless,
Elk DisplayObject (dus ook buttons) extenden de EventDispatcher al. Als jij dit dit systeem een eigen subclass van de Event class wil sturen kan dat zonder problemen.

yeaha,
Ik denk dat je hier wel wat kan vinden over custom events:
Actionscript Tutorials -> events (http://www.flashfocus.nl/forum/showthread.php?t=6338#events)
Daarnaast blijf ik toch ook altijd een behoorlijk boek aanraden boven tutorials en zelf aanrommelen:
Actionscript Tutorials -> Boeken (http://www.flashfocus.nl/forum/showthread.php?t=6338#boeken)

Dauntless
%Europe/Berlin %032 %2008, 01:46
Hm, ok, maar dan moet je toch nog altijd de Button class subclassen, de MOUSE_OVER in je button class opvangen en dan zelf je custom event dispatchen? Die oplossing is dan toch minstens even veel werk als de oplossing die ik eerst voorstelde? (Niet dat je geen gelijk hebt natuurlijk dat het wel wat minder werk is dan ik eerst aangaf).

TheDutch
%Europe/Berlin %415 %2008, 10:58
Custom Events werken in een snel voorbeeld zo:

CustomEvent.as

package events
{
import flash.events.Event;

public class CustomEvent extends Event
{
public static const TYPE_1:String = "type1";
public static const TYPE_2:String = "type2";
public static const TYPE_3:String = "type3";
public static const TYPE_4:String = "type4";
public static const TYPE_5:String = "type5;

public var customVar1:String;
public var customVar2:String;
public var customVar3:String;

public function CustomEvent(type:String, customVar1:String, customVar2:String, customVar3:String, bubbles:Boolean = false, cancelable:Boolean = false)
{
super(type, bubbles, cancelable);

this.customVar1 = customVar1;
this.customVar2 = customVar2;
this.customVar3 = customVar3;
}
}
}


Main.as

package
{
import events.CustomEvent;

public class Main extends Sprite
{
public function Main()
{
var event:CustomEvent;

this.addEventListener(CustomEvent.TYPE_2, customEventHandler);

event = new CustomEvent(CustomEvent.TYPE_2,"een","twee","drie");
this.dispatchEvent(event);
}

private function customEventHandler(event:CustomEvent):void
{
trace(event.type) // type2

trace(event.customVar1); // een
trace(event.customVar2); // twee
trace(event.customVar3); // drie
}
}
}

Dauntless
%Europe/Berlin %425 %2008, 11:12
Maar stel dat je dus een custom event wil dispatchen als gevolg van een ENTER_FRAME of een MOUSE_DOWN, dan moet je toch eerst die standaard event opvangen en dan van daaruit je eigen event dispatchen, niet?

TheDutch
%Europe/Berlin %476 %2008, 12:26
Dat zou inderdaad zo moeten ja :).

joranderaaff
%Europe/Berlin %497 %2008, 12:56
Ik heb zoiets ook gedaan. Ik had een plaatjes-gallery waar ik informatie aan een plaatje wilde koppelen. Die informatie moest worden meegestuurd aan een overkoepelende class op het moment dat een plaatje geladen moest worden. Ik heb toen een eigen ImageLoader class geschreven waar je een URL aan kon meegeven samen met een object waar je informatie in kwam. Na het laden gooide hij een event terug met de informatie die je opgetsuurd had, en een referentie naar het displayObject (een Loader dus).