Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Добавление слушателя предку (http://www.flasher.ru/forum/showthread.php?t=202869)

Ioangum 16.08.2013 09:33

Добавление слушателя предку
 
Доброго времени суток!
  • Есть объект, наследованный от MovieClip класса "А", который лежит прямо на сцене.
  • Есть объект (класса "Б"), добавленный addChild в класс "А", который тоже наследован от MovieClip.
Так вот, при добавлении объекта клааса "Б" в объект класса "А" вылетает ошибка:
Цитата:

TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null".
at "Б"()
at "А"/add"Б"()
at "А"()
И не вылетает, если в классе "Б" нет слушателя
Код AS3:

stage.addEventListener(MouseEvent.MOUSE_UP, cStopDrop);

Код в самой функции такой:
Код AS3:

trace('OK');

Так вот, вопрос в следующем: как правильно добавить такой слушатель?

Inet_PC 16.08.2013 09:46

Код AS3:

addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
function onAddedToStage(e:Event):void
{
        removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
        stage.addEventListener(MouseEvent.MOUSE_UP, cStopDrop);
}


Wolsh 16.08.2013 09:50

Видимо, пытаетесь добавить слушателя прямо в конструкторе Б. То есть, когда объект еще даже не создан окончательно, и уж тем более еще не добавлен в СписокОтображения, а значит его свойство stage имеет значение null.

alexcon314 16.08.2013 10:40

Вы выложили реальный трейс?
Цитата:

TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null".
at "Б"()
at "А"/add"Б"()
at "А"()
вот так вот прямо русскими буквами и пишет конструкторы классов "А"() и "Б"()?

Ioangum 16.08.2013 14:48

alexcon314, нет, в трейсе пишет по-другому, это я так упростил.

Добавлено через 6 минут
Спасибо большое за ответы! Я незнал, что нужно добавлять слушатель события добавления в стейдж. Всё теперь работает, но теперь возникла проблема: не получается через функцию в классе "Б" удалить этот самый объект, который добавлен в стейдж. Вот, если так:
Код AS3:

if (stage.getChildByName("nak")!=null) {
                                        stage.removeChild(nak);
                                        nak = null;
                                }

ничего не убирается, а если так:
Код AS3:

stage.removeChild(nak);

, то:
Цитата:

ArgumentError: Error #2025: Предоставленный DisplayObject должен быть дочерним элементом вызывающего объекта.
at flash.display::DisplayObjectContainer/removeChild()
at "Б"/cStopDrop()
Как здесь быть? Спасибо

Wolsh 16.08.2013 16:08

В первом сообщении Вы утверждали, что "этот самый объект" добавлен в экземпляр класса А. Теперь уверяете, что он находится в стейдже (чего он там делает вообще?). Удаляйте оттуда, где он находится на самом деле, и ошибок не будет.

Ioangum 16.08.2013 16:19

Этот самый объект ("nak"-экземпляр вообще другого класса, "В" допустим) создаётся экземпляром "Б" и добавляется в стейдж, который (класс "Б") в свою очередь находится в экземпляре "А". Вот мне и надо через экз. "Б" удалить экз. "В". Просто я неверно назвал его "этим самым" в своём втором сообщении. Извиняюсь

ObOs 16.08.2013 16:40

В какой контейнер добавили объект из того и нужно удалять.
Грубо: у какого объекта вызывали addChild(child), у того и removeChild(child) надо вызывать.

Ioangum 16.08.2013 17:19

Я добавил в stage. Но stage.removeChild(nak) выдаёт ошибку, что-то про статические методы. Из экземпляра "Б" совсем-совсем нельзя? А если делаю removeChild(nak), то опять ошибка - пишет, что "предоставленный объект должен быть дочерним элементом вызывающего объекта

Rivexe 16.08.2013 18:48

Код AS3:

if(nak.parent)
  nak.parent.removeChild(nak)


Ioangum 17.08.2013 17:31

Спасибо! Теперь всё работает как надо!


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

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