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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 22.10.2007, 22:20
vitaliy.urazov вне форума Посмотреть профиль Отправить личное сообщение для vitaliy.urazov Найти все сообщения от vitaliy.urazov
  № 1  
Ответить с цитированием
vitaliy.urazov

Регистрация: Feb 2006
Сообщений: 33
По умолчанию как подписать в качестве хендлера события функцию другого объекта?

subj

Здесь (http://flasher.ru/forum/showthread.php?t=79873) понятно написано как это делать в одном классе.

А как правильно указать то, что обработчик является методом другого класса?
Так или нет?
addEventListener(MouseEvent.CLICK, экземлярДругогоКласса.handler);

И есть ли возможность отлова события в каких либо объектах не подписанных на обработку.
Предположим у меня есть некоторый объект, кот. посылает некое событие и неизвестно существует ли он на данный момент или нет. И есть некоторые объекты, кот. должны обработать это событие, если оно вдруг произойдет, но они не знают создан ли объект или нет, да и не надо им это знать.

Как правильно реализовать такое?

Спасибо.

Старый 22.10.2007, 23:24
BlooDHounD вне форума Посмотреть профиль Отправить личное сообщение для BlooDHounD Посетить домашнюю страницу BlooDHounD Найти все сообщения от BlooDHounD
  № 2  
Ответить с цитированием
BlooDHounD
стервочка (я мужик)
 
Аватар для BlooDHounD

блогер
Регистрация: Mar 2004
Адрес: Борисов
Сообщений: 3,161
Записей в блоге: 22
так низя делать. обработчики должны быть приватными.

Старый 23.10.2007, 00:39
miramax вне форума Посмотреть профиль Отправить личное сообщение для miramax Посетить домашнюю страницу miramax Найти все сообщения от miramax
  № 3  
Ответить с цитированием
miramax
 
Аватар для miramax

Регистрация: Oct 2005
Адрес: Борисоглебск
Сообщений: 1,702
Отправить сообщение для miramax с помощью ICQ Отправить сообщение для miramax с помощью AIM Отправить сообщение для miramax с помощью MSN Отправить сообщение для miramax с помощью Yahoo Отправить сообщение для miramax с помощью Skype™
1. Можно подписать любой обработчик из области видимости:
Код:
addEventListener(MouseEvent.CLICK, экземлярДругогоКласса.handler);
addEventListener(MouseEvent.CLICK, trace);
addEventListener(MouseEvent.CLICK, MyClass.myStaticFunction);
2. Или юзать третий объект, который существует всегда и знает когда существует нужный объект, или заюзать что-то кроме обсервера.
__________________
AS3 | www.FLAPS.ru | Русские флэшеры самые умные флэшеры в мире. ©

Старый 23.10.2007, 02:29
Nirth вне форума Посмотреть профиль Отправить личное сообщение для Nirth Посетить домашнюю страницу Nirth Найти все сообщения от Nirth
  № 4  
Ответить с цитированием
Nirth
4AM Games
 
Аватар для Nirth

блогер
Регистрация: Nov 2002
Адрес: Sofia
Сообщений: 6,264
Записей в блоге: 1
Отправить сообщение для Nirth с помощью ICQ Отправить сообщение для Nirth с помощью AIM Отправить сообщение для Nirth с помощью MSN Отправить сообщение для Nirth с помощью Yahoo Отправить сообщение для Nirth с помощью Skype™
Единственное требование, handler должен иметь 1ым аргументом Event, или что нибудь что пройдет как Event (* или Object)
__________________
Я перестал переписывать, начал редактировать, еще лет 15 и я стану писателем ^_^

Старый 23.10.2007, 10:32
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 5  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
Лучше см. пост #2.

Старый 23.10.2007, 12:58
LokiDi L0ck вне форума Посмотреть профиль Отправить личное сообщение для LokiDi L0ck Найти все сообщения от LokiDi L0ck
  № 6  
Ответить с цитированием
LokiDi L0ck

Регистрация: Oct 2007
Сообщений: 53
Если listener сделать публичным.
Main.as3:
Код:
package {
	import flash.display.Sprite;
	import foo.Foo;
	import bar.Bar;
	import flash.events.MouseEvent;
	
	public class Main extends Sprite
	{
		public function Main()
		{
			var f:Foo = new Foo();
			var b:Bar = new Bar();
			
			f.addEventListener(MouseEvent.CLICK, b.mouseClickListener);
			
			addChild(f);
			addChild(b);			
		}
	}
}
Foo.as3:
Код:
package foo
{
	import flash.display.Sprite;
	import flash.text.TextField;
	
	public class Foo extends Sprite
	{
		public function Foo()
		{
			x = 50;
			y = 50;
			
			graphics.beginFill(0x009900);
			graphics.drawCircle(0, 0, 10);
			
			var text:TextField = new TextField();
			text.text = "Foo";
			text.x = 10;
			text.y = 10;
			
			addChild(text);
			
		}
	}
}
Bar.as3:
Код:
package bar
{
	import flash.display.Sprite;
	import flash.events.MouseEvent;
	import flash.text.TextField;
	
	public class Bar extends Sprite
	{
		public function Bar()
		{
			x = 100;
			y = 100;
			
			graphics.beginFill(0x990000);
			graphics.drawCircle(0, 0, 10);
			
			var text:TextField = new TextField();
			text.text = "Bar";
			text.x = 10;
			text.y = 10;
			
			addChild(text);
		}
		
		public function mouseClickListener(e:MouseEvent):void
		{
			trace("Вызван Bar.mouseClickListener()");
		}
	}
}
Если listener сделать приватным, код чуть-чуть поменяется:
В Main.as3:
Код:
package {
	import flash.display.Sprite;
	import foo.Foo;
	import bar.Bar;
	import flash.events.MouseEvent;
	
	public class Main extends Sprite
	{
		protected var bClickListener:Function;
		
		public function Main()
		{
			var f:Foo = new Foo();
			var b:Bar = new Bar();
			
			bClickListener = function(e:MouseEvent):void {
				trace("MAIN: Foo CLICKED");
				b.getClickListener(e)();
			};
			
			f.addEventListener(MouseEvent.CLICK, bClickListener);
			
			addChild(f);
			addChild(b);			
		}
	}
}
В Bar.as3 - mouseClickListener делается приватным, и добавляется public метод.

Код:
public function getClickListener(e:MouseEvent):Function
{
	return function():void {
		mouseClickListener(e);
	};
}
Всё можно сделать красивее, расширив например класс Function через prototype, добавив в него функцию типа Delegate.
Код только для примера, набросал не для реального применения.
__________________
Новичок


Последний раз редактировалось LokiDi L0ck; 23.10.2007 в 13:06.
Старый 23.10.2007, 13:09
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 7  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
Плохой пример.

Старый 23.10.2007, 13:18
LokiDi L0ck вне форума Посмотреть профиль Отправить личное сообщение для LokiDi L0ck Найти все сообщения от LokiDi L0ck
  № 8  
Ответить с цитированием
LokiDi L0ck

Регистрация: Oct 2007
Сообщений: 53
Я знаю.
__________________
Новичок

Старый 23.10.2007, 13:45
Сэр Макс вне форума Посмотреть профиль Отправить личное сообщение для Сэр Макс Найти все сообщения от Сэр Макс
  № 9  
Ответить с цитированием
Сэр Макс
 
Аватар для Сэр Макс

Регистрация: Oct 2007
Адрес: Каунас, Литва
Сообщений: 3
Отправить сообщение для Сэр Макс с помощью ICQ Отправить сообщение для Сэр Макс с помощью Skype™
Я бы делал так:

Код:
public class ClassWithEvents {
  public var clickFunction:Function = null;
  
  public function ClassWithEvents() {
    this.addEventListener(MouseEvent.CLICK,myClickFunction);
  }

  private function myClickFunction(event:MouseEvent) {
    if (clickFunction != null)
      clickFunction(event);
  }
}
Или если позволяет структура програмы то так:
Код:
public class ClassWithEvents {
  public function ClassWithEvents(clickFunction:Function) {
    this.addEventListener(MouseEvent.CLICK,clickFunction);
  }
}
Соответственно использовать первый вариант можно так:
Код:
var a:ClassWithEvents = new ClassWithEvents();
a.clickFunction = somePrivateFunction;
И второй вариант:
Код:
var a:ClassWithEvents = new ClassWithEvents(somePrivateFunction);

Старый 23.10.2007, 13:50
LokiDi L0ck вне форума Посмотреть профиль Отправить личное сообщение для LokiDi L0ck Найти все сообщения от LokiDi L0ck
  № 10  
Ответить с цитированием
LokiDi L0ck

Регистрация: Oct 2007
Сообщений: 53
А можно просто напросто заюзать event dispatcher =)
__________________
Новичок

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

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

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


 


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


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