• 締切済み

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

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

専門家に質問してみよう