Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Передача переменной в функцию через слушатель (http://www.flasher.ru/forum/showthread.php?t=136030)

uglan 08.02.2010 11:35

Передача переменной в функцию через слушатель
 
Привет всем!
Есть такой примерный код:

Код AS3:

test_msg("test")
function test_msg(msg:String){
        trace(msg);//Выведет "test"
}

Тут все ок работает.
А вот немного модифицированный код:
Код AS3:

import flash.events.MouseEvent;
 
var obj:Object = new Object;// Тут не важно, что объект не материальный, на его месте может быть и мувик и все что угодно, все равно не работает.
 
obj.addEventListener(MouseEvent.CLICK,test_msg("test"));
 
function test_msg(msg:String){
        trace(msg);
}

В этом случае частично выполняет код - функция трейсится, но при этом далее выводит ошибку:
test
TypeError: Error #1006: addEventListener is not a function.
at Untitled_fla::MainTimeline/frame1()


В чем я не прав?:o

ExtendedPlay 08.02.2010 12:52

Интересует тоже вопрос, хотя по-моему никак не передать)

Код AS3:

obj.addEventListener(MouseEvent.CLICK,test_msg("test"));

Цитата:

Не используйте скобки, указывая параметр listener. Например, функция clickHandler() указывается без скобок в следующем вызове метода addEventListener():
addEventListener(MouseEvent.CLICK, clickHandler).

Почитал вот тут.
Ничего на эту тему не нашел) хотя может что пропустил))))))))))

-------------------

хотя почему бы для obj не указать дополнительное свойство. Например:
Код AS3:

obj.msg = 'test message';
obj.addEventListener(MouseEvent.CLICK,test_msg);

тогда по-идее в test_msg можно его вытащить:
Код AS3:

function test_msg(e:Event){
        trace(e.target.msg);
}


random13 08.02.2010 12:58

лучше через слушатель ничего не передавать, это не совсем правильно, но можно либо колбек сделать анонимный или внутри колбека поместить еще одну функцию и ей уже передавать эвент, но это все не есть правильно

uglan 08.02.2010 13:28

Цитата:

Сообщение от random13 (Сообщение 884809)
лучше через слушатель ничего не передавать, это не совсем правильно, но можно либо колбек сделать анонимный или внутри колбека поместить еще одну функцию и ей уже передавать эвент, но это все не есть правильно

Обьясню зачем это нужно. Есть несколько объектов которые вызывают одну и ту же функцию(отличие лишь во флаге). Объектов много, допустим 20. И чтобы обработать каждый мне придется написать для каждого однотипные функции. Это какой то хардкодинг...
Через obj вариант, только в основном коде у меня используется не MouseEvent который e:target передавать не умеет.

random13 08.02.2010 13:45

вопрос а что у вас
Код AS3:

e.target

возвращает?

uglan 08.02.2010 14:11

точнее проблема получается в создании msg переменной внутри объекта.
просто
Код AS3:

e.target

возвращает
6: x:150 y:250 z:450

А если присвоить
Код AS3:

plane.msg = "test"

, то получается:
1119: Access of possibly undefined property msg through a reference with static type org.papervision3d.objects.primitives:Plane.

random13 08.02.2010 14:15

Цитата:

Сообщение от uglan (Сообщение 884823)
точнее проблема получается в создании msg переменной внутри объекта.
просто
Код AS3:

e.target

возвращает
6: x:150 y:250 z:450

А если присвоить
Код AS3:

plane.msg = "test"

, то получается:
1119: Access of possibly undefined property msg through a reference with static type org.papervision3d.objects.primitives:Plane.

что то я видимо уже не понимаю, извините а для чего нужно свойство target, вряд ли для передачи каких либо координат, или я отстал от жизни?

Hidest 08.02.2010 14:22

Делайте свой эвент, отправляйте его с любыми параметрами, слушаете его где надо и спокойно получается параметры.

random13 08.02.2010 14:27

Цитата:

Сообщение от Hidest (Сообщение 884826)
Делайте свой эвент, отправляйте его с любыми параметрами, слушаете его где надо и спокойно получается параметры.

ну вобщем то здравое решение, тупо переопределить все что вам нужно и добавить туда свойство типа data

uglan 08.02.2010 14:44

Цитата:

Сообщение от Hidest (Сообщение 884826)
Делайте свой эвент, отправляйте его с любыми параметрами, слушаете его где надо и спокойно получается параметры.

Эм... А нельзя ли поподробнее) Никогда раньше не создавал своих ивентов.

Цитата:

что то я видимо уже не понимаю, извините а для чего нужно свойство target, вряд ли для передачи каких либо координат, или я отстал от жизни?
Для того чтобы написать лишь одну функцию которая будет обрабатывать все объекты которые на нее ссылаются независимо от их имен. Пример:
Код AS3:

var plane1:Plane = new Plane;
var plane2:Plane = new Plane;
...
plane1.indx = "test1";
plane1.addEventListener(InteractiveScene3D.OBJECT_CLICK,test_msg);
 
plane1.indx = "test2";
plane1.addEventListener(InteractiveScene3D.OBJECT_CLICK,test_msg);
 
function test_msg(e:Event){
  trace(e.target.indx);
}


MrPoma 08.02.2010 15:01

Код AS3:

package{
        import flash.events.Event;
 
        public class LOLEvent extends Event{
                public static const LOL:String = 'lol';
 
                private var _lol:String;
                public function get lol():Stirng{
                        return this._lol;
                }
 
                public function LOLEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false, lol:String=''){
                        super(type, bubbles, cancelable);
                        this._lol = lol;
                }
 
                public override function clone():Event{
                        return new LOLEvent(super.type, super.bubbles, super.cancelable, this._lol);
                }
        }
}

Код AS3:

super.addEventListener(LOLEvent.LOL, this.handlerLOL);
super.dispatchEvent(new LOLEvent(LOLEvent.LOL, false, false, 'ha-ha-ha'));
private function handlerLOL(event:LOLEvent):void{
        trace(event.lol);
}


uglan 08.02.2010 15:22

Сейчас попробую)

Добавлено через 55 минут
хм...класс работает, спасибо)
Но как мне его использовать в качестве реагирования на клик и наведение/отведение мышки?

zuxul 08.02.2010 17:33

В качестве реагирования на клик и наведение/отведение мышки нужно использовать функцию принимающую параметр MouseEvent
Код AS3:

function lolFunction (e:MouseEvent):void {...}

Если повесить эту функцию на несколько объектов, то нужно использовать e.target и e.currentTarget (Вам уже об этом говорили, но Вы это игнорируете)

wvxvw 08.02.2010 17:49

Когда срабатывает колбек то ситуации в которой ваша переменная объявленная в классе слушателе или в классе диспатчере недоступна просто не может быть потому что обе эти области видимости вам будут извесны в колбеке, первая - this, вторая - Event#target / Event#currentTarget - вы просто не там ищите. А передать дополнительные параметры в функцию у которой сигнатура это не позволяет не возможно никак, более того, это протовоестесственно и абсолютно противоречит здравому смыслу.

uglan 08.02.2010 18:26

Цитата:

В качестве реагирования на клик и наведение/отведение мышки нужно использовать функцию принимающую параметр MouseEvent
Смысл тогда писать свой ивент? Если все равно используется стандартный MouseEvent? Я чот запутался. Как я получу текстовую переменную пользуясь этим.

Цитата:

Если повесить эту функцию на несколько объектов, то нужно использовать e.target и e.currentTarget (Вам уже об этом говорили, но Вы это игнорируете)
Попробовал currentTarget - результат тот же. Что я делаю не так?

Цитата:

А передать дополнительные параметры в функцию у которой сигнатура это не позволяет не возможно никак, более того, это протовоестесственно и абсолютно противоречит здравому смыслу.
Не вижу тут ничего противоречивого. Есть куча объектов есть функция которая должна их обработать по одному единственному параметру который передается с помощью отлова события CLICK. Не ужели нет простого способа реализовать это?

wvxvw 08.02.2010 19:07

Цитата:

Сообщение от uglan (Сообщение 884920)
Не вижу тут ничего противоречивого. Есть куча объектов есть функция которая должна их обработать по одному единственному параметру который передается с помощью отлова события CLICK. Не ужели нет простого способа реализовать это?

Противоестественно то, что функции задан тип: Event->void, задан не вами, а API которые вы изменить не можете. Т.е. это все равно, что вы бы жаловались на то, что переменной булевого типа не получается присвоить строку. Естественно не получится. А по поводу ответа - прочитайте еще раз предыдущее сообщение, там он как бы уже присутствует.

uglan 09.02.2010 12:18

Большое спасибо! Я уже сказал что не понял как мне воспользоваться этими советами и было бы здорово если ответ был бы немного доступнее. Я не претендую на профи в cs3. А ваш совет все равно что отправить меня читать хелп по as3, там ответ есть, я не сомневаюсь. Для чего тогда этот форум?

Wolsh 09.02.2010 13:06

Обстановка накаляется?))) Давайте-ка все выдохнем.
uglan, дело в том что Вы обрабатываете не просто вообще событие, а совершенно конкретное событие наведения курсора на объект. Вы подписались на него. Именно на него. При наступлении именно конкретно этого события создается и рассылается совершенно конкретный Объект События. Этот самый Объект События является ЕДИНСТВЕННЫМ и предопределенным параметром, передаваемым в функцию-обработчик ЭТОГО КОНКРЕТНОГО события. Ваш обработчик не должен принимать в качестве параметра ничего, кроме объекта события именно того Класса, на который он подписан. В данном случае это MouseEvent, и событие Мыши никак не предполагает передачу сообщений - это мышь, а не окно чата. Вы используете стандартное событие, и не пытайтесь его перестроить под свое видение - оно идеально для тех целей, для которых создано. О наведении мыши на объект оно рассказывает абсолютно все подробности. Но Вам хочется совершенно другого - Вам не нужны параметры мыши, Вам нужны параметры объекта. Он - в переменной target.
Вот теперь думаем. Раз Вы не можете завести нужное поле msg:String у этих объектов (их Класс не динамический), то наверное стоит воспользоваться утилитой Dictionary, позволяющей "привязать" к любому Объекту какое-то значение или ссылку.
Код AS3:

private var _planeMessages:Dictionary = new Dictionary();
_planeMessages[plane1] = "я первый план";
_planeMessages[plane2] = "я второй план";
_planeMessages[plane3] = "я третий план";

И далее, в обработчике, получая ссылку на объект из target, мы обращаемся к нашему справочнику и получаем привязанное к нему свойство
Код AS3:

function test_msg ( event:MouseEvent ):void {
        trace( _planeMessages[event.target] );
}


uglan 09.02.2010 13:14

Вау!) Спасибо. Вот теперь действительно понятная и полезная информация.

Попробовал — все работает как надо))) СПАСИБО!

SchSvetlana 28.06.2012 21:53

Wolsh, спасибо, очень понятно написал, попробовала пример сделать, такая же проблема была. Получилось все в лучшем виде. Респект тебе и уважуха :)

dimarik 29.06.2012 00:25

http://www.flasher.ru/forum/showthread.php?t=147849


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

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