Непонимание ошибки «термин не определен» - PullRequest
1 голос
/ 24 июля 2011

Вот пример кода, над которым я работаю:

package button
{
    import flash.display.*;
    import flash.events.*;

    public class  Button extends MovieClip
    {
         public var mybutton:MovieClip;

         public function Button () {
             buttonMode=true;
             mybutton.fromFile.addEventListener (MouseEvent.CLICK , handle )
         }

         public function handle (e:MouseEvent) {
             trace ("hello")
         }
    }
}

Нажмите здесь, чтобы загрузить пример

Это дает мне следующую ошибку, и я не могу понять, почему:

TypeError: Error #1010: A term is undefined and has no properties.
    at button::Button()
    at test()
    at flash.display::Sprite/constructChildren()
    at flash.display::Sprite()
    at flash.display::MovieClip()

Обратите внимание, что в настройках скрипта у меня включено автоматическое объявление. Как мне это исправить?

1 Ответ

1 голос
/ 24 июля 2011

Прежде всего, вы определяете mybutton как MovieClip, но фактически никогда не создаете его с помощью ключевого слова «new», а также не присваиваете эту ссылку какому-либо существующему объекту, поэтому эта ссылка по умолчанию «null».Но даже если вы действительно создали новый мувиклип, например, так:

     public var mybutton:MovieClip;

     public function Button () {
         mybutton = new MovieClip();

         if(stage){
             stage.addChild(mybutton);
         }

         buttonMode=true;
         mybutton.fromFile.addEventListener (MouseEvent.CLICK , handle )
     }

В таком случае вы столкнетесь с той же проблемой, и строка кода, вызывающая проблемы, будет:

mybutton.fromFile.addEventListener (MouseEvent.CLICK , handle );

Класс MovieClip - это динамический класс, который означает, что вы можете динамически определять свойства этого объекта во время выполнения, но до тех пор, пока эта ссылка не будет нулевой или неопределенной.Возьмем, к примеру, ваш код:

mybutton.fromFile

Свойство «fromFile» должно быть либо именем символа мувиклипа, который вы уже создали внутри myButton, либо оно должно быть сначала определено в вашем коде где-то передВы можете получить к нему доступ.Вы получаете доступ к этой неопределенной ссылке, когда используете следующий код:

mybutton.fromFile.addEventListener

Вы говорите flash: «Хорошо, существует объект EXISTING, присоединенный к myButton с именем fromFile, так что идите, получите его и прикрепитеслушатель ".Поскольку вы на самом деле никогда не создавали объект и не присоединяли его к динамическому пользовательскому свойству «fromFile», этот «термин» не определен.Ниже приведен единственный способ работы этого кода:

package button
{
    import flash.display.*;
    import flash.events.*;

    public class  Button extends MovieClip
    {
         public var mybutton:MovieClip;

         public function Button () {
             buttonMode=true;
             mybutton.fromFile = new MovieClip();
             //OR
             //mybutton.fromFile = someOtherMovieClip;
             mybutton.fromFile.addEventListener (MouseEvent.CLICK , handle )
         }

         public function handle (e:MouseEvent) {
             trace ("hello")
         }
    }
}

Обратите также внимание, что для присоединения слушателя к любому объекту этот объект должен иметь либо реализацию IEventDispatcher на некотором уровне в цепочке наследования объектов, либо нанекоторый уровень, из которого объект должен быть получен или расширен EventDispatcher.MovieClips, Sprites и другие объекты DisplayObject делают это.

Также обратите внимание, что если вы просто присоедините прослушиватель события CLICK к простому, пустому новому объекту MovieClip, вы никогда не будете запускать это событие, потому что вы никогда не сможетенажмите здесь.Вы не можете щелкнуть по нему, потому что вы не поместили ничего, что физически кликабельно, внутри этого мувиклипа.Следующий код должен работать так, как вы рассчитывали:

package button
{
    import flash.display.*;
    import flash.events.*;

    public class  Button extends MovieClip
    {
         public var mybutton:MovieClip;

         public function Button () {
             mybutton = new MovieClip();
             mybutton.graphics.beginFill(0, 1);
             mybutton.graphics.drawRect(0,0,200,200);
             mybutton.graphics.endFill();
             if(stage){
                 stage.addChild(mybutton);
             }

             mybutton.buttonMode = true;
             mybutton.fromFile.addEventListener (MouseEvent.CLICK , handle )
         }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...