• 締切済み

テキスト入力ボックスからテキスト入力ボックスへエンターキーで移動する方法

FLASH8でかけ算クイズを作っています。   □ × □ = □           ↓エンターキーで移動させる   □ × □ = □             ○→問題ボタン 1.問題ボタンに on (release) { myBox2 = Math.floor(Math.random()*9+1);} と入力をし、クリックをした後に解答ボックスに自動的に移動させ、解答欄のテキストボックスに答えをいれてエンターキーを押すと次の問題の解答欄に移動させたいのですがなかなかうまくいきません。FLASHではこの設定はムリなのでしょうか?こどもが使うとしたらエンターで移動するようにしないと難しいので是非教えていただきたいです。

みんなの回答

noname#35109
noname#35109
回答No.2

#1です。 >> フリーズしてしまいました。 Flash 8 で, 実際に,「myBox1」~「myBox10」というインスタンス名の付いた 10個のテキスト入力のテキストフィールドを作成して, #1で書いたスクリプトをコピペして, // インスタンス名の頭の文字列を登録(※可変) var myname = "myBox"; // 通し番号の最終番号を登録(※可変) var mynum = 10; と変えて, 動作確認してみましたが,正常に動作し,フリーズもしませんでしたよ。 フリーズする気配も見せませんでした。 ちなみに, // インスタンス名の頭の文字列を登録(※可変) var myname = "myBox"; // 通し番号の最終番号を登録(※可変) var mynum = 1000; こうして, mynum の値を 1000 にして 1000 回ループさせてみても,フリーズしません。 #1に書いたスクリプトでフリーズの原因となり得る箇所は  // もしフォーカスが当たっている物が  // 入力用テキストフィールド のどれか1つに該当すれば     for (var i = 1; i<=mynum; i++) {       if (myfocus == "_level0."+myname+i) {         // txtnum にそのテキストフィールドの通し番号をセット         txtnum = i;       }     } この for文 のみです。 他は上手く動作しない原因にはなったとしても, フリーズの原因にはならないと思います。 例えば,   for (var i = 1; i<=mynum; i++) {      ↓ 変更 ↓   for (var i = 1; i<=mynu; i++) { とすれば,フリーズします。 変数 mynu なんてものはどこにも書いていないのに, 変数 i が,変数 mynu の値になるまでループしようとしますから, 無限ループになりフリーズします。 for (var i = 1; i<=mynum; i++) この↑行がちゃんとこの通りになっているか確かめてみてください。 また, mynum という変数名を何処か別の場所で使われていたら, その値の影響でひょっとしたらフリーズしてしまうかもしれません。 mynum という変数名が,他の場所でかぶって使われていないか確かめてみてください。 もし,使われていなければ, for (var i = 1; i<=mynum; i++) これと↑, // 通し番号の最終番号を登録(※可変) var mynum = 10; これを↑再度確認してみてください。 // 通し番号の最終番号を登録(※可変) var mynum = 10; この↑ように 10 は全角文字ではダメです。 // 通し番号の最終番号を登録(※可変) var mynam = 10; この↑ように勝手に変数名を変えてもダメです。 別に変えても良いですが, 変えたなら変えたで他の部分も全て訂正しないとおかしくなります。 >> 100以上の設定が出来るのだろうかと不安ではありますが。 これは,タブインデックスの数が100以上あるということですか? 100個ぐらい余裕で大丈夫です。 Flash におけるオーサリングの限界は, シンボルの数だけでも 16000 個です。 インスタンス数ではありませんよ,ライブラリの中のシンボルの数です。 ですからタブインデックスは10000個ぐらいでもまだまだ大丈夫だと思います。 Flash の機能より,人間の書き間違えいや付け忘れの方が心配です。 >> 「ENTER」きーでも同じことなのですが、 >> 思わぬところで「Tab」キーを押してしまって >> 次に移動してしまうことはないのだろうかと思いました。 そりゃあるでしょう。 ウインドウの「×」ボタンをクリックして閉じようとしたのに, 「最大化」ボタンをクリックしてしまって, 閉じたいウィンドウを巨大化させてしまうことはしょっちゅうですし, 文章を打っている途中で誤字を打ってしまって, 「BackSpase」キーを押そうとしたところが「Enter」キーを押してしまって改行してしまったなどということは, 日常茶飯事です。 また, 文章入力中の文字の変換で, 明らかに違う文字なのに「Enter」キーで決定してしまって, 変な 分掌 担って しまうこともしょっちゅうです。     ~~~~~ ~~~~~~ 言ってたらきりがありません。 そう言うことも十分あるということを知ることも教育に1つだと思いますし, そう言うことが実際にあるので注意するという能力も付くと思います。 また, 「Shif」キー + 「Tab」キー で逆移動もできます。 つまり,やり直しもききます。 ちなみに #1 のスクリプトに, 意味のない行が入ったままになっていました。 // インスタンス名の頭の文字列の文字数の取得 var mylen = myname.length; この行があって変なことになるわけではありませんが, この行はあっても何の意味も持ちません。 作成中のスクリプトの消し忘れです。失礼しました。 ついでに,スクリプトではなく,コメント行が1つ変です。 // それ以外は count に 1 を加算 txtnum++;        ↓ 訂正 ↓ // それ以外は txtnum に 1 を加算 txtnum++; 最初,変数名 count でスクリプトを作成していて, 途中で気が変わったので txtnum に変えたのですが, コメント行は元のままで訂正し忘れていました。 そう言うこと(上のようなミス)が実際にあるので注意しなければならないと思っていても, 注意するという能力が,私にはまだ身に付いていないようです...。 訂正ついでです。 >> 思わぬところで「Tab」キーを押してしまって >> 次に移動してしまうことはないのだろうかと思いました。 思わぬところで「Enter」キーを押してしまった場合, 上矢印 「↑(UP)」キー で,前(上)のテキストフィールドに移動するようにするとすれば, スクリプトは次のようになります。 /////////////////////////////////////////////// /*  準備:_root にある入力用テキストフィールドには,  例えば myBox1,myBox2,myBox3 … のように,  任意のインスタンス名(1から始まる連番付き)が  付けてある状態のものを用意している状態 */ // インスタンス名の頭の文字列を登録(※可変) var myname = "myBox"; // 通し番号の最終番号を登録(※可変) var mynum = 10; // // -------------- // // キーリスナー用オブジェクト myKey の作成 var myKey = new Object(); // // myKey.onKeyDown 関数の定義 myKey.onKeyDown = function() { // 変数 txtnum の初期値を設定 var txtnum = null; // フォーカスが当たっている物のインスタンス名を取得 myfocus = Selection.getFocus(); // もしフォーカスが当たっている物が // 入力用テキストフィールド のどれか1つに該当すれば for (var i = 1; i<=mynum; i++) { if (myfocus == "_level0."+myname+i) { // txtnum にそのテキストフィールドの通し番号をセット txtnum = i; } } // もし Enter キーが押され,なおかつ, // 入力用テキストフィールドのいずれかにフォーカスがあれば, if (Key.getCode() == Key.ENTER && txtnum != null) { // さらに txtnum が mynum に達すれば if (txtnum == mynum) { // txtnum を 1 に戻す txtnum = 1; } else { // それ以外は txtnum に 1 を加算 txtnum++; } // 次のテキストフィールドにフォーカスをセット Selection.setFocus(_root[myname+txtnum]); // // もし 「↑(UP)」 キーが押され,なおかつ, // 入力用テキストフィールドのいずれかにフォーカスがあれば, } else if (Key.getCode() == Key.UP && txtnum != null) { // さらに txtnum が 1 に達すれば if (txtnum == 1) { // txtnum を mynum に進める txtnum = mynum; } else { // それ以外は txtnum に 1 を減算 txtnum--; } // 次のテキストフィールドにフォーカスをセット Selection.setFocus(_root[myname+txtnum]); } }; // // Keyクラスにリスナーを登録 Key.addListener(myKey); /////////////////////////////////////////////// 本題とは無関係ですし, 好みですからどちらでも良いのですが, ついでに // myKey.onKeyUp 関数の定義 myKey.onKeyUp = function() {    ↓ 変更しました ↓ // myKey.onKeyDown 関数の定義 myKey.onKeyDown = function() { これはべつに上の myKey.onKeyUp ままでもかまいません。 「↑(UP)」 キーで上に行けることによって, 思わぬ失敗を防ぐことはできませんが, 「Shif」キー + 「Tab」キー で逆移動するように, やり直しはききます。

全文を見る
すると、全ての回答が全文表示されます。
noname#35109
noname#35109
回答No.1

おっしゃりたいことはわかりますし, エンターキーで次のテキストフィールドに移動することは可能です。 しかし,Flashではなく先に, > FLASHではこの設定はムリなのでしょうか? > こどもが使うとしたらエンターで移動するようにしないと > 難しいので是非教えていただきたいです。 これ自体に関してコメントを付けさせていただきます。 普通はエンターキーでテキストフィールを移動しないでしょう。 普通ネット上の 入力フォーム のたぐいもそうです。 入力フォーム のたぐいとは, 名前 メールアドレス 住所 … のように 複数のテキストエリアに入力していく登録フォームみたいなものや, メールフォームみたいな物のことです。 そういうものに限らず, MS-Word など普通のワープロソフトなどでは, エンターは「変換の決定」もしくは「改行」を担当します。 エンターキーで次のテキストエリアに移動できるのは, Excel など表計算ソフトぐらいではないでしょうか? ああいうものは, 規則正しくいわゆる セル が配置されているので, 例えば,Excelだと, 「ツール」→「オプション」→「編集タブ」で, 「入力後にセルを移動する」の方向を「下」や「上」や「右」や「左」に指定する設定で, "次にフォーカスをセットするもの" が簡単にセットできるのです。 ネット上のフォームや,Flash の場合は「Tab」キーで移動します。 しかし,Excel などのようにキッチリしたマス目が固定されていません。 自由に配置できますし, Flash の場合は特にアニメーションソフトですから, テキストフィールドが動き回る可能性があります。 ですから, ご存じかもしれませんが,Flash の場合, その Tab キーで移動する順は,「下」や「上」や「右」や「左」に指定するのはそもそも無理なので, テキストフィールドに ダブインデックス(tabIndex) というものが用意されています。 タブインデックスをテキストフィールドに付けて, 「Tab」キーを押すと, タブインデックスの数字の順にフォーカスが移動するようにはできています。 詳細はこちらを↓。 「Flash ではじめるアクセシビリティ」 http://www.adobe.com/jp/macromedia/accessibility/column/togoru/index_02.html 以上のようなわけですが, 一応エンターキーで次のテキストフィールドに移動できます。 ただし, それは,質問者さまが勝手に決めたルールですから, 勝手に決めたルールに対しては,プログラムを作らなければなりません。 以下は,その方法(例)です。 ===================== まず, 答えを解答するテキストフィールドに,インスタンス名を付けてください。 ただし, 名前の付け方にはスクリプトを単純化するため,ルールがあります。 解答を進めたい順に  myText1,myText2,myText3,… や,  kaitou1,kaitou2,kaitou3,… のように,任意の決まった文字列と,1から始まる連番を付けてください。 次の例では,  kotae1,kotae2,kotae3,… のようなインスタンス名を付けたとしておきます。 また, 次のサンプルスクリプトでは, 入力テキストフィールドは _root にあって,  kotae1 ~ kotae5 までがあった場合のサンプルです。 その入力用テキストフィールドがあるフレームに, フレームのスクリプトとして次のように書いて(コピペして)ください。 ------------------------------------------- /*  準備:_root にある入力用テキストフィールドには,  例えば kotae1,kotae2,kotae3 … のように,  任意のインスタンス名(1から始まる連番付き)が  付けてある状態のものを用意している状態 */ // インスタンス名の頭の文字列を登録(※可変) var myname = "kotae"; // 通し番号の最終番号を登録(※可変) var mynum = 5; // // -------------- // インスタンス名の頭の文字列の文字数の取得 var mylen = myname.length; // // キーリスナー用オブジェクト myKey の作成 var myKey = new Object(); // // myKey.onKeyUp 関数の定義 myKey.onKeyUp = function() { // 変数 txtnum の初期値を設定 var txtnum = null; // フォーカスが当たっている物のインスタンス名を取得 myfocus = Selection.getFocus(); // もしフォーカスが当たっている物が // 入力用テキストフィールド のどれか1つに該当すれば for (var i = 1; i<=mynum; i++) { if (myfocus == "_level0."+myname+i) { // txtnum にそのテキストフィールドの通し番号をセット txtnum = i; } } // もし Enter キーが押され,なおかつ, // 入力用テキストフィールドのいずれかにフォーカスがあれば, if (Key.getCode() == Key.ENTER && txtnum != null) { // さらに txtnum が mynum に達すれば if (txtnum == mynum) { // txtnum を 1 に戻す txtnum = 1; } else { // それ以外は count に 1 を加算 txtnum++; } // 次のテキストフィールドにフォーカスをセット Selection.setFocus(_root[myname+txtnum]); } }; // // Keyクラスにリスナーを登録 Key.addListener(myKey); ------------------------------------------- この例は,最初に書きましたとおり, 入力テキストフィールドは _root にあって,  kotae1 ~ kotae5 までがあった場合のサンプルです。 したがって,スクリプトの最初の2行が次のようになっていますが,  // インスタンス名の頭の文字列を登録(※可変)  var myname = "kotae";  // 通し番号の最終番号を登録(※可変)  var mynum = 5; この部分は作ったものによって変えてください。 実際にフォーカスはどこに移るか予測できません。 ご質問を見る限り,2問のような気もしますが, もし10問あった場合,いきなり 7 問目の解答欄に解答を書き始める場合もあり得ます。 したがって, 何番の解答欄にフォーカスがあろうとも,次の解答欄に移動できるようにしなければならないと思ったので,上のような少々複雑なスクリプトになりました。 また,ボタンには次のように1行加えてくださると, 最初のテキストフィールドにフォーカスが移動します。 ------------------------------------------- on (release) { // <何かのステートメントがここに来て> // // 最初の入力用テキストフィールドにフォーカスをセット Selection.setFocus(_root[myname+1]); } ------------------------------------------- ※注意点1 エンターキーは最初にも書きました通り,本来,「決定」か「改行」をするものです。 したがって, 解答欄のテキストフィールドが複数行に設定してあって, 複数行の解答を入力しなければならないときは, 上のスクリプトによって改行できなくなりますので使えません。 改行しようにも,次のテキストフィールドにフォーカスが移ってしまします。 エンターキーで次のテキストフィールドに移るのは, 質問者さまが勝手に決めたルールであるということは,この件を考えてみただけでわかると思います。 ※注意点2, 「制御」→「ムービープレビュー」で動作確認をする場合は, ムービープレビューの画面上にある 「制御」→「キーボードショートカットを無効」のチェックをはずして, プレビューでしてください。 そうでないと,エンターキーが動作しません。

8730531
質問者

補足

詳しい説明ありがとうございました。 >ご質問を見る限り,2問のような気もしますが, >もし10問あった場合,いきなり 7 問目の解答欄に解答を書き始める場合も>あり得ます。 確かに、問題数はとても多いです。 はじめに、名前を宣言させ、その名前を最後の認定書まで使用するため、 それぞれのかけ算のだんごとに10問、練習させるページには20問、確認テストで50問と100問以上の問題数をひとつのドキュメント上に作成しています。 自分的にはマウスで移動でもと思っていましたが、しようする立場からだと「ENTER」という発想があったので質問のような形になってしまいました。 >その入力用テキストフィールドがあるフレームに, フレームのスクリプトとして次のように書いて(コピペして)ください。 >// インスタンス名の頭の文字列を登録(※可変) > var myname = "kotae"; > // 通し番号の最終番号を登録(※可変) > var mynum = 5; var myname = "myBox"; var mynum = 10; と変更してコピーしてみました。 最初に自分で入力したのですが、その他にもアクションを入れすぎていて、フリーズしてしまいました。回答者様のご意見どおりコピペさせていただきましたが、ボックス移動をしてくれそうにありません。方向を変えたほうがいいのかとも思いました。 >「Tab」キーを押すと, >タブインデックスの数字の順にフォーカスが移動するようにはできています そこでもうひとつ教えていただきましたことについて自分なりに調べてみたところ、とても便利な機能だと思いました。この「アクセシビリティ」の機能での「Tab」キーについて「FLAHS8」のヘルプ機能で検索して使ってみました。100以上の設定が出来るのだろうかと不安ではありますが。「ENTER」きーでも同じことなのですが、思わぬところで「Tab」キーを押してしまって次に移動してしまうことはないのだろうかと思いました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Flash 判別式について

    初心者です。判別式がうまくいきません(Flash CS5)。 box1,box2,hanbestuはダイナミックテキストで変数、ans1はテキスト入力でします(インタラクティブに入力)。 下記のプログラムでやった場合、正解の時にgoodが判別されず、常にfalseになってしまいますが、どこが間違っているのかご教示いただきたくお願いいたします。 on (release) { box1 = Math.floor(Math.random()*10+1); box2 = Math.floor(Math.random()*10+1); } on (release) { var box1:Number; var box2:Number; var ans1:Number; kaitou=box1+box2; if(ans1==kaitou){ hanbetsu="good"; }else{ hanbetsu="false"; } }

  • JavaScriptを使ってロト6の当選数字を予想するプログラムを考えたのですが・・・

    Math.floor(Math.rondom()*10);を使うと、小数点以下の数字を出さない。 と先生に教えられたのですが、 ((Math.floor(Math.random() * 10)) + (Math.floor(Math.random() * 10))) * (Math.floor(Math.random() * 10)) + 1; を変数に入れて、テキストボックスに出力してみると、なんと小数点が出てしまいます! しかも、27.5や59.5などと、ちょうど0.5が出てしまいます。 この0.5を出さないように、ランダムで数字を出したいのですが、Math.floor以外で使えるものがあったら教えてください。 よろしくお願いします。

  • クリックしたインスタンスを削除する方法

    windows版FlashCS6で、ActionScript3を使用しております。 どうぞ、よろしくお願いいたします。 最初に、前提をご説明します。 埋め込みアセットクラスBoxをライブラリに準備します。 Boxの中には、50px × 50pxのビットマップが、基準点を中央で配置してあります。 埋め込みアセットクラスWallをライブラリに準備します。 Wallの中には、550px×400pxのビットマップが、基準点を中央で配置してあります。 ステージサイズは550px×400pxです。 タイムラインに、下記のActionScript3を書きます。 var myWall:Wall = new Wall(); myWall.x = 275; myWall.y = 200; addChild(myWall); var myBox:Array = new Array(10); for(var i:int=0 ; i<10 ; i++){ myBox[i] = new Box(); myBox[i].x = Math.random() * 550; myBox[i].y = Math.random() * 400; addChild(myBox[i]); } パブリッシュすると、ステージ上にはmyWallのインスタンスが1個と、myBoxのインスタンスが10個配置されます。 myBoxのインスタンスいずれかをクリックすると、クリックされたmyBoxが削除される(クリックされたmyBoxをremoveChild()し、それの参照を保存していた変数にnullを代入する)ようにするには、どのようにスクリプトを組めば良いでしょうか? 背景のmyWallは、クリックされても削除されないようにしたいです。 ご教示のほど、どうぞ、よろしくお願いいたします。

    • ベストアンサー
    • Flash
  • 経過時間を計るには

    簡単なクイズゲームを作っています。回答するまでにかかった時間を計って表示させたいのですがどうしたらいいでしょうか? クイズはランダムにフレームを移動して出題していて、回答したら(ボタンを押したら)またランダムにフレーム移動します。 5回回答したら結果画面のフレームに移動します。そこで回答するまでにかかった平均時間を表示させたいです。 環境はWindowsXP Flash8です。

  • (VB)ピクチャボックスに表示したアイコンをランダムに移動する

    ピクチャボックスに適当なアイコンを表示し、ボタンを押すと画面上でランダムに移動する。 というものです。画像を表示するところまでは出来たのですが、画面上でランダムに移動させる事が解りません。 解る方いらっしゃいましたら教えてください。お願いします。

  • ランダムでシーンの移動ができない。

    ランダムでシーンの移動をやりたくて、 http://okwave.jp/kotaeru.php3?q=1691219 を参考にスクリプトを組んだのですが、うまくいきません。 書いたスクリプトは、 rand = Math.floor(Math.random()*6); if (rand == 0) { gotoAndPlay("シーン 7", 1); } else if (rand == 1) { gotoAndPlay("シーン 5", 1); } else if (rand == 2) { gotoAndPlay("シーン 6", 1); } else if (rand == 3) { gotoAndPlay("シーン 4", 1); } else if (rand == 4) { gotoAndPlay("シーン 3", 1); } else if (rand == 5) { gotoAndPlay("シーン 2", 1); } です。 (シーン1の一番最初に書きました。swfが読まれたらすぐにランダムが始まる予定です。。。) 現状、ランダムを全く無視して、作ったシーンの順番でシーンの再生が進んでしまいます。 スクリプトに問題があるのでしょうか。。。? よろしくお願いします。

    • ベストアンサー
    • Flash
  • Flashの外部テキストのフォントを変えるには

    Flashで外部テキストを読み込むものを作っているんですが、始めたばかりで初心者です。 onClipEvent (load) { Rnd = Math.floor(Math.random()*1000); this.loadVariables("http://www.aaaaaaa/test.txt?"+Rnd ); this.onData = function() { msgArea.text = test1; }; } これでFlash自体は動くようになったのですが、文字が小さかったため大きくしたいです。 フォントサイズを変えようと思い、 this._fmt.size = 24; を5行目に追加してみたのですが、反応がありません。 シンボルの状態のためか、プロパティを見てもフォントの項目が見当たらないです。どうしたら変えれるのでしょうか?

  • ランダムな動きのスピード制御(Flash)

    スクリーンに小花をいくつか配置し、それがスクリーン上をゆらゆらと動くムービーを作りたいと思っています。 ランダムな動きの方が面白いので、本を見ながら下記の様なアクションスクリプトを小花の形のMCに書きました。 しかし、移動速度がものすごく速く、チラチラするだけで全然キレイじゃありません(ToT) どう言うスクリプトを書き加えれば、スピード制御できるでしょうか? onClipEvent(enterFrame){ this._x+=Math.floor(Math.random()*101-50); this._y+=Math.floor(Math.random()*101-50); }

  • テキスト内の正誤判定

    [I]+[II]=[SUM] [合否] テキストボックス[I]、[II]、[SUM]、[合否]の4つを配置して、スペースキーを押した際、[I]+[II]の合計が[SUM]と等しい場合には[合否]の中に○を、等しくない場合は×を表示させたいのです。[I]+[II]は、1桁の値をランダムで作り出し、[SUM]の中に数字を打ち込める用にしています。 今までに出来たスクリプトは以下の通りになってます。 なお、[I]=suuzi1,[II]=suuzi2,[SUM]=hyoujiとし,また、KEYCODE =["", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", " ", ""];は長いので略しております。 onClipEvent (keyDown) { if (Key.isDown(Key.SPACE)) { _root.suuzi1 = Math.floor(Math.random()*10); _root.suuzi2 = Math.floor(Math.random()*10); _root.hyouji = ""; } } onClipEvent (load) { // キーが押されたとき KEYCODE = new Array(); KEYCODE = ["", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", " ", ""]; } onClipEvent (keyDown) { // キーが押されたとき _root.CODE = Key.getCode(); _root.hyouji = _root.hyouji+KEYCODE[_root.CODE]; }

  • 二択のフレーム移動

    ボタンクリックで3216フレームか3062フレームの どちらかにランダムで移動させたいんですが、 アクションスクリプトをどう記述していいのか分かりません。 on (press){gotoAndPlay( この形の記述で出来るのでしょうか? それとも別の形なのでしょうか? 教えてください。 過去記事ではランダムに1から5の間のどれかに飛ばせる というものがおおく、特定の2フレームというのは なさそうでした…探しても見つけられませんでしたので、 どうぞお助け下さい。 当方バージョンは Flash8 プロフェッショナルです。

    • ベストアンサー
    • Flash