• 締切済み

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

お世話になります。 my_mc.createTextField("Menu_TXT",2,200,150,30,12) 通常、上記のようなスクリプトを書くとmy_mcにMenu_TXTというテキストフィールドを配置するのですが、これをMenu_TXT0~Menu_TXT10まで作成したい場合、for文を使って構築したいと思っています。 for文の構成は分かるのですが、インスタンス名を動的に変えたい場合の記述法が分かりません。例えば"Menu_TXT"+iとするとエラーですよね!?これをうまく書く方法はないでしょうか?

みんなの回答

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

#1です。 [ ] 演算子では、テキストフィールドやムービークリップなどのインスタンスだけでなく、変数の参照にも変換できます。 仮に、ステージにムービークリップ” Menu_MC ”があり、その中にムービークリップ” Data_MC ”があって、Data_MC にテキストファイル” command.txt ”から変数を読み込むとします。 command.txt の内容は  menu0=たたかう&menu1=まほう&menu2=どうぐ&menu3=ぼうぎょ&menu4=にげる だとします。 Menu_MC にスクリプトでテキストフィールドを作り、読み込んだ変数を連結して表示するスクリプトは、次のようになります。 このスクリプトは、メインのタイムラインのフレームに設定してください。 (↓各行頭に全角のスペースが入っています。コピーする際はご注意ください)  //Menu_MCに空のテキストフィールドを作る  Menu_MC.createTextField( "Menu_TXT" , 0 , 0 , 0 , 150 , 100 );  //Data_MCに外部テキストファイルからShift-JISで変数を読み込む  System.useCodepage = true;  Menu_MC.Data_MC.loadVariables( "command.txt" );  //データ読み込み終了後、テキストフィールドに出力  Menu_MC.Data_MC.onData = function()  {   //全ての変数を連結して表示   for( i = 0 ; i <= 4 ; i++ )   {    Menu_MC.Menu_TXT.text += this[ "menu" + i ] + "\n";   }  }; 実行すると、Menu_MC の中に” Menu_TXT ”というインスタンス名のテキストフィールドが作られて、  たたかう  まほう  どうぐ  ぼうぎょ  にげる ↑このように文字列が出力されます。 表示される内容は、テキストファイルから読み込んだ変数 menu0 ~ 4 を、それぞれの末尾に改行コード(” \n ”)を追加しながら連結したものです。 *********************** テキストファイルから読み込む方法・読み込みの完了を待つ方法・改行コードの問題などは、今回は本題ではないので詳しくは触れませんが。 外部から読み込んだものを利用する時は、必ず、読み込みが完了するまで待ってから次の処理に進むようにしましょう。   MovieClip クラス( Flash MX 以前はオブジェクト)の loadVariables メソッドで読み込んだ場合は、data イベントを利用して読み込みの完了を検出できます。 Flash Player 6 以降からは、onData = function という書き方で、data イベント発生時(読み込みが完了した時)に実行する処理を定義できるようになりました。 onData に登録される関数の中での this は、onData イベントハンドラの持ち主を指します。 つまり、上記のスクリプトの  Menu_MC.Menu_TXT.text += this[ "menu" + i ] + "\n"; ↑この箇所の this は、Menu_MC 内にある Data_MC を指しています。 Data_MC の loadVariables メソッドで読み込むと、読み込まれた変数 menu0 ~ 4 は Data_MC のものになりますから、この場合は this を使って変数を指定することができます。 なお、読み込みに関しては LoadVars クラスを使う方法もあります。 *********************** 今回のポイントは  this[ "menu" + i ] この部分です。 menu0 ~ 4 は変数ですが、テキストフィールドやムービークリップのインスタンスと同様に、[ ] 演算子で文字列を参照に変換することで変数を指定できます。 実は、文字列を参照に変換して関数を呼び出すこともできます。 Test1 と Test2 という関数を定義して  for( i = 1 ; i <= 2 ; i++ )  {   this[ "Test" + i ]();  } とすれば、Test1 に続いて Test2 が呼び出されます。 先のスクリプトでの変数 menu0 ~ 4 も、上記の関数の例でも、変数や関数は既に存在しているものでした。 [ ] 演算子で変換することで、文字列で指定して変数やオブジェクトを動的に作ることもできます。 例えば  for( i = 1 ; i <= 2 ; i++ )  {   this[ "no" + i ] = i;  } ↑このスクリプトでは、no1 と no2 という変数が作成され、それぞれの値が 1 と 2 になります。 古い Flash Player では eval 関数でも似たようなことができますが、Flash Player 6 以降は式の左辺に eval 関数を使うとエラーになります。 これが、eval 関数を使う手法が旧式とされる理由でもあります。 ある階層の中にある対象を指定することもできますが、その際は、1つの階層の指定につき1組の [ ] でくくります。 eval 関数では  eval( "Menu_MC.Data_MC.menu" + i ) と、階層を” . ”で区切り、ひとまとめにして指定できましたが、[ ] の中では” . ”が階層の区切りの役目を果たしません。 [ ] 演算子を使う時は  this[ "Menu_MC" ][ "Data_MC" ][ "menu" + i ] このように、1階層分の文字列を1組の [ ] でくくります。 他にも、Menu_MC.Data_MC[ "menu" + i ] というように、最初から参照になっているものと組み合わせるなど、様々な使い方があります。 ある書き方だけが正しくて他は間違いというわけではないので、いろいろな使い方を研究してみてください。

ganmo0122
質問者

お礼

ありがとうございます^^ 文字列を参照に変換して関数を呼び出す方法、とても良いですね! これから役に立てていこうと思います。 本当に助かりました。

全文を見る
すると、全ての回答が全文表示されます。
  • 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つのシーンはラベルレイヤーを作成し切り分け済みです。 乱文ですみませんが、もしお力貸していただければ幸いです。 よろしくお願いいたします。

VM-C7200の電源が入らない原因は?
このQ&Aのポイント
  • VM-C7200の電源を入れても液晶が一瞬チラつくだけで反応がない現象について、原因を知りたいです。
  • 電子楽器メーカーローランド製品、ボス製品のVM-C7200の電源が入らない問題について質問です。
  • VM-C7200を起動した際に液晶がチラついているが、その後反応がない状況について教えてください。
回答を見る

専門家に質問してみよう