2011-07-25 14 views
0

私は "handmade"ボタン(インスタンス名として_btn)を持っていて、内部にdynamicTextだけを持っています(あるいは、4つのボタンモードのそれぞれに対して1つのdynaticTextを言うことができます)。 UpモードのdynamicTextのインスタンス名は "_text"です。 ボタンを含むmovieClipのASで作業している場合、どのように動的テキストのテキストにアドレス指定できますか?buttom内の動的テキストにどう対処できますか?

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. 
+0

'container'クラスはドキュメントクラスですか? – Taurayi

+0

はい、それは.....あなたがフラッシュファイルのASクラスを意味する場合です。^^ " –

+0

あなたは私の答えを受け入れてくれました、私はそれをうまく説明してくれればと思っています。 – Taurayi

答えて

1

フラッシュプロフェッショナルでボタンシンボルを作成すると、シンボルはSimpleButtonのインスタンスになります。ダイナミックテキストフィールドなどのボタンシンボルで作成した表示オ​​ブジェクトにアクセスするには、オブジェクトのupState,overStatedownStateおよびhitTestStateのプロパティを使用してアクセスしなければなりません。

ダイナミックなテキストフィールドを取得するためにプロジェクトに含めることができるユーティリティ関数を作成しました。この関数はgetDTFFromSB()(シンプルボタンから動的テキストフィールドを取得)と呼ばれます。

この関数の引数は、simpleButtonstateです。 simpleButton引数は、問題のSimpleButtonオブジェクトのために明らかにされ、そしてstate引数が指定され、状態プロパティ(upStateoverStatedownStatehitTestState)のためであるテキストフィールドは、それぞれの文字列値を持つに位置しています:「アップ」、「オーバー」、 "ダウン"と "ヒット"。

この関数は、TextFieldオブジェクト、Vector.<TextFieldオブジェクトまたはnullのいずれかのObjectオブジェクトを返します。ここで

は、ユーティリティ関数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 

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

0

「ボタンが」このスクリプトでは知られていない - あなたは、標準のボタンを作成したい場合は、(資本Bで)new Button()を使用しています。

と私はボタンにはテキスト属性がないと思うが、それは "ラベル"と呼ばれています。

_btn.labelを試してみてください。

+0

ありがとうございます...実際は"ボタン "は私が作ったクラスなので、 。T_Tそして問題は、ボタン内部の動的なテキストを比較、変更することです。 –

+0

何を比較したいですか?どのボタンが押されていますか?次にイベントリスナーでこれを行います。 – pkyeck

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(); 
     } 

    } 

    } 

} 
+0

なぜ私のFlashですか? ?\t 1172:定義mx.controls:ボタンが見つかりませんでした –

+0

ああ、申し訳ありませんが、Flex 3ライブラリを使用しました。フラッシュcs4 fl.controlsのコードを調整しました。 Button –

+0

@Brian LinあなたがButtonクラスのコードを投稿していなければ、これは誰でもあなたを提供できる最高のものです。 –

関連する問題