Форум 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=127395)

SeaQuest 13.07.2009 03:25

Передача параметров через кастом событие
 
Само событие выглядит так:
Код AS3:

package
{
    import flash.events.Event;
 
        public class SmartLoaderEvent extends Event
        {
                      public static const PROGRESS_UPDATE:String = "progress_update";
                      public var current:Number;
                  public var total:uint;
 
                public function SmartLoaderEvent(type:String)
                {
                            super(type);
                }
                      public override function toString():String
                      {
                            return formatToString("SmartLoaderEvent");
                      }
          }
}

Ну и как положено создаю экземпляр, записую в переменные что нужно и диспатчу.
Отлавливаю addEventListener(event:Event);
trace(event.total);
Пишет:
1119: Access of possibly undefined property total through a reference with static type flash.events:Event.

Корень проблемы ясен - приходит-то Event, а не мой кастом ивент(если вписать мое кастом событие тож ругается), но не доходит как реализовать и слышал, что есть решение. Какое?

udaaff 13.07.2009 03:30

addEventListener(event:Event) -- что это такое?
Цитата:

Ну и как положено создаю экземпляр, записую в переменные что нужно и диспатчу.
-- этот кусок кода можно увидеть?

SeaQuest 13.07.2009 03:35

Да, кстати, target и currentTarget учитываю, просто это не по-джедайски.

Добавлено через 4 минуты
Конечно:
Код AS3:

import SmartLoaderEvent;
 
private var progress_event:SmartLoaderEvent = new  SmartLoaderEvent(SmartLoaderEvent.PROGRESS_UPDATE);
progress_event.current = 5.5444;
progress_event.total = 20;
dispatchEvent(progress_event);


Мечтатель 13.07.2009 12:15

Я что-то вобще не пойму Ваш класс пользовательского события.
Мы начинаем с чего при создании пользовательского события?
1. Расширяем класс Event (это Вы успешно выполнили)
2. Затем создаем статическую переменную в описании класса, в которую записываем строковое имя нашего пользовательского события (это Вы тоже сделали)
3. В метод конструктор, в качестве параметров передаем имя события, указываем является ли оно всплывающим, обладает ли стандартным поведением, и свои дополнительные параметры.
4. Далее в метод конструктор суперкласса, коим в данном случае является расширяемый нами класс Event, мы должны передать параметры метода конструктора нашего класса (опуская свои дополнительные параметры) - тут у Вас не понятно что передается и откуда берется.
5.Перекрытие метода toString - сплошная загадка его реализация в Вашем коде.
6. Где обязательное перекрытие метода clone ???

в общем код пользовательского события - нечитаем и достаточно удивителен.
p.s. но не удивительно, то, что ничего не работает!

silin 13.07.2009 12:29

>>Отлавливаю addEventListener(event:Event);

тебе нужно слушать SmartLoaderEvent, у которого есть эти total и current, а не Event, у которого их нет, о чем компилятор и сообщает

SeaQuest 13.07.2009 12:44

Цитата:

тебе нужно слушать SmartLoaderEvent, у которого есть эти total и current, а не Event, у которого их нет, о чем компилятор и сообщает
- так и делаю, о чем и писал -
Цитата:

Корень проблемы ясен - приходит-то Event, а не мой кастом ивент(если вписать мое кастом событие тож ругается)
- то есть слушаю мой кастом ивент а флеш ошибку на 4 строки кидает.

Цитата:

5.Перекрытие метода toString - сплошная загадка его реализация в Вашем коде.
6. Где обязательное перекрытие метода clone ???
ЭТО не мой код! Я сам не понял загадку с toString. А теперь самое интересное. Этот код взят с Tips and Tricks ветки! http://flasher.ru/forum/showthread.php?t=79874

Добавлено через 57 минут
Кто уже решил эту проблему направьте на путь истиный.

SunShadow 13.07.2009 14:32

Цитата:

Сообщение от SeaQuest (Сообщение 835017)
Ну и как положено создаю экземпляр, записую в переменные что нужно и диспатчу.
Отлавливаю addEventListener(event:Event);
trace(event.total);
Пишет:
1119: Access of possibly undefined property total through a reference with static type flash.events:Event.

Если хочешь увидеть свой total то сделай просто так

Код AS3:

trace((event as SmartLoaderEvent).total);

ты в функции получаешь через event ссылку на объект типа Event о чем тебе и сообщает компилятор. Хотя по сути объект является SmartLoaderEvent, но чтобы компилятор воспринимал его как таковой к нему нужно привести твой event

SeaQuest 13.07.2009 15:14

SunShadow, спасибо!
Решили с коллегой этот вопрос. Оказуется кастом ивенту нужно обязательно создать функцию clone ибо событие приходит в виде клона кастома ивента. Соответственно, клон должен помнить параметры нашего ивента.
Вот рабочий класс кастом ивента:
Код AS3:

package
{
    import flash.events.Event;
 
        public class SmartLoaderEvent extends Event
        {
        public static const PROGRESS_UPDATE:String = "progress_update";
        public var current:Number;
                public var total:Number;
 
 
                public function SmartLoaderEvent(type:String, current_value = NaN, total_value = NaN, bubbles:Boolean=false, cancelable:Boolean=false)
                {
            super(type, bubbles, cancelable);
                        current = current_value;
                        total = total_value;
                }
 
                public override function clone():Event
                {
                        return new SmartLoaderEvent(type, current, total, bubbles, cancelable);
                }
 
                public override function toString():String
                {
                        return formatToString("SmartLoaderEvent", "type", "bubbles", "cancelable", "eventPhase");
                }
 
                }
          }
}

листенер выглядит так:
Код AS3:

my_loader.addEventListener(SmartLoaderEvent.PROGRESS_UPDATE, progress_test_funct);

обработчик
Код AS3:

private function progress_test_funct(event:SmartLoaderEvent)
{
        trace("ПАРАМЕТРЫ" ,event.total, event.current);
}

Тема исчерпана.

AlexStukoff 14.07.2009 13:44

Как приятно, что автор ветки не ограничился "Всем спасибо, проблема решена" а привел рабочий код!
Помогло, спасибо :)


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

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