Форум 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);
}



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

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