Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   TypeError: Error #1007, подскажите как избежать ошибки (http://www.flasher.ru/forum/showthread.php?t=131342)

Furinax 18.10.2009 15:01

Экземпляр класса не создается
 
Делаю галерею, в которой кнопки со ссылками на работы должны добавляться программно на этапе выполнения.
Чтобы многократно не повторять код, сделал обобщенную функцию внутри класса, которая вызывается по таймеру. При вызове функции каждый раз должна создаваться одна кнопка. Но вот доходит до создания экземпляра класса кнопки, как выскакивает ошибка:
1120: Access of undefined property SubBtn.
В библиотеке имеется 5 символов и каждый слинкован с автоматически создаваемым класом (SubBtn1, SubBtn2, SubBtn3, SubBtn4, SubBtn5).
Привожу код класса:
Код AS3:

package forpage {
        import flash.display.MovieClip;
        import flash.utils.Timer;
        import flash.events.Event;
        import flash.events.MouseEvent;
        import flash.events.TimerEvent;
 
        public class WorkGalary extends MovieClip {
 
                public var opened:Boolean;
                private var localTimer1:Timer;
                private var localTimer2:Timer;
                private var repeatCount:uint;
                private var subBtnNumbers:Array;
                private var subBtnX:Array;
                private var subBtnY:Array;
                private var index:uint = 0;
                private var subBtn:SubBtn;
                private var win:MovieClip;
 
                public function WorkGalary (winSymbol:MovieClip) {
                        subBtnNumbers = [1, 2, 3, 4, 5];
                        subBtnX = [70, 70, 70, 355, 725];
                        subBtnY = [100, 130, 160, 100, 100];
                        repeatCount = 5;
                        opened = true;
                        win = winSymbol;
                        addChild (win);
                        localTimer1 = new Timer (710, repeatCount);
                        localTimer1.addEventListener(TimerEvent.TIMER, localTimer1Handler);
                        localTimer1.start();
                }
 
                public function makeRew ():void {
                        localTimer2 = new Timer (100, 1);
                        localTimer2.addEventListener(TimerEvent.TIMER, localTimer2Handler);
                        localTimer2.start();
                        win.addEventListener (Event.ENTER_FRAME, goBack);
                }
 
                public function goBack (e:Event):void {
                        if (win == null) {
                                throw new Error ("Symbol not defined");
                        };
                        try {
                        win.prevFrame ();
                        if (win.currentFrame == 1) {
                                win.removeEventListener (Event.ENTER_FRAME, goBack);
                                opened = false;
                                parent.removeChild (this);
                                }
                        }
                        catch (errObject:Error) {
                                trace ("The message is: " + errObject.message);
                        };
                };
 
                private function localTimer1Handler (e:TimerEvent):void {
                        addSubBtns(subBtnNumbers[index], subBtnX[index], subBtnY[index]);
                        index++;
                };
 
                private function localTimer2Handler (e:TimerEvent):void {
                        removeSubBtns();
                };
 
                private function addSubBtns (index, X, Y):void {
                        var newIndex = index;
                        var newX = X;
                        var newY = Y;
                        trace ("REACHED TIL HERE!!!");
                        subBtn[newIndex] = new SubBtn[newIndex]
                        subBtn[newIndex].x = newX;
                        subBtn[newIndex].y = newY;
                        addChild(subBtn[newIndex]);
                };
 
                private function removeSubBtns ():void {
                };
        }
}

С помощью трассировки удалось узнать, что ошибка возникает при выполнении директивы new SubBtn[newIndex].
Подскажите пожалуйсто, как правильно это реализовать.

Felicast 18.10.2009 15:09

Цитата:

Код AS3:

subBtn[newIndex] = new SubBtn[newIndex]


чета нифига не понял эту запись. вы от куда это взяли? может надо
Код AS3:

subBtn[newIndex] = new SubBtn();

да и subBtn у вас не массив, почему вы тогда по индексу обращаетесь? ничего не понятно

Furinax 18.10.2009 15:13

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

subBtn[newIndex] = new SubBtn[newIndex]

а
Код AS3:

subBtn[newIndex] = new SubBtn();

в моем случае будет работать не так как мне надо.
Названия классов частично совпадают (SubBtn), и различаются только цифрой на конце (1, 2, 3 и т.д.)

wvxvw 18.10.2009 15:20

Код AS3:

var subBtns:Array = [MovieClip, Sprite];
var subBtn:Array = [];
var newIndex:int = 0;
subBtn[newIndex] = new (subBtns[newIndex])();
 
trace(subBtn[0]); // [object MovieClip]

Или я не понял вопрос.

Furinax 18.10.2009 15:44

Поправил код, согласно вашей идее
Код AS3:

В переменных
                private var subBtns:Array;
                private var subBtnX:Array;
                private var subBtnY:Array;
                private var subBtn:Array;
В конструкторе
                        subBtns = [SubBtn1, SubBtn2, SubBtn3, SubBtn4, SubBtn5];
                        subBtnX = [70, 70, 70, 355, 725];
                        subBtnY = [100, 130, 160, 100, 100];
                        subBtn = [];
И в самой функции
                private function addSubBtns (index, X, Y):void {
                        var newIndex = index;
                        var newX = X;
                        var newY = Y;
                        trace ("REACHED TIL HERE!!!");
                        subBtn[newIndex] = new (subBtns[newIndex])();
                        subBtn[newIndex].x = newX;
                        subBtn[newIndex].y = newY;
                        addChild(subBtn[newIndex]);
                };

И теперь появилась новая ошибка:
TypeError: Error #1007: Попытка реализации в объекте, который не является конструктором.
at forpage::WorkGalary/addSubBtns()
at forpage::WorkGalary/localTimer1Handler()
at flash.utils::Timer/_timerDispatch()
at flash.utils::Timer/tick()

dimarik 18.10.2009 16:07

Код AS3:

private function addSubBtns(index:uint, x:Number, y:Number):void {
        var c:Class = getDefinitionByName("SubBtn" + index) as Class;
 
        if (!c) {
                throw new IllegalOperationError('No class');
                return;
        }
 
        var button:DisplayObject = new c() as DisplayObject;
        button.x = x;
        button.y = y;
        this.subBtn[index] = button;
        super.addChild(button);
}

А Galary это по кавовски? =)

Furinax 18.10.2009 16:07

перепиал к себе ваш код как есть, но вот это:
1118: Implicit coercion of a value with static type Object to a possibly unrelated type Class.

не дает проверить его в действии

dimarik 18.10.2009 16:32

Код AS3:

var c:Class = getDefinitionByName("SubBtn" + index) as Class;


Furinax 18.10.2009 16:40

Всем БОЛЬШОЕ СПАСИБО за попытку мне помочь (хоть у вас и ничего не удалось).
Я нашел собственное решение для этой проблемы (довольно таки простое).

Извините за ваше потраченное время.
Монстрский код Dimarik`a помог расширить мой кругозор в области As3.

dimarik 18.10.2009 22:18

А в чем там проблема-то была? Поделитесь! =)


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

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