Volledige versie bekijken : variabele aanspreken vanuit verschillende classes
jaspersteenbergen
%Europe/Berlin %406 %2009, 09:44
ik heb in mijn docClass de volgende functie:
public function controle (select:String)
{
mainSelect = select;
}
uiteindelijk wil ik dat ik vanuit een button-class deze 'mainSelect' kan beinvloeden. Deze wijzigt dus iedere keer als ik op een andere button klik.
Zelf had ik in de button-class:
public class MainButton extends BasicButton
{
//VARS
public var thisLabel:TextField;
private var myLabel:String;
//FUNCTIONS
public function MainButton (thisName:String)
{
// configurate button
thisLabel.text = thisName;
thisLabel.mouseEnabled = false;
myLabel = thisName;
buttonMode = true;
useHandCursor = true;
// listeners
this.addEventListener (MouseEvent.MOUSE_DOWN, fcDown);
}
private function fcDown (e:MouseEvent)
{
trace(myLabel)
controle(myLabel)
}
}
de 'trace(myLabel)' werkt gewoon indien men op de button klikt.
Welke denkfout maak ik?
Dauntless
%Europe/Berlin %464 %2009, 11:08
Je MainButton kent geen controle() functie. Hij zoekt ze nu in zichzelf (en vindt ze niet). De MainButton zou ook geen controle() functie mogen kennen. Dat is een methode van de parent classe en zo breek je de encapsulation regel. Jouw button moet niet beslissen wat hij doet (door control(mylabel)) op te roepen; dat moet de classe die je button gebruikt doen.
Je moet het hier oplossen door event listeners te gebruiken. Ofwel maak je je eigen event listener en dispatch je die vanuit de fcDown method, ofwel laat je de document classe gewoon rechtstreeks naar MouseEvent.MOUSE_DOWN luisteren.
jaspersteenbergen
%Europe/Berlin %828 %2009, 19:52
in principe heb ik dat voor elkaar gekregen. Ik geeft de 'status' nu aan de verschillende buttons door als je er op klikt. Wat me nog niet lukt is om bij het klikken op een specifieke button ook de andere buttons te benaderen voor hun status. (Deze moeten weer 'uit' gezet worden)
Gedeelte uit DocClass:
private function createButtons ()
{
for (i = 0; i < 4; i++)
{
// button wordt gecofigureerd
var mainButton:MainButton = new MainButton(myArray[i]);
mainButton.x = 350;
mainButton.y=120+(60*i);
mainButton.addEventListener (MouseEvent.MOUSE_DOWN, fcSelect);
// button wordt aan displaylist toegevoegd
this.addChild (mainButton);
// button krijgt een naam
mainButton.name = myArray[i];
// de status wordt op 'false' gezet
mainButton.thisState = false;
}
}
private function fcSelect (e:MouseEvent)
{
// geklikte button wordt in variable opgeslagen
target = e.currentTarget;
// de naam van van de button wordt in een var opgeslagen
nowSelect = target.name;
// de status van de button wordt op 'true' gezet
target.thisState = true;
// geeft naam van de button
}
hoe kan ik dit het beste doen. Ik zit al een tijd de 'vogelen' met de instancenamen, maar dat krijg ik niet aan de praat.
Logischerwijs zou ik eigenlijk vanuit de buttonclass willen checken wat de huidig geselecteerde button is (nowSelect) zodat ik daar een if/else constructie kan bouwen, maar ik begrijp dat dat niet kan. Dat wil zeggen dat ik in deze DocClass alle buttons moet langslopen om hun status te wijzigen?
mknol
%Europe/Berlin %874 %2009, 20:58
Je zou een functie kunnen maken, waarbij je als parameter aan de functie meestuurt welke actief moet worden. De rest wordt dan niet actief. Je krijgt dan zoiets:
var buttonList:Array = [];
var totalButtons:uint = 4;
private function createButtons ():void
{
for (var i:int = 0; i < totalButtons; i ++)
{
var mainButton:MainButton = new MainButton(myArray[i]);
mainButton.x = 350;
mainButton.y = 120 + (60 * i);;
mainButton.addEventListener (MouseEvent.MOUSE_DOWN, onMainButtonClick);
this.addChild (mainButton);
mainButton.thisState = false;
// voeg button aan array toe
buttonList.push(mainButton)
}
}
private function onMainButtonClick (e:MouseEvent):void
{
var target:MainButton = e.currentTarget as MainButton;
switchButtonState ( target );
}
private function switchButtonState( activeButton:MainButton ):void
{
for (var i:int = 0; i < totalButtons; i ++) // loop door alle buttons heen
{
var button:MainButton = buttonList[i];
if (button == activeButton)
{
button.thisState = true; // active button
}
else
{
button.thisState = false; // overige buttons - inactief
}
}
}
jaspersteenbergen
%Europe/Berlin %943 %2009, 22:37
Ik heb het al opgelost.
Ik heb een ENTER_FRAME event aan de buttons toegekend in mijn DocClass.
Inprincipe op de zelfde manier als MOUSE_DOWN.
Vervolgens check ik of beide targets overeen komen.
vBulletin® v3.8.1, Copyright ©2000-2012, Jelsoft Enterprises Ltd.