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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 08.11.2011, 17:22
imena вне форума Посмотреть профиль Отправить личное сообщение для imena Найти все сообщения от imena
  № 1  
Ответить с цитированием
imena
[+1.3 07.12.11]

Регистрация: Feb 2011
Сообщений: 121
По умолчанию Обмен между классом-диспетчером и основным классом

Всем привет!

Есть основной класс программы и есть класс-диспетчер.
Прослушиваю в основном классе события диспетчера. В диспетчере генерирую событие, а основной класс не отлавливает. В чем ошибка? Класс-диспетчер объявлен как final и расширяет EventDispatcher.

Код AS3:
 
/*    Основной класс      */		
 
	private function init(e:Event = null):void {
		removeEventListener(Event.ADDED_TO_STAGE, init);
		// entry point
		addEventListener(myDispatcher.START_PRELOADER, startPreloader);
	}
 
	private function startPreloader(e:Event):void {
		trace("Старт прелоадер");
		dispatchEvent(new Event(myDispatcher.COMPLETE_PRELOADER));
	}
 
/*     Класс-диспетчер   */
 
	dispatchEvent(new Event(myDispatcher.START_PRELOADER));

Старый 08.11.2011, 17:29
goodguy вне форума Посмотреть профиль Найти все сообщения от goodguy
  № 2  
Ответить с цитированием
goodguy
Banned
[+1 05.11.11]
[+1 09.08.11]

Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
Проблема в том, что слушатель добавлен к объекту основного класса, а доставляет события объект "диспетчер". Естественно основной класс и не должен ничего отлавливать.

Если в нем создать экземпляр диспетчера, и добавить слушатель к этому экземпляру, тогда он и будет ловить эти события

Старый 08.11.2011, 17:32
imena вне форума Посмотреть профиль Отправить личное сообщение для imena Найти все сообщения от imena
  № 3  
Ответить с цитированием
imena
[+1.3 07.12.11]

Регистрация: Feb 2011
Сообщений: 121
ой... ))... точно... спасибо... заработало...

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

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Цитата:
Если в нем создать экземпляр диспетчера, и добавить слушатель к этому экземпляру, тогда он и будет ловить эти события
Можно также агрегировать через конструктор, параметр target. Тогда доставлять события будет агрегатор. Заводить отдельное свойство-ссылку на диспатчер для подписки не всегда "красиво", но, конечно, как всегда "проще")).

Добавлено через 5 минут
Хотя извиняюсь, к данному случаю это, похоже, не относится)
__________________
Reality.getBounds(this);

Старый 08.11.2011, 20:50
imena вне форума Посмотреть профиль Отправить личное сообщение для imena Найти все сообщения от imena
  № 5  
Ответить с цитированием
imena
[+1.3 07.12.11]

Регистрация: Feb 2011
Сообщений: 121
Цитата:
Сообщение от Wolsh Посмотреть сообщение
Можно также агрегировать через конструктор, параметр target. Тогда доставлять события будет агрегатор.
Прошу прощения за тупость... не совсем понял как именно это делается. Просто, всегда волнует вариант "красивее", а не "проще".

Еще раз извиняюсь за нубизм вселенского масштаба.

Старый 08.11.2011, 22:33
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 6  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Ну у конструктора EventDispatcher есть единственный параметр target, по-умолчанию null.
Если в этот параметр передать ссылку на экземпляр класса, реализующего интерфейс IEventDispatcher, то можно использовать этот экземпляр (класса, который может НЕ НАСЛЕДОВАТЬ класс EventDispatcher) так, как будто он чистокровный EventDispatcher. Эта возможность добавлена для того, что далеко не всегда пользовательский класс можно унаследовать от EventDispatcher, наследование-то в AS3 не множественное)).
Код AS3:
package  
{
	import flash.events.Event;
	import flash.events.EventDispatcher;
	import flash.events.IEventDispatcher;
 
/* * * * * * * * * *
*                  *
*  @author wolsh   *
*                  *
\* * * * * * * * * */ 
	public class NotDispatcher implements IEventDispatcher 
	{
		private var _dispatcher:EventDispatcher;
		public static const MESSAGE_EVENT:String = "I am not dispatcher, but i can!";
 
		public function NotDispatcher() 
		{
			_dispatcher = new EventDispatcher(this);
		}	
 
		public function talk():void
		{
			_dispatcher.dispatchEvent(new Event(MESSAGE_EVENT));
		}
 
		/* INTERFACE flash.events.IEventDispatcher */
		public function dispatchEvent(event:Event):Boolean 
		{
			trace("Тут кто-кто попросил продиспатчить сообщение:", event.type, "но я его не знаю");
			return false;
		}
 
		public function hasEventListener(type:String):Boolean 
		{
			return _dispatcher.hasEventListener(type);
		}
 
		public function willTrigger(type:String):Boolean 
		{
			return _dispatcher.willTrigger(type);
		}
 
		public function removeEventListener(type:String, listener:Function, useCapture:Boolean = false):void 
		{
			_dispatcher.removeEventListener(type, listener, useCapture);
		}
 
		public function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void 
		{
			_dispatcher.addEventListener(type, listener, useCapture, priority, useWeakReference);
		}
	}
}
Код AS3:
// entry point
var nd:NotDispatcher = new NotDispatcher();
nd.addEventListener(NotDispatcher.MESSAGE_EVENT, handlerNDMessage);
nd.talk();
nd.dispatchEvent(new Event("Oops..."));
....
private function handlerNDMessage(event:Event):void 
{
	trace(event.target, "say:", event.type);
}
То есть Вы делаете все как при обычной композиции экземпляра ED в свой класс. Вся разница заключается в том, что при получении события от этого класса свойство target будет указывать не на экземпляр ED, а на экземпляр Вашего класса. И только)) Это позволяет инкапсулировать реальный диспатчер и сделать Ваш класс глухим к требованиям ИЗВНЕ продиспатчить сообщение. Если же предоставить публичную ссылку на реальный диспатчер, такой контроль осуществить не удастся – весь внешний мир, полный злоумышленников, будет общаться с ним напрямую.
Вот как-то так...
__________________
Reality.getBounds(this);


Последний раз редактировалось iNils; 08.11.2011 в 22:42.
Создать новую тему Ответ Часовой пояс GMT +4, время: 14:12.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

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


 


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


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