• 締切済み

for文内での関数の使用がうまくいきません。

いつもお世話になってます。flash初心者です。 環境:flash 2004 MX, WIN XP ボタンが3つ、それぞれ a0, a1, a2~ a(n個)という名前で存在します。このボタンを押したときに変数の値を代入するためのスクリプトを作りました。 文が長くて、for文を使って、繰り返しの処理を省略したいのですが、for文内で、変数に 配列の値を代入することに失敗してしまいます。 まず、ダイナミックテキストの変数名を myhoge にする。 //各ボタン用のテキストを定義 var hoge = new Array(); hoge[0] = "0番のボタンを押したときのテキスト"; hoge[1] = "1番のボタンを押したときのテキスト"; hoge[2] = "2番のボタンを押したときのテキスト"; ↓ hoge[99] = "99番のボタンを押したときのテキスト"; for (var i:Number = 0; i <= 99; i++) { _root["a"+i].onRelease = function() { _root.myhoge = _root.hoge[i]; } } 上記で、該当ボタンをクリックしたときは、ボタンは反応するのですが、配列のところがうまくいってないみたいです。 原因がわかる方いらっしゃいましたらお願いいたします。

  • Flash
  • 回答数1
  • ありがとう数1

みんなの回答

  • BlurFiltan
  • ベストアンサー率91% (1611/1754)
回答No.1

話が込み入ってますね。 話が 完全にグチャグチャに見えます...(グチャグチャです)。 ご質問を2等分すると, 半分は結構まともに普通の疑問で, 個人的に私がさっき回答した質問, 「AS2 for文内のfunctionがうまくいきません」 http://okwave.jp/qa4160937.html と同じです。 "for文実行のとき" に変数 i は, 0→1→2→3→…→99 と変動します。 したがって for文実行終了後に i は 99 になっています。 …時間は流れ… それからしばらくして(プログラムの流れから言うとずっと後に), ボタンがクリックされます。 そのとき,i は当然 99 ですから, どのボタンをクリックしても, _root.myhoge = _root.hoge[i]; つまり, _root.myhoge = _root.hoge[99]; が実行されます。 for (var i:Number = 0; i <= 99; i++) { _root["a"+i].onRelease = function() { _root.myhoge = _root.hoge[i]; }; }  ↓変更↓ for (var i:Number = 0; i <= 99; i++) { _root["a"+i].i = i; _root["a"+i].onRelease = function() { _root.myhoge = _root.hoge[this.i]; }; } のようにすると対処できると思います。 しかし… =================== > 変数に配列の値を代入することに失敗してしまいます。  ↑全然違うことですよ↓ > ダイナミックテキストの変数名を myhoge にする。 なぜダイナミックテキストの変数名を変えなければならないのかもわかりませんし, そもそもダイナミックテキストに変数名を付けること自体がFlashで非推奨なことです。 ダイナミックテキストに変数名を付けるのは, Flash5 までのことで,FlashMX以降はンスタンス名を付けます。 そして, そのインスタンス名のテキストフィールドに対して,  テキストフィールドインスタンス名.text = ○○; のようにして, テキストフィールドに何某かの文字列などを表示させるのです。 したがって, 上のスクリプトを書き替えた場合, 「myhoge」 というインスタンス名をテキストフィールドに付けて, _root["a"+i].onRelease = function() { _root.myhoge = _root.hoge[this.i]; };  ↓変更↓ _root["a"+i].onRelease = function() { _root.myhoge.text = _root.hoge[this.i]; }; とするのです。 ~・~・~・~・~・~・~・~・~・~・~ 仮に(超仮り的で想像も付かない変な場合), テキストフィールドの変数名を変えることがあるかもしれませんが, その場合もテキストフィールドにインスタンス名は必要です。 そして, そのテキストフィールドインスタンスに対して, variable (TextField.variable プロパティ) を与えます。 http://livedocs.adobe.com/flash/8_jp/main/00002790.html すると, そのテキストフィールドインスタンスの変数名を変える(与える)ことができます。 その場合,とりあえず, 「myhoge」 というインスタンス名をテキストフィールドに付けて, _root["a"+i].onRelease = function() { _root.myhoge = _root.hoge[this.i]; };  ↓変更↓ _root["a"+i].onRelease = function() { _root.myhoge.variable = _root.hoge[this.i]; }; とすれば良いわけですが...が...ががが...., しかし! かなり変なのがわかりますか? もし上記のようにすると, テキストフィールドの "変数名" が, 「0番のボタンを押したときのテキスト」 となるのですよ。 そんな変数名は付けてはいけません。 というわけで,最初にもどって, 話が 完全にグチャグチャに見えます...(グチャグチャです)。 ◎参考URL 「テキストフィールドのインスタンス名と変数名について」 http://livedocs.adobe.com/flash/9.0_jp/main/00000881.html > プロパティインスペクタの [変数] テキストボックスで、 > 変数名をダイナミックテキストフィールドや > テキスト入力フィールドに割り当てることができます。 > これによって、変数に値を割り当てることができます。 > これは、旧バージョンの Flash Player (Flash Player 4 など) 用の > アプリケーションを作成するときに使用する可能性のある > 非推奨の機能です。  ~~~~~~~~~~~~~~~ > それよりも新しいプレーヤーを対象にするときは、 > インスタンス名と ActionScript を使用して、  ~~~~~~~~~~~~~~ > テキストフィールドのテキストをターゲットにする必要があります。

関連するQ&A

  • 関数内での繰り返し処理の結果を配列で受け取りたい

    関数内でfor文で繰り返し処理を行い、 結果を配列として返すような関数を書きたいと思っています。 function hoge(){ var a = [1,2,3,4]; for (var i=0; i < a.length; i++){ a1 = "a" + i; var arr = new Array(); arr.push(a1); } return arr; } しかし、以下のように 関数hogeの結果を変数bで受け取ってみると、 配列の最後のデータしか表示されません。 var b = hoge(); alert(b); //a3のみが表示される a0, a1, a2, a3と表示されるようにするには、 どうしたらよいでしょうか。

  • rubyで配列名をfor文で変更したい

    ruby(というかプログラミング)初心者です。 つまづいてしまったところがあり質問をさせていただきました。 hoge0、hoge1、hoge2 の3つの配列があります。 これをfor文の中で次のように利用したいと思いました。 for i in 0..2  hoge=hoge ??? i ←不明な点 (例)hoge=hoge0 としたい    ・    ・    ・ end つまり変数iを利用して配列名を順次変えていきたいのですがどうすればいいでしょうか。 hoge="hoge#{i}"としたら文字列hoge0が代入されるだけですし、hoge+iのような書き方もできません。 お時間あるときで結構ですのでお教えください。

  • 配列を使わずに、数字(連番)を使用した変数に値を代入したい。

    配列を使わずに、数字(連番)を使用した変数に値を代入したい。 お世話になっております。 配列を使わずに、数字(連番)を使用した変数($a1,$a2,$a3・・・)に、 forループを使って、値を代入したい。 #================================= for($i;$i<10;$i++){ $a??? = 10; #←ここがわかりません。 } #================================= どなたかご存知の方、ご教授ください。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • Flashのfor文で変数名を・・・

    Flashでfor文を使い、変数に値をいれたいと考えています。 kotae1,kotae2,kotae3・・・kotae10という名前の変数に 数字の順に答えを格納していきたいのですが、 iを使って表現するにはどのようにすればいいのでしょうか。 for(var i = 0; i < 10; i++){ 「   」= i * 10; } 「 」のところです。 よろしくお願いします!

    • ベストアンサー
    • Flash
  • jQuery for内にある配列の後のドットは何?

    jQuery(?) for文内で、配列の後にドット演算子があるのですが、これは何でしょうか? for ( var i=0, len=hoge.length; i<len; i++ ) {  hoge[i].max = 5;  hoge[i].count = i; } ・maxはどこにある(属している)のでしょうか? ・hoge配列内? ・そもそもmaxは変数? ・ちなみに、hogeは、getElementsByClassNameで取得しています ・この場合のドット演算子は、セレクタの一種? ・変数に格納しているわけではなくて、DOMを操作しているだけ?

  • for文を簡単な処理に書き変えたい

    いま、配列を作る作業をしているのですが、for文を使うと、forをいくつ書けば良いのか分からない状態です。 作ろうとしている配列が、A[X][Y]で、Xの要素数は固定で良いのですが、Yの要素数が実験のたびに変動するためです。そして、処理したいのが、この配列の各列の値を適当な値(このfor文の前に値が決まっています)を代入することです。 例えば、for文だと、Y=3のときには for(i=0;i<○;i++){ for(j=0;j<○;j++){ for(k=0;k<○;k++){ A[line][0] = C[i];//(Cという配列のi成分) A[line][1] = B[j]; A[line][2] = E[k]; } } } のように書くような内容なのですが、Yが増えると、for文も増やさないといけません。 ここで、再帰処理のような方法をつかってうまく書きたいのですが、どう書いたら良いのか分かりません。 一般的なfor文の書き換え方みたいなことでも良いので、教えて頂けませんか?宜しくお願いします。

  • 配列を抜き出し新しい配列を作りたい

    いつも参考にさせて頂いています。 今あるボタンAに function sortFunc(a, b) { return a.ID-b.ID; } hoge = new Array(); hoge.push({ID:_root.g1, a:"○○", b:"mc_maru"}); hoge.push({ID:_root.g2, a:"△△", b:"mc_sankaku"}); hoge.push({ID:_root.g3, a:"□□", b:"mc_shikaku"}); hoge.sort(sortFunc); // 結果 { } for (var i = hoge.length; i>=0; i--) { trace(hoge[i].ID+hoge[i].a+hoge[i].b); this.key_text.text +=(("\r")+hoge[i].a); } } このような配列の並び替えをしています。 _root.g1、2、3の点数を受けて点数の高い順に並び替えしてる 物を_key.textと言うダイナミックテキストに渡して表示させています。 この並び替えを利用し点数の高いものを二つを抜きだしたいのですが、 Array.slice()をどうやって使えばいいのか分からず困っています。 わかる方いらしたら教えて頂けないでしょうか?

    • ベストアンサー
    • Flash
  • for文を使って変数に値を入れる方法

    以下のプログラムでfor文を使ってx1に1, x2に2, x3に3を代入したいのですが、 変数x1~3をfor文を使って表す方法がわかりません。 下記のように var test = "x" + i; で変数testにx1という文字列を持たせ、そこにiを代入すれば上手くいくかなと思いましたが 上手くいきません。どのようにすれば期待通りになるか教えていただけないでしょうか。 ============================================ var x1 = 0; var x2 = 0; var x3 = 0; for(var i=1; i<=3 ; i++){ //x1に1, x2に2, x3に3を代入したい var test = "x" + i; test = i; } alert("x1=" + x1 + ",x2=" + x2 + ",x3=" + x3); ============================================

  • for文での変数宣言について(他言語共通)

    for(var i = 0; i < 9; i++) { } このように、for文の()内で変数宣言をすることがあるだろうと思います。 これを入れ子にするのならば当然(場合にもよりますが) for(var i = 0; i < 9; i++) { for(var j = 0; j < 9; j++) { } } このように、新しい変数を定義します。 しかし、次のように、2つのfor文が並列する場合、2つ目のfor文で変数宣言をすべきではありません。 ですが、 片方だけに宣言がある・for文の外に宣言がある・2つ目のfor文には別の変数を宣言する いずれもしっくり来ません。 どのように書くのが一般的なのでしょうか。 皆様の書き方をご投稿ください。よろしくお願いします。 //ここでvar i = 0;と書くか … A for(i = 0; i < 9; i++)//ここでfor(var i = 0; i < 9; i++)と書くか … B { } for(i = 0; i < 9; i++)//ここでfor(j = 0; j < 9; j++)と別の変数を定義するか … C { } //または、いずれでもない回答者様のオリジナルの書き方 ※この例では、1つ目のfor文が終わった時点でiの値を保持する必要はありません。

  • for文内での変数定義

    以前にC++の講義を受けた際に for(int i = 0; i < hoge ; i++){    int j;    ・    ・    ・ } のようなコードを書くと、jがhoge分だけ"生成されて しまう"のでよろしくありません。と教えられました。 しかし、最近別の方からこの部分に関しては、jをfor文の 中に定義しようが、最適化?によりfor文の外に出された バイナリが生成されると聞きました。そのため、jが 必要となる直前でjを定義しても(for文の中に定義しても) 問題ない。と教えられました。 どちらが正しいのでしょうか? 近年にC++の仕様変更があったとしたら、それに伴い 変更されたのでしょうか? また、どのようなコードが望ましいなどありましたら 教えてください。

専門家に質問してみよう