Форум 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=138426)

danger 07.04.2010 18:24

Не могу обратиться к объекту
 
Парни, не первый день за флешем, но...тут встрял.
Собственно сабж (выдернул из своего проекта метод, повыкидывал всё из него, чтобы понятнее было):

Код AS3:

 
function duplicateObject(obj:MovieClip, duplicateObjName:String, arrArguments:Array = null, autoAddToStage:Boolean = true):dgObject {
        var targetClass:Class;
        var duplicate:MovieClip;
        var rect:Rectangle;
 
        try {
                targetClass = Object(obj).constructor;
                duplicate = new targetClass();
                rect = obj.scale9Grid;
                duplicate.name = duplicateObjName;
                duplicate.transform = obj.transform;
                duplicate.filters = obj.filters;
                duplicate.cacheAsBitmap = obj.cacheAsBitmap;
                duplicate.opaqueBackground = obj.opaqueBackground;
                if (obj.scale9Grid) duplicate.scale9Grid = rect;
 
                trace("num = " + obj.parent.numChildren);
                obj.parent.addChild(duplicate);
                trace("num = " + obj.parent.numChildren);
                trace(duplicate.name);
                //***** ПОЧЕМУ????
                trace(obj.parent['qqq']);
                //***** ПОЧЕМУ????
                //fmcEnvelope.parent.getChildAt(2).x +=120; //это у меня на сцене он 2-ой...
                //duplicate.x += 120;
        } catch(err:Error) {
                //обработчик
        }
        return null;
}

Вызов этой функции:

Код AS3:

duplicateObject(this.mcTest, "qqq");

В комментах описана проблема. Хоть убейте - не пойму ПОЧЕМУ я не могу обратиться так к объекту...
ВСЕМ заранее СПАСИБО!

iNils 07.04.2010 18:26

return null тому причина

danger 07.04.2010 18:31

return null тут абсолютно не при чем.
Вопрос заключается в том, почему я ВНУТРИ этой функции(кстати, можно и снаружи тоже попробовать - ничего не выйдет) не могу по имени(!) обратиться к объекту. Объект создается и добавляется успешно на сцену(о чем свидетельствуют СПЕЦИАЛЬНО для этого вставленные функции trace) - но такое обращение возвращает undefined.
ПОЧЕМУ?

iNils 07.04.2010 18:40

Это не ас1/2. Тут обращение идет по ссылкам. Хотите по имени, используйте метод getChildByName.

danger 07.04.2010 18:46

Опять неверно. Для примера - вот мой конструктор:
Код AS3:

//constructor
public function dgObject(mc:MovieClip, mcName:String, objInternal:Boolean = false):void {
        var errMsg:String = "";
 
        try {
                if (mc == null) errMsg = fcs.emMovieClipIsNull
                else if (mc[mcName] == null) errMsg = fcs.emObjectNotFound(mcName);
                if (errMsg != "") mc[mcName].name /*force generate error*/ else fmcEnvelope = mc[mcName];
        } catch(err:Error) {
                ferrorConstructorInit = true;
                showError(new Array(fcs.cln_dgObject, fcs.cmnConstructor, fcs.etInternalCrush, errMsg, err));
                //exceptionHandler(mc, fcurrentClass, fcs.cmnConstructor, fcs.emObjectNotFound(mcName), objInternal);
        }
}

Тут на многое не надо обращать внимание, главное вот эта строчка кода:
Код AS3:

fmcEnvelope = mc[mcName]

Она-то работает. И, признаюсь Вам, очень даже неплохо работает!)))
А насчет getChildByName - огрмное спасибо, совсем вылетело из головы.
Но всё-таки...сабж остается сабжом....что за ГЛЮК?

iNils 07.04.2010 19:02

Цитата:

Она-то работает. И, признаюсь Вам, очень даже неплохо работает!)))
Не-а.
Делаем простой пример
Код AS3:

package {
        import flash.display.*;
        public class Test extends Sprite {
                public function Test () {
                        var s:MovieClip = new MovieClip ()
                        s.name = "mc"
                        addChild (s)
                        trace (this["mc"]);
                }
        }
}

и тут бах, ошибка
Цитата:

ReferenceError: Error #1069: Не удалось найти свойство mc в Test; отсутствует значение по умолчанию.
at Test()[D:\_Library\_Work\home.test\LoggerStack\src\Test.as:8]

etc 07.04.2010 19:03

Генерацией ссылок с именами клипов занимается компилятор Flash IDE и то, только на стадии компиляции.

danger 07.04.2010 19:12

Все правильно))))) Я ПРО ЭТО И ГОВОРЮ. Ошибка то бабахает. Страшно и громко бабахает.
А если мы теперь закомментим строчки:
//var s:MovieClip = new MovieClip ()
//s.name = "mc"
//addChild (s)
Затем очень аккуратно создадим шейп на сцене(вручную). Далее нажмем F8. Далее назовем его mc. А уже затем мягко и аккуратно нажмем ctrl+enter.
И.............//[object MovieClip]

Вопрос остается открытым: ПОЧЕМУ? ПОЧЕМУ в IDE flash видит и может обратиться к объекту вот так object[objectName], а в райн-тайме НЕТ!....
Кто может, подскажите...

udaaff 07.04.2010 19:14

Генерацией ссылок с именами клипов занимается компилятор Flash IDE и то, только на стадии компиляции.

danger 07.04.2010 19:15

Цитата:

Сообщение от etc (Сообщение 898729)
Генерацией ссылок с именами клипов занимается компилятор Flash IDE и то, только на стадии компиляции.

Т.е., как я понял, в райн-тайме ссылка на добавленный объект через обращение по свойству(object[objectName]) не работает? Верно?


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

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