Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   изменение this, root и stage при создании экземпляра класса (http://www.flasher.ru/forum/showthread.php?t=211573)

nelco 23.09.2015 20:31

изменение this, root и stage при создании экземпляра класса
 
в Main создаю экземпляр DO класса:

Код AS3:

 
public class Main extends Sprite
        {
                private var _staticObjects:StaticObjects = new StaticObjects;
 
                public function Main()
                {
                        addChild(_staticObjects);

сам класс StaticObjects имеет вид:

Код AS3:

 
package 
{
        import flash.display.Sprite;
        import flash.text.TextField;
        import flash.text.TextFormat;
 
        public class StaticObjects extends Sprite
        {
                private var _stageHeader:TextField =  new TextField();
 
                public function StaticObjects()
                {
 
                        var tf:TextFormat = new TextFormat();
                        tf.align = "center";
                        tf.font = "Arial";
                        tf.size = 20;
 
                        _stageHeader.text = "Прочитанный материал по ActionScript 3.0";
                        _stageHeader.textColor = 0xFFFFFF;
                        _stageHeader.border = true;
                        _stageHeader.borderColor = 0x8000FF;
                        _stageHeader.setTextFormat(tf);
                        _stageHeader.width = _stageHeader.textWidth+5;
                        _stageHeader.height = 25;
 
                        addChild(_stageHeader);
 
                        trace (this.parent); //null
                        trace (this.root); //null
                        trace (stage); // null
 
                }
 
        }
 
}

не совсем понимаю почему все 3 трейса при создании экземпляра класса выводят null? конструктор класса StaticObjects, получается, вызывается же только когда в Main создаётся объект _stageHeader?

я думал, что trace(this.parent) в классе StaticObjects будет тоже самое, что и _stageHeader.parent в классе Main (создаётся же объект в Main)

samana 23.09.2015 21:33

Конструктор класса срабатывает при создании экземпляра этого класса. То-есть когда срабатывает конструктор, ваш экземпляр класса ещё не находится на сцене, от того его родитель, stage и root не имеют значений.

neonoviiwolf 23.09.2015 23:03

Код AS3:

addEventListener(Event.ADDED_TO_STAGE, init);

вам в помощь

caseyryan 24.09.2015 06:51

nelco, вот эта запись
Код AS3:

private var _staticObjects:StaticObjects = new StaticObjects;

моветон сразу по двум причинам:
1) Вызывать конструктор принято с добавлением скобок, даже если он не принимает никаких аргументов
то есть
Код AS3:

new StaticObjects();

а не
Код AS3:

new StaticObjects;

2) Не нужно создавать экземпляры вне конструктора
Это конечно не повляет на работу, но вид кода портит.
Такая запись в работе равнозначна созданию экземпляра в конструкторе или в другом методе

То есть лучше писать так:
Код AS3:

public class Main extends Sprite
        {
                private var _staticObjects:StaticObjects = null;;
 
                public function Main()
                {
                        _staticObjects = new StaticObjects();
                        addChild(_staticObjects);

п.с. Ну и название класса должно быть существительным в единственном числе

Isfet 24.09.2015 08:21

эти ссылки появляются после добавления этого объекта в дисплей лист

Код AS3:

public class Main extends Sprite
        {
                private var _staticObjects:StaticObjects = null;;
 
                public function Main()
                {
                        _staticObjects = new StaticObjects();
                        addChild(_staticObjects);
                      //только здесь станут доступны эти ссылки, и если вызвать какую-нибудь функцию в _staticObjects после этого , то там уже можно будет трейсить их
 
                      _staticObjects.traceRef();

но правильней - это подписаться на событие addEventListener(Event.ADDED_TO_STAGE, init);, как сказал neonoviiwolf
а в хэндлере - уже работать со stage

Код AS3:

 
package 
{
        import flash.display.Sprite;
        import flash.text.TextField;
        import flash.text.TextFormat;
 
        public class StaticObjects extends Sprite
        {
                private var _stageHeader:TextField =  new TextField();
 
                public function StaticObjects()
                {
                      this.addEventListener(Event.ADDED_TO_STAGE, init);
 
 
                }
                public function init(event:Event):void{
 
                        this.removeEventListener(Event.ADDED_TO_STAGE, init);
 
                        var tf:TextFormat = new TextFormat();
                        tf.align = "center";
                        tf.font = "Arial";
                        tf.size = 20;
 
                        _stageHeader.text = "Прочитанный материал по ActionScript 3.0";
                        _stageHeader.textColor = 0xFFFFFF;
                        _stageHeader.border = true;
                        _stageHeader.borderColor = 0x8000FF;
                        _stageHeader.setTextFormat(tf);
                        _stageHeader.width = _stageHeader.textWidth+5;
                        _stageHeader.height = 25;
 
                        addChild(_stageHeader);
 
                        trace (this.parent); //null
                        trace (this.root); //null
                        trace (stage); // null                       
 
                }
 
        }
 
}


nelco 24.09.2015 11:32

спасибо за ответы, понял...
я думал, что если trace() стоит после addChild() в конструкторе добавляемого класса, то к тому времени, как вызовется trace(), addChild() уже выполнится и объект будет в displayListe

буду пробовать с Event.ADDED_TO_STAGE

caseyryan 24.09.2015 12:33

Цитата:

Сообщение от nelco (Сообщение 1187195)
я думал, что если trace() стоит после addChild() в конструкторе добавляемого класса, то к тому времени, как вызовется trace(), addChild() уже выполнится и объект будет в displayListe

Так и есть. Но тогда и свойства надо тестировать у добавленного объекта, а не у родителя.
То есть не
Код AS3:

addChild(_stageHeader);
 
trace (this.parent); //null
trace (this.root); //null
trace (stage); // null

а
Код AS3:

addChild(_stageHeader);
 
trace (_stageHeader.parent);
trace (_stageHeader.root);
trace (_stageHeader.stage);

Добавлено через 3 часа 42 минуты
Но это сработает при условии, что сам родительский контейнер добавлен в дисплей лист


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

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