AS3: Clicking a button via actionscript - actionscript-3

This is my very simple code:
g2.addEventListener(MouseEvent.CLICK, buttG2);
function buttG2(event:MouseEvent):void
{
buttonNote="G2";
addWholeNote();
}
It works great when I click the button, but is it possible to fire this function from another function using Actionscript?

In some other function:
function otherFunction() {
buttG2(null);
}
You pass in null since it is never used. You could also give the parameter a default value like this:
function buttG2(event:MouseEvent = null):void
{
buttonNote="G2";
addWholeNote();
}
And then call the function without any parameters as event will then be null as per default:
function otherFunction() {
buttG2();
}

Use a default parameter of null to allow the function call from elsewhere in your code. You won't be able to get any mouseevent data, but that's probably not an issue. You could pass null into your function as you have it, but I find this to be cleaner.
g2.addEventListener(MouseEvent.CLICK, buttG2);
function buttG2(event:MouseEvent = null):void
{
buttonNote="G2";
addWholeNote();
}
call it like any other function, the param is now optional.
buttG2();

Related

Action Script 3: Calling String variable as function

I have a function,
function tempFeedBack():void
{
trace("called");
}
and event listener works perfect when I write function name directly like this,
thumbClip.addEventListener(MouseEvent.CLICK, tempFeedBack);
But, when I give the function name as string like this,
thumbClip.addEventListener(MouseEvent.CLICK, this["tempFeedBack"]());
It is not working! It says, TypeError: Error #1006: value is not a function.
Any ideas?
You got that error because simply this["tempFeedBack"]() is not a Function object, which is the listener parameter of the addEventListener() function, in addition, it's nothing because your tempFeedBack() function cannot return any value.
To more understand that, what you have wrote is equivalent to :
thumbClip.addEventListener(MouseEvent.CLICK, tempFeedBack());
Here you can see that you have passed the returned value of your tempFeedBack() function as the listener parameter which should be a Function object, but your tempFeedBack() can return nothing !
So, just to explain more, if you want that what you have wrote work, you should do something like this :
function tempFeedBack():Function
{
return function():void {
trace("called");
}
}
But I think that what you meant is :
// dont forget to set a MouseEvent param here
function tempFeedBack(e:MouseEvent):void
{
trace("called");
}
stage.addEventListener(MouseEvent.CLICK, this["tempFeedBack"]);
// you can also write it
stage.addEventListener(MouseEvent.CLICK, this.tempFeedBack);
Hope that can help.

AS3: Returning value from another function after event happened

Basically I want to check if a user exists in a database using AMF (and that works great!). But then I want to return the boolean value to another function (in another class) that originally called the "checkUserExistance" function. But, since the database connection isn't immidiate, this function will always return a false value (even if "result" is true). So I would like to have the return-line inside the "onUserChecked"-function but that of course gives me an error. I thought I could create an eventListener, but then, the "return userExists"-line would also have to be inside another function, which doesnät work(?)... What can I do?
public function checkUserExistance(username:String) {
var responderBOOLEAN:Responder = new Responder(onUserChecked, onFault)
var userExists:Boolean = false;
connection.connect(gateway);
connection.call("User.checkUser", responderBOOLEAN, username);
connection.close();
function onUserChecked(result:Boolean):void {
userExists = result;
}
return userExists;
}
I'm sorry but you are trying to force an Asynchronous call to a Synchronous one and this is WRONG.
See here
You should learn how to handle events in the correct way.
What can i suggest you that helped me a lot is this
The only true answer here is to save userExists as a member variable, and dispatch event when the server returns you a response. The client side of the things should be similar to:
// add listener, ServerEvent is a custom event (see below)
server.addEventListener(ServerEvent.CHECK_RESPONSE, onCheckResponse);
server.checkUserExistance('username'); // start the query
function onCheckResponse(e:ServerEvent):void {
if (e.userExists) {
}
}
// inside server class
function onUserChecked(result:Boolean):void {
userExists = true;
dispatchEvent(new ServerEvent(ServerEvent.CHECK_RESPONSE, userExists));
}
/* ServerEvent is a custom class that extens Event
Such classes are used so you can pass special properties in them
via constructor (pass data, store it into member variable)
and through getter for that variable.
If you don't like it, simply add/dispatch Event.COMPLETE
and use public property to get userExists from server
*/

AS3/Flash: Calling a function MouseEvent from a datagrid click

I'm calling a function by clicking a button:
searchBT.addEventListener(MouseEvent.CLICK,searchXML);
function searchXML(Event:MouseEvent)
I want to call the same function from a datagrid.
Right now, when clicking on the datagrid several dynamic text fields are filled with the data of the clicked row.
I nead to perform the function (searchXML) at the same time. This and other calls result in errors:
fullList.dataGrid.addEventListener(ListEvent.ITEM_CLICK, clickGrid);
function clickGrid(e:ListEvent):void
{
searchXML(Event);
...
}
Any idea?
Cheers.
It is because the searchXML method waits for argument of MouseEvent type. You can redefine this method like this:
function searchXML(Event:MouseEvent = null)
And call it simple:
function clickGrid(e:ListEvent):void
{
searchXML();
// ...
}

Calling certain functions whitout having the right arguments

I have two function on my AS3 program, one fires when the width and height changes:
stage.addEventListener(Event.RESIZE, resizeListener);
function resizeListener (e:Event):void {
//some commands
}
And the second one fires one a number of milliseconds pass:
var myTimer:Timer = new Timer(clockUpdate, 0);
myTimer.addEventListener(TimerEvent.TIMER, updateData);
myTimer.start();
function updateData(e:TimerEvent):void {
trace("AUTOUPDATE");
trace(e);
}
I need to fires those function also manually, lets say when the user press a button, but i don't know what parameters i have to send them when they are called manually.
I tried just resizeListener() and updateData() but of course it fails asking me for the parameter.
You can make parameters in a function optional by providing a default value. This is an example by taking your two functions above and making the event parameters optional:
function resizeListener(e:Event = null):void {
//some commands
}
and
function updateData(e:TimerEvent = null):void {
trace("AUTOUPDATE");
trace(e);
}
Calling, for example, resizeListener() will now execute the function and the value of e will default to null.
Making the Event parameter optional, resizeListener(e:Event=null), as in walkietokyo's answer, is a perfectly valid and often convenient solution. Another alternative is to put the stuff you want to be able to do without the event being triggered in a separate function, that can be called by the event handler and from anywhere else.
So assuming for example that what you want to do on resize is to rearrange the layout, and you also want to do that same layout setup at initialization, or at the click of a button, or anytime really, you could do something like this:
stage.addEventListener(Event.RESIZE, resizeListener);
function resizeListener(e:Event):void {
rearrangeLayout();
}
function rearrangeLayout():void {
// The actual rearrangement goes here, instead of in resizeListener. This can be called from anywhere.
}
Which way to do it is probably a matter of taste or can vary from case to case, really, both works fine.
A benefit of separating things in an event handler and another function is that there will not arise a situation where you would have to check if the e:Event parameter is null or not. In other words, you would have code that is dependent on the Event, if any, in the event handler, and code that is independent of the Event in a more general function (not an event handler).
So in a more general and schematic case, the structure would be something like this:
addEventListener(Event.SOME_EVENT, eventListener);
function eventListener(e:Event):void {
// Code that needs the Event parameter goes here (if any).
// Call other function(s), for the stuff that needs to be done when the event happens.
otherFunction();
}
function otherFunction():void {
// Stuff that is not dependent on the Event object goes here, an can be called from anywhere.
}

how to match as3 function type declaration with differing calls?

private function playSound():void
{
_soundChannel = _soundObj.play();
_soundChannel.addEventListener(Event.SOUND_COMPLETE, nextTrack);
}
<s:Button width="35" label=">>" click="nextTrack();"/>
Assuming the nextSound() function looks the same as playSound, typewise... The button click works fine, but the event listener won't call the function because its sending an argument the function isn't expecting.
I can change the nextTrack function to be evt:Event, but then the button is sending not enough arguments, and I can't find anything to type it to that will work. I can make a typed function to call the un-typed nextTrack function from the event listener
public function callnextsong(evt:Event):void{
nextTrack();
}
But i feel like there's probably a less circuitous way of accomplishing it!
Use a default parameter:
public function nextTrack(evt:Event = null):void {
It can then be called with or without the caller supplying a parameter.