0

"手作りの" ボタン (インスタンス名として _btn) があり、内部には dynamicText しかありません (または、4 つのボタン モードごとに 1 つの dynaticText と言えます)。Up モードの dynamicText のインスタンス名は「_text」です。ボタンを含む movieClip の AS で作業している場合、動的テキストのテキストをどのように処理すればよいでしょうか?

package  {
import flash.display.MovieClip;
import flash.display.SimpleButton;

public class container extends MovieClip {
    var _btn:button;

    public function container() {
        _btn= new button;
        this.addChild(_btn);
        switch (_btn._text.text)
        {
            case "a": doAFunction();
            case "b": doBFunction();
            case "c": doCFunction();
        }

    }

}

}

私のコードの問題は何ですか?

Access of possibly undefined property _text through a reference with static type flash.display:SimpleButton.
4

3 に答える 3

1

Flash Professionalでボタンシンボルを作成すると、そのシンボルはのインスタンスになりますSimpleButton。ボタンシンボルで作成した表示オ​​ブジェクト(動的テキストフィールドなど)にアクセスする場合は、SimpleButtonオブジェクトのupState、、、およびプロパティを介してアクセスする必要があります。overStatedownStatehitTestState

動的テキストフィールドを取得するためにプロジェクトに含めることができるユーティリティ関数を作成しました。関数が呼び出されますgetDTFFromSB()(simplebuttonから動的テキストフィールドを取得します)。

関数は引数simpleButtonとを取りますstatesimpleButton引数は明らかに問題のオブジェクトSimpleButtonに対するものであり、引数は、テキストフィールドがstateどの状態プロパティ(upState、、、および)にあるかを、それぞれの文字列値「up」、「over」、「down」、および「hit」で指定するためのものです。 。overStatedownStatehitTestState

この関数は、オブジェクト、オブジェクト、またはnullObjectのいずれかであるオブジェクトを返します。TextFieldVector.<TextField

ユーティリティ関数getDTFFromSB()は次のとおりです。

package utils
{
    import flash.display.DisplayObject;
    import flash.display.DisplayObjectContainer;
    import flash.display.SimpleButton;
    import flash.text.TextField;

    /**
     * get dynamic textfield from simple button
     */
    public function getDTFFromSB(simpleButton:SimpleButton, state:String = "up"):Object
    {
        var returnObject:Object;

        var displayObject:DisplayObject;

        switch(state)
        {
            case "up" : displayObject = simpleButton.upState;
            case "over" : displayObject = simpleButton.overState;
            case "down" : displayObject = simpleButton.downState;
            case "hit" : displayObject = simpleButton.hitTestState;

        }// end switch

        if(displayObject is TextField)
        {
            returnObject = displayObject;
        }
        else if(displayObject is DisplayObjectContainer)
        {
            var doc:DisplayObjectContainer = displayObject as DisplayObjectContainer;
            var textFields:Vector.<TextField> = new Vector.<TextField>();

            for(var i:uint = 0; i < doc.numChildren; i++)
            {
                if(doc.getChildAt(i) is TextField) 
                textFields.push(doc.getChildAt(i));

            }// end for

            if(textFields.length == 0) returnObject = null
            else if(textFields.length == 1) returnObject = textFields[0]
            else if(textFields.length > 1) returnObject = textFields;

        }
        else
        {
            returnObject = null;

        }// end else

        return returnObject;

    }// end function

}// end package

また、その使用例を作成しました。ライブラリには、actionscript用にエクスポートしたボタンシンボルがあります。ボタンシンボルには、「上」状態の動的テキストフィールドが1つあり、そのtextプロパティの値は「a」です。ドキュメントクラスのコードは次のとおりです。

package
{
    import utils.getDTFFromSB;
    import flash.display.SimpleButton;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.text.TextField;

    public class Main extends Sprite
    {
        private var _myButton:SimpleButton;

        public function Main()
        {
            if(stage) init()
            else addEventListener(Event.ADDED_TO_STAGE, init);

        }// end function

        private function init(e:Event = null):void
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);

            _myButton = new MyButton();
            addChild(_myButton);

            var returnedObject:Object = getDTFFromSB(_myButton);

            var textField:TextField;

            if(returnedObject is TextField)
            {
                textField = TextField(returnedObject);

            }
            else if(returnedObject is Vector.<TextField>)
            {
                textField = Vector.<TextField>(returnedObject)[0];

            }
            else if(returnedObject == null)
            {
                throw new Error("null value returned from getDTFFromSB() method");

            }// end if

            trace(textField.text) // ouput: a

        }// end function

    }// end class

}// end package

と呼ばれるボタンシンボルの新しいインスタンスを作成するとき、_myButtonそれを関数に解析しgetDTFFromSB()、返されたオブジェクトをと呼ばれるローカルオブジェクトに格納しますreturnedObject。次に、ifステートメントを使用して戻りオブジェクトのタイプを判別し、それがTextFieldオブジェクト, I store it in a localTextFieldtextTextField`オブジェクトの場合は「a」を取得しますobject. Now if I trace theproperty of the

于 2011-07-26T09:54:10.310 に答える
0

このスクリプトでは「ボタン」は不明です。標準のボタンを作成する場合は、new Button()(大文字の B) を使用します。

ボタンにはテキスト属性はなく、「ラベル」と呼ばれるものがあると思います。

使ってみてください_btn.label

于 2011-07-25T16:10:37.890 に答える
0
package  {
  import flash.display.MovieClip;
  //import flash.display.SimpleButton;
  import fl.controls.Button

  public class container extends MovieClip {
    var _btn:button;
    public function container() {
      _btn= new button;
      this.addChild(_btn);
      switch (_btn.label)
      // switch (_btn._text.text)
      {
          case "a": doAFunction();
          case "b": doBFunction();
          case "c": doCFunction();
      }

    }

  }

}
于 2011-07-25T16:21:20.340 に答える