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

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

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

Регистрация: May 2010
Адрес: Краснодар
Сообщений: 182
Отправить сообщение для djken с помощью ICQ Отправить сообщение для djken с помощью Skype™
Question Ругается на stage при вызове метода

Здравствуйте.
Написал класс Slider. У него есть публичный метод destroy(). Когда вызываю этот метод извне, то ругается на строку
Код AS3:
stage.removeEventListener(MouseEvent.MOUSE_MOVE, onKnobMouseMoveHandler);
, якобы "Не удается вызвать свойство или метод со ссылкой на объект null."

Как понимаю, он не видит stage и приходится перед этим проверять его:
Код AS3:
if (stage && stage.hasEventListener(MouseEvent.MOUSE_MOVE))
Объясните пожалуйста почему так происходит? Ведь в методе onKnobMouseUpHandler я так же отписываюсь от события, но ошибок не вылетает...

Вот сам класс:
Код AS3:
public class Slider extends SliderSWC
	{
		public var hasEnabled:Boolean;
		private var _minVal:uint;
		private var _maxVal:uint;
		private var _curVal:uint;
 
		public function Slider(minVal:uint, maxVal:uint, curVal:uint, titleTxt:String, unitTxt:String)
		{
			hasEnabled = true;
			knob.buttonMode = true;
 
			_minVal = minVal;
			_maxVal = maxVal;
			_curVal = curVal;
 
			updateText(titleTxt, unitTxt);
 
			txt.autoSize = TextFieldAutoSize.RIGHT;
			unit.autoSize = TextFieldAutoSize.LEFT;
			value.autoSize = TextFieldAutoSize.LEFT;
 
			updateTextCurValue();
			updatePositionKnob();
 
			knob.addEventListener(MouseEvent.MOUSE_OVER, onKnobMouseOverHandler);
			knob.addEventListener(MouseEvent.MOUSE_OUT, onKnobMouseOutHandler);
			knob.addEventListener(MouseEvent.MOUSE_DOWN, onKnobMouseDownHandler);
		}
 
		public function updateText(titleTxt:String, unitTxt:String):void
		{
			txt.text = titleTxt.toUpperCase();
			unit.text = unitTxt.toUpperCase();
		}
 
		private function updateTextCurValue():void
		{
			value.text = _curVal.toString();
			unit.x = value.x + value.width;
		}
 
		private function updatePositionKnob():void
		{
			var perc:uint = (_curVal - _minVal) * 100 / (_maxVal - _minVal);
			knob.x = ((bg.width-2) * perc / 100) + 1 - (knob.width / 2);
			indicator.width = knob.x + knob.width / 2;
		}
 
		private function onKnobMouseDownHandler(e:MouseEvent):void
		{
			if (hasEnabled)
			{
				stage.addEventListener(MouseEvent.MOUSE_MOVE, onKnobMouseMoveHandler);
				stage.addEventListener(MouseEvent.MOUSE_UP, onKnobMouseUpHandler);
				knob.startDrag(false, new Rectangle(1-knob.width/2, knob.y, bg.width-2, 0));
			}
		}
 
		private function onKnobMouseMoveHandler(e:MouseEvent):void
		{
			if (hasEnabled)
			{
				indicator.width = knob.x + knob.width/2;
				var perc:uint = (knob.x+knob.width/2) * 100 / (bg.width-2);
				_curVal = (_maxVal-_minVal) * perc / 100 + _minVal;
				updateTextCurValue();
				dispatchEvent(new Event('VALUE_CHANGED'));
			}
		}
 
		private function onKnobMouseUpHandler(e:MouseEvent):void
		{
			stage.removeEventListener(MouseEvent.MOUSE_MOVE, onKnobMouseMoveHandler);
			stage.removeEventListener(MouseEvent.MOUSE_UP, onKnobMouseUpHandler);
			knob.stopDrag();
		}
 
		private function onKnobMouseOverHandler(e:MouseEvent):void
		{
			if (hasEnabled)
				knob.gotoAndStop('s2');
		}
 
		private function onKnobMouseOutHandler(e:MouseEvent = null):void
		{
			if (hasEnabled)
				knob.gotoAndStop('s1');
		}
 
		public function get currentValue():uint
		{
			return _curVal;
		}
 
		public function get minValue():uint
		{
			return _minVal;
		}
 
		public function get maxValue():uint
		{
			return _maxVal;
		}
 
		public function enable():void
		{
			knob.alpha = 1;
			bg.alpha = 1;
			indicator.alpha = 1;
			knob.buttonMode = true;
			hasEnabled = true;
		}
 
		public function disable():void
		{
			knob.alpha = 0;
			bg.alpha = .4;
			indicator.alpha = .4;
			knob.buttonMode = false;
			hasEnabled = false;
		}
 
		public function destroy():void
		{
			knob.removeEventListener(MouseEvent.MOUSE_OVER, onKnobMouseOverHandler);
			knob.removeEventListener(MouseEvent.MOUSE_OUT, onKnobMouseOutHandler);
			knob.removeEventListener(MouseEvent.MOUSE_DOWN, onKnobMouseDownHandler);
			stage.removeEventListener(MouseEvent.MOUSE_MOVE, onKnobMouseMoveHandler);
			stage.removeEventListener(MouseEvent.MOUSE_UP, onKnobMouseUpHandler);
		}
 
	}
__________________
кто не отвечает, того garbage collector забирает

Старый 01.12.2016, 05:49
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 2  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
потому что он уже удален из дисплей листа, когда вызывается destroy() либо удаление происходит в самом методе destroy() до вызова stage.removeEventListener(MouseEvent.MOUSE_MOVE, onKnobMouseMoveHandler);

Самый разумный вариант отписываться и подписываться на события stage, это добавить в конструкторе класса слушатели добавления и удаления со сцены
Код AS3:
		public function Slider(minVal:uint, maxVal:uint, curVal:uint, titleTxt:String, unitTxt:String)
		{
			hasEnabled = true;
			knob.buttonMode = true;
 
			_minVal = minVal;
			_maxVal = maxVal;
			_curVal = curVal;
 
			updateText(titleTxt, unitTxt);
 
			txt.autoSize = TextFieldAutoSize.RIGHT;
			unit.autoSize = TextFieldAutoSize.LEFT;
			value.autoSize = TextFieldAutoSize.LEFT;
 
			updateTextCurValue();
			updatePositionKnob();
 
			knob.addEventListener(MouseEvent.MOUSE_OVER, onKnobMouseOverHandler);
			knob.addEventListener(MouseEvent.MOUSE_OUT, onKnobMouseOutHandler);
			knob.addEventListener(MouseEvent.MOUSE_DOWN, onKnobMouseDownHandler);
 
			addEventListener(Event.ADDED_TO_STAGE, onAdded);
			addEventListener(Event.REMOVED_FROM_STAGE, onRemoved);
		}
		public function onAdded(e:Event):void {
		   // тут добавлять все слушатели сцены
		}
		public function onRemoved(e:Event):void {
		   // а тут удалять
		}
__________________
Ко мне можно и нужно обращаться на ты)

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

Регистрация: May 2010
Адрес: Краснодар
Сообщений: 182
Отправить сообщение для djken с помощью ICQ Отправить сообщение для djken с помощью Skype™
caseyryan, спасибо за разъяснение. Вы правы. На свежую голову быстро нашел причину )
Слайдеры у меня находятся внутри _settingsScreen. И _settingsScreen я удалял и дисплей листа до того, как запускал его метод destroy()
Код AS3:
removeChild(_settingsScreen);
_settingsScreen.destroy();
_settingsScreen = null;
__________________
кто не отвечает, того garbage collector забирает

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

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

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


 


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


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