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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему  
Старый 25.01.2011, 04:27
JackFromChaos вне форума Посмотреть профиль Отправить личное сообщение для JackFromChaos Найти все сообщения от JackFromChaos
  № 1  
Ответить с цитированием
JackFromChaos
 
Аватар для JackFromChaos

блогер
Регистрация: Jan 2008
Адрес: Донецк
Сообщений: 162
Записей в блоге: 2
Отправить сообщение для JackFromChaos с помощью Skype™
По умолчанию Можно ли подписаться на ADDED_TO_STAGE и не отписываться?

Есть простой пример... Что-то типа классического, виндового MenuItem, с горячей клавишей. Для пункта необходимо слушать глобальные события клавиатуры. По ADDED_TO_STAGE подписываюсь на клавиатуру, по REMOVED_FROM_STAGE, отписываюсь. Но выходит что от самих ADDED_TO_STAGE и REMOVED_FROM_STAGE отписаться нельзя, разве что ручками, что не есть айс.
Подписался с использованием useWeakReference. Будет работать? В смысле коллектор все соберет, если про кнопку "забудут"?

Типа пример:
Код AS3:
public class MenuItem extends Sprite
{
 
	public function MenuItem() 
	{
		addEventListener(Event.ADDED_TO_STAGE, onAddToStage,false,0,true);
		addEventListener(Event.REMOVED_FROM_STAGE,onRemoveFromStage,false,0,true);
		if (stage)
			onAddToStage();
 
	}
 
	private function onRemoveFromStage(e:Event):void 
	{
		stage.removeEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
 
	}
 
	private function onKeyDown(e:KeyboardEvent):void 
	{
		//... обрабатываем горячую клавишу, если таковая имеется. Естественно
               //можно сделать, что бы эта подписка была только если горячая клавиша задана
               //но вопрос не в этом...
 
	}
 
	private function onAddToStage(e:Event=null):void 
	{
		stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
 
	}
 
}
Добавлено через 7 минут
Быть может есть какие то другие варианты?
От глобальный диспечера сообщений клавиатуры отказался по причине того, что:
1)Горячая клавиша может смениться в любой момент в Runtime, через свойство пункта меню
2)У пункта меню, кроме всего прочего, должны проверяются свойства enable, visible
3)Горячая клавиша перестает работать, если меню или пункт меню детачат, но снова начинает работать, когда она атачится.

Все это можно реализовать имея менеджер горячих клавиш, но получится во первых сложнее. Во вторых не решит проблему, так как для реализации пункта 3 все равно нужно слушать ADD_TO_STAGE...

P.S. Собственно хочу реализовать что-то типа описанного тут: http://www.rsdn.ru/article/patterns/patterncommand.xml

Добавлено через 51 минуту
Проверил экспериментальным путем. ADDED_TO_STAGE ссылку не держит, даже если не указывать weakReference. Т.е. коллектор MenuItem прекрасно удаляет.
__________________
Искренне Ваш, Джек.

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

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

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


 


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


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