• 締切済み

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]; } } 上記で、該当ボタンをクリックしたときは、ボタンは反応するのですが、配列のところがうまくいってないみたいです。 原因がわかる方いらっしゃいましたらお願いいたします。

みんなの回答

  • 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