Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Можно ли подписаться на ADDED_TO_STAGE и не отписываться? (http://www.flasher.ru/forum/showthread.php?t=149433)

JackFromChaos 25.01.2011 04:27

Можно ли подписаться на 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 прекрасно удаляет.

cleptoman 25.01.2011 08:37

а зачем вам внутри MenuItem в каждом обрабатывать клавиатуру.
в классе-создателе ваших менюАйтемов пихайте их в словарь и подписывайте на события.
по АДД примерно будет выглядеть как :
Код AS3:

_menuItems[_menuItemKeyCode] = _menuItem;

в этом же классе (или отдельном менеджере) при событии клавиатуры
Код AS3:

private function _onKeyboardEvent(e:KeyboardEvent):void{
var item:MenuItem = _menuItems[e.keyCode] as MenuItem;
if(item && super.contains(item) && item.visible && item.enabled){
doSomething();
}
}

думаю на ремоув и изменения кейКода по аналогии сделаете.
собсно хотел просто мысль донести.

JackFromChaos 25.01.2011 12:42

2cleptoman: Согласен.


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

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