• 締切済み

createTextFieldを使う際にインスタンス名を動的に変える方法について

DPEの回答

  • DPE
  • ベストアンサー率85% (666/776)
回答No.1

createTextField で空っぽのテキストフィールドを作成する時に指定する名前は、ただの文字列です。 ですから、for ループの中で "Menu_TXT" + i と書いてもエラーにはなりませんし、テキストフィールドも正常に作成されます。 しかし、できたテキストフィールドの書式を決めたり、表示させる内容を変更する時は、作られたテキストフィールドの参照を指定しなければなりません。 ActionScript では、文字列を参照に変換することができます。 この変換には eval 関数か配列演算子 [ ] を利用しますが、eval 関数を使用する方法は旧式です。 特に Flash Player 6 以降は eval 関数の用法に制限がありますので、配列演算子 [ ] を使うようにしましょう。 例えば、ムービークリップ my_mc の中にテキストフィールド” Menu_Text ”がある場合、文字列からこのテキストフィールドを操作する時は  my_mc[ "Menu_TXT" ].text = "サンプル"; というように書きます。 [ ] の中には文字列を入れますので、文字列の連結も利用できます。 for ループの中で  my_mc[ "Menu_TXT" + i ].text = "サンプル"; ↑このように使うと、テキストフィールドの名前を” Menu_TXT ”+連番で付けておけば、該当する番号のテキストフィールドを次々に操作することができます。 ------------------------------------------------------------ 仮に、空っぽのムービークリップ” my_mc ”があるとします。 このムービークリップ内にテキストフィールド Menu_TXT0 ~ 4 (外枠あり)を作り、その中に決まったテキストを表示するスクリプトは、次のようになります。 このスクリプトは、my_mc があるタイムラインのフレームに設定してください。 (↓各行頭に全角のスペースが入っています。コピーする際は、全て半角のスペースかタブに置き換えてください)   //テキストフィールドに表示するテキストのリスト  item_list = new Array();  item_list = [ "トップ" , "製品情報" , "サポート" ,"会社情報" , "お問い合わせ" ];  //テキストフィールドの書式  format = new TextFormat();  format.font = "_等幅";  format.size = 15;  format.align = "center";  for( i = 0 ; i < 5 ; i++ )  {   //空のテキストフィールドを作成   my_mc.createTextField( "Menu_TXT" + i , i , 0 , 20 * i , 150 , 20 );   //外枠を付ける   my_mc[ "Menu_TXT" + i ].border = true;   //配列変数を見て、テキストフィールドにテキストを表示   my_mc[ "Menu_TXT" + i ].text = item_list[ i ];   //書式を適用する   my_mc[ "Menu_TXT" + i ].setTextFormat( format );  } ********************** テキストフィールドに表示する内容は、各テキストフィールドが持っている text というプロパティで管理されています。 このプロパティを書き換えることで、テキストフィールドの表示内容を変更できます。 上記の作例では、表示するテキストを予め配列変数に入れておいて、作ったテキストフィールドに順次表示するようにしています。 配列変数は、同じ名前で管理番号(インデックス)だけが違う変数が集まったものです。 配列変数のインデックスは 0 からの連番になっているので、テキストフィールドを作る for のループも 0 から始めると、テキストフィールドの番号と配列変数のインデックスがズレなくなります。 [ ] で文字列を参照に変換する手法は、テキストフィールドだけでなく、ムービークリップやボタン、ActionScript でいうところのオブジェクト(変数のようなもの)にも使えます。 このサイトでもいろいろな使い方が紹介されていますので、機会がありましたら研究してみてください。 ********************** なお、Flash Player 8 (作成ツールは Flash 8 )からは、createTextField メソッドは作成したテキストフィールドの参照を返してくるようになりました。 上記のスクリプトでは、テキストフィールドの表示内容や書式を決める際にいちいち [ ] 演算子で文字列を参照に変換しているのですが、  //空のテキストフィールドを作成  txt_obj = my_mc.createTextField( "Menu_TXT" + i , i , 0 , 20 * i , 150 , 20 ); ↑このように、変数に createTextField の戻り値を保存しておくと便利です。 例えば、先の例は Flash Player 8 以降でパブリッシュする場合は  for( i = 0 ; i < 5 ; i++ )  {   //空のテキストフィールドを作成   txt_obj = my_mc.createTextField( "Menu_TXT" + i , i , 0 , 20 * i , 150 , 20 );   //配列変数を見て、テキストフィールドにテキストを表示   txt_obj.text = item_list[ i ];  } と、スッキリと書くこともできます。 繰り返しますが、この仕様は Flash Player 8 で追加されたものです。 Flash Player 7 以前の createTextFiled メソッドは戻り値がありません。 Flash 8 以降をお使いでも、古いバージョンでパブリッシュする時はご注意ください。

ganmo0122
質問者

補足

有難うございます。 補足というか、インスタンスでの取り扱いはよく分かったのですが、テキストフィールド(ダイナミックテキスト)の変数の取り扱いも教えてください。このスレッドでお願いすることではないのでしょうが、少し似た疑問ですのでご了承ください。 ステージに配置されたMenu_MCインスタンスに、createTextFieldにてText_TXTというテキストフィールドを作成します。この時、このテキストフィールドの変数はmenu0とします。そして、これとは別にData_MCという空ムービークリップをMenu_MCと同じ階層に配置します。 <Data_MCのAS(ムービークリップアクション)> onClipEvent (load) { loadVariables("command.txt", this); } <Menu_MCのAS(フレームアクション)> Menu_MC.Menu_TXT.text=Data_MC.menu0 これで、外部テキストからmenu0のデータを動的テキストフィールドに表示することができました。 質問は、Menu_MC.Menu_TXT.text=Data_MC.menu0のmenu0の部分を動的に変化させたいのです。インスタンスではeval("インスタンス名"+ 変化値)等で対応できますが、テキストフィールドの動的なコーディングはできるのでしょうか?menu + i(変化する値)みたいな・・・

関連するQ&A

  • attachMovieでのインスタンス名

    以下のようなスクリプトを書いているのですが、 traceの値がすべてmenu_mcとなってしまいます。 インスタンス名をmenu1_mc,menu2_mc,menu3_mc,・・・としたいのですが、どうすればいいのでしょうか? i = 10; for(y = 0; y < i; y++) { trace(y); m = y+1; obj = _root.attachMovie("menu", "menu"+m, y); obj._x = 30; obj._y = 70*y; trace(this._name); } 環境はFlashCS3、ActionScript2.0です。 よろしくお願いします。

    • ベストアンサー
    • Flash
  • ステージにある複数のインスタンスを制御したいです

    ステージに配置してある複数のインスタンスをアクションスクリプトで制御したいです。 インスタンスには「mc0」~「mc9」の連番で名前をつけています。 例えば、それぞれのインスタンスのタイムラインを再生させる指示を与えるとすると、 mc0.gotoAndPlay("main"); mc1.gotoAndPlay("main"); mc2.gotoAndPlay("main"); mc3.gotoAndPlay("main"); ・ ・ ・ mc9.gotoAndPlay("main"); となると思いますが、もっとスマートに書くとするとどんな書き方があるでしょうか? 数がもっと増える可能性があるので、もっと合理的な方法を知りたいです。 アクションスクリプトで生成したインスタンスを動かすには、 for(var i:int=0;i<10;i++){ var mc:MovieClip=new McMC(); addChild(mc); mc.name="mc"+i; mc.x=200+i*50; mc.y=200; mc.gotoAndPlay("main"); } のような感じで動かすのはやったことがあるので 既にステージに直接配置されているインスタンスもfor文で同じように制御できると思い 以下のように試してみましたが… for(var i:int=0;i<10;i++){ var mc:MovieClip; mc.name="mc"+i; mc.x=200+i*50; mc.y=200; mc.gotoAndPlay("main"); } 未定義となってしまいます。 やはり地道に書くしかないのでしょうか? ご教授を宜しくお願い致します。 ※FlashCS4、AS3で作業しています。

    • ベストアンサー
    • Flash
  • thisをインスタンス名に変えたらムービーが動かない

    Flash8です。タイムライン上に、 ボタン(インスタンス名 b1_btn) と ムービークリップ(インスタンス名 test_mc) を配置しました。 次に、このボタンインスタンスに以下のイベントハンドラを記述しました。 ----------------- on (press) { this.stop(); } ----------------- 実行すると、ボタンを押せばムービーが停止します。 で次に、上記の記述を以下のように変えます。 ----------------- on (press) { test_mc.stop(); } ----------------- 実行すると、ボタンを押してもムービーが停止しません。 なにがイケないのでしょうか?

  • ムービークリップとインスタンス

    「ライブラリ内にあるのがムービークリップで、それをステージに配置したものがインスタンスである。」このように理解しているのですが、これは間違いでしょうか? 1、「MCを一つ作成し、それをステージ上に3カ所に配置し、各"MC"に01、02,03とインスタンス名を付けた。」 2、「MCを一つ作成し、それをステージ上に3カ所に配置し、各"インスタンス"に01、02,03とインスタンス名を付けた。」 上記の場合どちらが正しいのでしょうか? ムービークリップとインスタンスについてご教授ください。 よろしくお願いします。

    • ベストアンサー
    • Flash
  • attachMovieで生成したインスタンスを消す方法

    1.現在A.B.C・・・・という名前の多数のボタンがあります 2.それぞれをクリックすると、A1.B1.C1・・・・とそれぞれのインスタンスがZ_mcというムービークリップ内に生成されます。その時にボタンに記述したスクリプト on (press) { Z_mc.attachMovie( "識別子", "A1", 1); } 3.このままですとA.B.C・・・・とボタンをクリックしていくとインスタンスがA1.B1.C1・・・・と同じ場所に生成されるため、重なってしまいます。 どのようにボタンにスクリプトを記載すれば、前に生成されたインスタンスを削除して、新しいインスタンスを生成できるのでしょうか?よろしくお願いします。

    • ベストアンサー
    • Flash
  • attachMovieで生成したインスタンスへの文字代入

    FlashMX(AS1.0)を使用しています。 ダイナミックテキストを子にしたムービークリップのインスタンスをattachMovieで配置したのですが、ダイナミックテキストに文字列を代入しても文字のみが表示されません。 試しに、duplicateMovieClipでコピーした場合はダイナミックテキスト内の文字は表示されています。 スクリプトは以下のように組んでいます。 (略) 1:cnt++; 2:samp_mc = "tag"+cnt; 3:_root.attachMovie("sym_ln",samp_mc,cnt);//sym_ln...ダイナミックテキストを含んだシンボルのリンケージ 4:samp_mc.dymtxt = "123";//dymtxt...ダイナミックテキストの変数名 インスタンスを配置してもdymtxtに表示されません。が、 3:base_mc.duplicateMovieClip(samp_mc,cnt);//base_mc...ステージに配置したmcのインスタンス名 とすると表示されます。 attachMovieを使用してインスタンスを配置するようにしたいのですが、文字が表示されないのはどこに原因があるのでしょうか?

    • ベストアンサー
    • Flash
  • ActionScript3.0(アクションスクリプト3.0)でMovieClipインスタンスを配列で生成する方法

    よろしくお願いいたします。 アクションスクリプト3.0において、あるMovieClipクラスから複数のMovieClipインスタンスを作り、それぞれを独立して制御させたい時に、 インスタンスを生成する際、配列でしようとしたのですがエラーとなりうまくいきません。 var my_mc[i]:MovieClip = new MC(); 上記の宣言を繰り返し処理により複数インスタンス生成をしようと思っていました。 MovieClipインスタンスを配列で生成する場合は別の方法があるのでしょうか?それともそもそもできないのでしょうか? また、MovieClipインスタンスをそれぞれ独立して制御させたい場合、別の方法などありますでしょうか? 以上、間違った表現等あるかもしれませんが、よろしくお願いいたします。

    • ベストアンサー
    • Flash
  • 動的生成のムービークリップにインスタンス名でアクセスできないようです

    動的生成のムービークリップにインスタンス名でアクセスできないようです FLASHCS3(ActionScript3.0)でアルバムを作っています。 最大で5枚の外部画像を読み込んで (何枚有るかは読み込んでみないと分からない) それを配置させるスクリプトを書いています。 ただ、枚数によってそれぞれ配置させるする場所が異なるります 例えば1枚の時の1枚目の座標と、2枚の時の1枚目の座標は異なります。 これは、FLASHは、画像やファイルが何枚そのフォルダに有るかは セキュリティの関係上分からない(PHPなどを連携すればできるようだが) ので苦し紛れの策です。 numが読み込んだ画像の何枚目かを表しますが それを後で動かしたり出来るようにmcという ムービークリップにいれています。 mc.name = "mc"+num; インスタンス名は mc.name = "mc"+num; としておいて1枚目の時は getChildByName("mc0").x = 295; で所定の座標に配置できます。 ところが2枚目の時は 「null のオブジェクト参照のプロパティまたはメソッドにアクセスすることはできません。」 と表示されてしまい、1枚目の座標は変わらず、2枚目は表示されますが座標が0(左上)に 表示されてしまいます。 試しに//■■■■2枚目の時以下のif文を消すとエラーは出ないのですが なぜ1枚目はエラーがでなくて、2枚目はエラーが出るか分からないのです。 どなたか教えていただけると助かります。 よろしくお願いします。 (以下スクリプトの一部) //■■■■イベントリスナーでnumを渡す loader_obj.contentLoaderInfo.addEventListener(Event.COMPLETE,loadComp(num)); //■■■■イベントリスナー関数 function loadComp(num:int):Function{ return function(event:Event):void{ var loader:Loader = Loader(event.target.loader); var mc = new MovieClip; addChild(mc); addChild(event.target.loader); mc.addChild(event.target.loader); mc.name = "mc"+num; //■■■■1枚目の時 if ( num == 0 ){ getChildByName("mc0").x = 295; getChildByName("mc0").y = 30; } //■■■■2枚目の時 if ( num == 1 ){ getChildByName("mc0").x = 165;//■■■■1枚目の配置を変える getChildByName("mc1").x = 425; getChildByName("mc1").y = 30; } //■終わり } }

    • ベストアンサー
    • Flash
  • AS3.0 配置したインスタンスにswfの読み込み

    初歩的なご質問です。 AS3.0にて、ステージ上に配置したムービークリップ(インスタンス名:mc)に外部swf(test.swf)を読み込みたいのですが、、どうもうまくいきません。 わかりやすく申しますと、AS2.0形式では mc.loadMovie("test.swf"); となっているスクリプトをAS3.0で行いたいです。 拙い文章で恐縮ですが、よろしくお願いいたします。

    • ベストアンサー
    • Flash
  • gotoAndPlayでのインスタンス指定がうまくいかない

    みなさんこんばんわ。質問があって来ました。 レベルはまだAS3を始めて1ヶ月の者です。 あるシーンで4つのボタンインスタンスを配置しており それぞれクリックすると別のシーンへ飛ぶように設定したいのです。 「Action」というアクション用レイヤーを作り その1キーフレーム目に ------------------------------------------------------------- function about_car(btn) { this.gotoAndPlay("about_car"); } menu_bt1.addEventListener (MouseEvent.CLICK,about_car); ------------------------------------------------------------- と記述しましたが「1120: 未定義のプロパティ menu_bt1 へのアクセスです。」 というエラーが出てしまいます。 menu_bt1というインスタンスは間違いなく存在してインスタンス名も入れているんですが・・。 Actionレイヤーへの入力が間違っているんでしょうか。 はたまたスクリプト自体が間違ってるんでしょうか。 単純に4つのボタンから各シーンへ飛ばしたいです。 4つのシーンはラベルレイヤーを作成し切り分け済みです。 乱文ですみませんが、もしお力貸していただければ幸いです。 よろしくお願いいたします。