![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Есть простой пример... Что-то типа классического, виндового MenuItem, с горячей клавишей. Для пункта необходимо слушать глобальные события клавиатуры. По ADDED_TO_STAGE подписываюсь на клавиатуру, по REMOVED_FROM_STAGE, отписываюсь. Но выходит что от самих ADDED_TO_STAGE и REMOVED_FROM_STAGE отписаться нельзя, разве что ручками, что не есть айс.
Подписался с использованием useWeakReference. Будет работать? В смысле коллектор все соберет, если про кнопку "забудут"? Типа пример: 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); } } Быть может есть какие то другие варианты? От глобальный диспечера сообщений клавиатуры отказался по причине того, что: 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 прекрасно удаляет.
__________________
Искренне Ваш, Джек. |
|
|||||
|
а зачем вам внутри MenuItem в каждом обрабатывать клавиатуру.
в классе-создателе ваших менюАйтемов пихайте их в словарь и подписывайте на события. по АДД примерно будет выглядеть как : в этом же классе (или отдельном менеджере) при событии клавиатуры private function _onKeyboardEvent(e:KeyboardEvent):void{ var item:MenuItem = _menuItems[e.keyCode] as MenuItem; if(item && super.contains(item) && item.visible && item.enabled){ doSomething(); } } собсно хотел просто мысль донести.
__________________
http://cleptoman.free-lance.ru achivements: дважды благословлен на воровство. осеяный благодатью |
![]() |
![]() |
Часовой пояс GMT +4, время: 01:31. |
|
|
« Предыдущая тема | Следующая тема » |
|
|