Actionscript 3.0: показ объекта в режиме строгого режима - PullRequest
1 голос
/ 15 апреля 2009

Это класс документа для обходчика экранного объекта. При тестировании класса обязательно выключите строгий режим ( здесь ) Также положите некоторые вещи на сцену. Когда строгий режим выключен, объект-обходчик работает просто отлично. Тем не менее, я хочу заставить его работать в строгом режиме тоже. Я попытался изменить проблемные части и addig (dispObj как DisplayObject), но безуспешно.

package {

    import flash.display.MovieClip;
    import flash.display.DisplayObject;
    import flash.display.DisplayObjectContainer;

    public class DisplayWalker extends MovieClip {

        public function DisplayWalker() {
            showChildren(stage, 0);
        }



        private function padIndent(indents:int):String {
            var indent:String = "";
            for (var i:uint = 0; i < indents; i++) {
                indent += "        ";
            }
            return indent;
        }

        private function showChildren(dispObj:DisplayObject, indentLevel:Number):void {
            for (var i:uint = 0; i < dispObj.numChildren; i++) {
                var obj:DisplayObject = dispObj.getChildAt(i);
                if (obj is DisplayObjectContainer) {
                    trace(padIndent(indentLevel), obj, obj.name);
                    showChildren(obj, indentLevel + 1);
                } else {
                    trace(padIndent(indentLevel), obj);
                }
            }
        }
    }
}

Ответы [ 2 ]

4 голосов
/ 15 апреля 2009

Ваш класс будет генерировать ошибки времени компиляции в строгом режиме, потому что вы пытаетесь получить доступ к методам numChildren и getChildAt, которые недоступны в классе DisplayObject, но сначала в одном из его подклассов, DisplayObjectContainer.

Причина, по которой он работает в нестрогом режиме, заключается в том, что во время выполнения вы фактически передаете подклассы DisplayObjectContainer (Stage, Sprite и т. Д.).

Просто замените DisplayObject на DisplayObjectContainer в качестве типа для dispObj в вашем методе showChildren. Объекты DisplayObject не могут иметь дочерних элементов и всегда являются листами в дереве экранных объектов, что должен учитывать ваш метод showChildren.

1 голос
/ 15 апреля 2009

Стигглер на правильном пути, но правильно не увидел, что вы уже проверяете DisplayObjectContainers.

Вам просто нужно немного изменить свой код. Я не проверял код, но в любом случае вы должны быть в состоянии понять это;)

private function showChildren(dispObj:DisplayObject, indentLevel:Number):void
{
    var dOC:DisplayObjectContainer = dispObj as DisplayObjectContainer;

    if(dOC == null)
    {
        trace(padIndent(indentLevel),obj);
    }
    else
    {    
        trace(padIndent(indentLevel), obj, obj.name);

        var obj:DisplayObject = null;

        for (var i:uint = 0; i < dispObj.numChildren; i++)
        {
            obj = dOC.getChildAt(i);
            showChildren(obj, indentLevel + 1);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...