Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 11.04.2010, 14:44
MidnightOne вне форума Посмотреть профиль Отправить личное сообщение для MidnightOne Найти все сообщения от MidnightOne
  № 11  
Ответить с цитированием
MidnightOne
 
Аватар для MidnightOne

Регистрация: Jan 2010
Сообщений: 62
Сколько людей уже задавались этим вопросом!

Есть ещё одно решение, оно "как бы" не через задний проход.
создать функцию, которая потом будет вызывать нужную уже с параметрами, и вписать её в ивент лисенер.
Код AS3:
addEventListener(MouseEvent.CLICK, BlablaCaller);
 
function BlablaCaller (e:MouseEvent){ // В скобки вообще можно вставить заглушку Null (обязательно с большой), если передаваемые лисенером данные не нужны. 
    Blabla (Arg, e); // Но е можно и не передавать, это зависит от надобности.
}
 
function Blabla (arg, e:MouseEvent){
 
}
Но в этом случае придётся делать переменную полем класса. А, собственно, почему нет?


Последний раз редактировалось MidnightOne; 11.04.2010 в 14:50.
Старый 11.04.2010, 15:17
mickfallout вне форума Посмотреть профиль Отправить личное сообщение для mickfallout Найти все сообщения от mickfallout
  № 12  
Ответить с цитированием
mickfallout
 
Аватар для mickfallout

Регистрация: Jun 2009
Адрес: Москва
Сообщений: 170
Цитата:
Сообщение от MidnightOne Посмотреть сообщение
Есть ещё одно решение, оно "как бы" не через задний проход.
создать функцию, которая потом будет вызывать нужную уже с параметрами, и вписать её в ивент лисенер.
Код AS3:
addEventListener(MouseEvent.CLICK, BlablaCaller);
 
function BlablaCaller (e:MouseEvent){ // В скобки вообще можно вставить заглушку Null (обязательно с большой), если передаваемые лисенером данные не нужны. 
    Blabla (Arg, e); // Но е можно и не передавать, это зависит от надобности.
}
 
function Blabla (arg, e:MouseEvent){
 
}
Мне кажется что создавать обработчик события который невозможно отключить - плохая идея. function BlablaCaller доступна только внутри функции, придется или писать removeEventListener внутри того же вызова функции, или не писать нигде.

Старый 11.04.2010, 16:32
MidnightOne вне форума Посмотреть профиль Отправить личное сообщение для MidnightOne Найти все сообщения от MidnightOne
  № 13  
Ответить с цитированием
MidnightOne
 
Аватар для MidnightOne

Регистрация: Jan 2010
Сообщений: 62
Цитата:
Сообщение от mickfallout Посмотреть сообщение
Мне кажется что создавать обработчик события который невозможно отключить - плохая идея. function BlablaCaller доступна только внутри функции, придется или писать removeEventListener внутри того же вызова функции, или не писать нигде.
Нет. Он не внутри функции.

removeEventListener(MouseEvent.CLICK, BlablaCaller); можно написать где угодно.

Старый 11.04.2010, 17:11
mickfallout вне форума Посмотреть профиль Отправить личное сообщение для mickfallout Найти все сообщения от mickfallout
  № 14  
Ответить с цитированием
mickfallout
 
Аватар для mickfallout

Регистрация: Jun 2009
Адрес: Москва
Сообщений: 170
Цитата:
Сообщение от MidnightOne Посмотреть сообщение
Нет. Он не внутри функции.
не понимаю... тогда зачем вторая функция? не проще ли вместо
Код AS3:
addEventListener(MouseEvent.CLICK, BlablaCaller);
 
function BlablaCaller (e:MouseEvent){ // В скобки вообще можно вставить заглушку Null (обязательно с большой), если передаваемые лисенером данные не нужны. 
    Blabla (Arg, e); // Но е можно и не передавать, это зависит от надобности.
}
 
function Blabla (arg, e:MouseEvent){
 /*тут описывать что надо делать*/
}
использовать
Код AS3:
addEventListener(MouseEvent.CLICK, Blabla);
 
function Blabla (e:MouseEvent, arg = Arg){
  /*тут описывать что надо делать*/
}
P.S. лучше писать полностью весь код, например так:
Код AS3:
package {
    import flash.display.MovieClip;
    import flash.events.*;
    public class Main extends MovieClip {
        private var arg:String="Argument";
        public function Main() {
            super();
            stage.addEventListener(MouseEvent.CLICK, blabla);
        }
 
        private function blabla (e:MouseEvent, stringArgument:String = null):void {
            if (stringArgument == null)
                stringArgument = arg;
            trace(arg + " received");
            /*тут описывать что надо делать*/
        }
    }
}


Последний раз редактировалось mickfallout; 11.04.2010 в 17:25.
Старый 11.04.2010, 17:30
Artic вне форума Посмотреть профиль Найти все сообщения от Artic
  № 15  
Ответить с цитированием
Artic
Banned

Регистрация: Jun 2009
Сообщений: 298
мне когда лениво поднимать кастомный класс я делаю так

Код AS3:
private var hash:Dictionary = new Dictionary();
...
var someButt:Sprite = new Sprite();
someButt.graphics.beginFill(0xff0000);
someButt.graphics.drawRect(0,0,50,50);
someButt.graphics.endFill();
addChild(someButt);
var thumbs:InteractiveObject = someButt as InteractiveObject;
thumbs.addEventListener(MouseEvent.CLICK,doIt);
hash[thumbs] = "argument"
 
private function doIt(event:Event):void
{
    var target:InteractiveObject = event.target as InteractiveObject;
    trace(hash[target]) // argument;
}

Старый 11.04.2010, 17:45
udaaff вне форума Посмотреть профиль Отправить личное сообщение для udaaff Найти все сообщения от udaaff
  № 16  
Ответить с цитированием
udaaff
...

модератор форума
Регистрация: Sep 2006
Адрес: Minsk
Сообщений: 4,286
MidnightOne, mickfallout, автор хочет передать параметр вместе с событием, т.е. сама переменная необязательно должна быть доступна в объекте, в котором вы подписываетесь на это событие. Событие, вообще, может, например, всплывать от какого-то ребенка, который будет передавать значение своей приватной переменной вместе с этим событием. Поэтому ваши способы не являются решением и равносильны тому, чтобы просто создать в классе дополнительное поле для хранения этого параметра.

Старый 11.04.2010, 18:21
mickfallout вне форума Посмотреть профиль Отправить личное сообщение для mickfallout Найти все сообщения от mickfallout
  № 17  
Ответить с цитированием
mickfallout
 
Аватар для mickfallout

Регистрация: Jun 2009
Адрес: Москва
Сообщений: 170
Цитата:
Сообщение от udaaff Посмотреть сообщение
mickfallout, автор хочет передать параметр вместе с событием, т.е. сама переменная необязательно должна быть доступна в объекте, в котором вы подписываетесь на это событие.
ну в таком виде как раз локальная переменная функции(function Main) передается в обработчик. в объекте она недоступна.
Код AS3:
package {
	import flash.display.MovieClip;
	import flash.events.*;
	public class Main extends MovieClip {
		public function Main() {
			super();
			var localArg:String = "local Argument";
			var handler:Function = function(event:Event):void { multiArgumentHandler(event, localArg, handler); };
			addEventListener(Event.ENTER_FRAME, handler);
		}
		public function multiArgumentHandler(event:Event, argument:String,handler:Function):void {
			trace("localArgument = "+ argument );
			removeEventListener(Event.ENTER_FRAME, handler);
		}
	}
}
Цитата:
Сообщение от gait Посмотреть сообщение
думал, что может быть есть простое решение (типа addEventListener(Event.ENTER_FRAME, traceNumEnterFrame(myVar))
Итого: вместо
Код AS3:
addEventListener(Event.ENTER_FRAME, traceNumEnterFrame(myVar))
писать
Код AS3:
var handler:Function = function(event:Event):void { traceNumEnterFrame(myVar); };
addEventListener(Event.ENTER_FRAME, handler);
и не забывать думать о том что если подписываешься на событие - скорее всего нужно будет и отписаться.

Старый 11.04.2010, 19:03
udaaff вне форума Посмотреть профиль Отправить личное сообщение для udaaff Найти все сообщения от udaaff
  № 18  
Ответить с цитированием
udaaff
...

модератор форума
Регистрация: Sep 2006
Адрес: Minsk
Сообщений: 4,286
Цитата:
и не забывать думать о том что если подписываешься на событие - скорее всего нужно будет и отписаться.
И как вы будете отписывать вне обработчика? И в чём преимущество вашего подхода перед
Цитата:
просто создать в классе дополнительное поле для хранения этого параметра.
?

Старый 11.04.2010, 19:40
mickfallout вне форума Посмотреть профиль Отправить личное сообщение для mickfallout Найти все сообщения от mickfallout
  № 19  
Ответить с цитированием
mickfallout
 
Аватар для mickfallout

Регистрация: Jun 2009
Адрес: Москва
Сообщений: 170
Цитата:
И в чём преимущество вашего подхода перед
Цитата:
просто создать в классе дополнительное поле для хранения этого параметра.
Очевидно в том что оно там не хранится =) Вроде это автор темы хотел передавать в обработчик локальные переменные а не я =)
А вообще такую ситуацию можно представить:
Код AS3:
package {
    import flash.display.MovieClip;
    import flash.events.*;
    public class Main extends MovieClip {
        private var counter:int = 0;
        public function Main() {
            super();
                                  addEventListener(Event.ENTER_FRAME, enterFrameHadler);
            sayHelloManyTimes("mickfallout");
            sayHelloManyTimes("udaaff");
        }
        private function enterFrameHadler(event:Event):void {
            counter++;
        }
        private function sayHelloManyTimes(name:String):void {//здоровается с заданным человеком каждый кадр до десятого
            var handler:Function = function(event:Event):void { multiArgumentHandler(event, name, handler); };
            addEventListener(Event.ENTER_FRAME, handler);
        }
        public function multiArgumentHandler(event:Event, argument:String,handler:Function):void {
            if (counter > 10)
                removeEventListener(Event.ENTER_FRAME, handler);
            trace("Hello, " + argument );
        }
    }
}

Старый 11.04.2010, 20:11
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 20  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Самый сакраментальный вопрос - а зачем? EventDispatcher хочет вызывать слушателя с одним параметром, который сам же и создает - зачем его насиловать? Если вам очень нужно больше параметров - не пользуйтесь EventDispatcher - напишите функцию, которая принимает больше параметров и вызовите ее...
__________________
Hell is the possibility of sanity

Создать новую тему Ответ Часовой пояс GMT +4, время: 19:21.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Теги
anonimous function , вложенность
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 19:21.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.