• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:A~Z以外のキーからの入力を制限したい)

A~Z以外のキーからの入力制限と日本語入力オフの方法

このQ&Aのポイント
  • A~Z以外のキーからの入力を制限する方法と、日本語入力を常にオフにする方法について教えてください。
  • Flash8のActionScript2.0を使用して、A~Z以外のキーからの入力制限を行いたいです。また、日本語入力を常にオフにする方法も教えてください。
  • onClipEvent (keyDown)を使用して、A~Zキーの入力を取得していますが、A~Z以外のキーの入力を制限したいです。また、CapsLockキーや半角/全角キーによる誤動作も防止したいです。日本語入力を常にオフにする方法も教えてください。

質問者が選んだベストアンサー

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

状況がよくわかりませんが...前置きとして。 例えば テキスト入力 の テキストフィールド に A~Z の文字しか入力させないようにするのでしたら簡単なことで 仮にテキストフィールドに「my_txt」というインスタンス名を付けた場合 その 「my_txt」 が存在するフレームに my_txt.restrict = "A-Z"; と書けば良いだけですが, こういう状況であるとか, もしくはこの方法を何らかの形で使えるような状況ではないということですね? === === === あとよくわからない状況としては, > 動作が遅くなるのではないかと思ったのですが、 > onClipEvent(enterFrame)に記述してみました。 と書かれていらっしゃいますが,この結果を書かれていません。 onClipEvent(enterFrame)に記述をした結果 日本語入力オフ の件だけはクリアできたのではないでしょうか? 日本語入力オフ の件もクリアできなかったのでしょうか? 動作が遅くなるなどの副作用を除けば,基本的にその方法で問題点はクリアされると思いますが。。。 それと ActionScript2.0,Flash8 でしたら 普通, onClipEvent(keyDown) などは使いません。 Flash 5 (ActionScript 1.0 の初期) くらいのみで使われていたものです。 そもそも 「キーの監視に何の関係もないムービークリップを作成する」 というのが変(不自然)ですよね。 Flash 5 のときはムービークリップ以外にインスタンスらしいインスタンスが存在しなかったため, 何でもかんでもムービークリップにさせていたという変なものです。 なぜこのようなことを書くのかというと onClipEvent(enterFrame) には, それを書いたムービークリップがステージ上から消えるまで解除できないという欠点があるからです。 私としては, まず onClipEvent(enterFrame) を消したいのですが それだけだと統一感がなくなるため, 同時に onClipEvent(keyDown) も消したいわけです。 onClipEvent(enterFrame) を解除することができれば, 動作が遅くなるなど無駄なCPUの使用は防げますよね。 というわけで 次のスクリプトが考えてみた解決策案です。 例えば_rootのフレーム1などのフレームに書くスクリプト例です。 新規ドキュメントを作成した場合は フレーム1にコピペして即パブリッシュやムービープレビューするだけですぐ動作検証できます。 //====================================== //---検証用テキストフィールドの作成------ var my_txt:TextField = createTextField("txt", 0, 10, 10, 20, 20); my_txt.border = true; my_txt.background = true; my_txt.selectable = false; //---↑質問本題とは直接関係なし↑----- //キー監視用にするインスタンス「key_obj」を作成 var key_obj:Object = new Object(); //キーを押したときに実行する動作を定義 key_obj.onKeyDown = function():Void { //キーコードを取得 var key_cd:Number = Key.getCode(); // //キーコードが65以上90以下である場合 if (key_cd>=65 && key_cd<=90) { //そのキーの文字を検証用テキストフィールドに表示 my_txt.text = String.fromCharCode(key_cd); } else { //それ以外は検証用テキストフィールドを空にする my_txt.text = ""; } // //毎フレーム実行する動作を定義 _root.onEnterFrame = function():Void { //もしシステム IME が有効であれば if (System.IME.getEnabled()) { //システム IME を無効にする System.IME.setEnabled(false); } //毎フレーム実行する動作を削除 delete _root.onEnterFrame; }; }; //Keyクラスのリスナーとして「key_obj」を登録 Key.addListener(key_obj); //======================================  ◎仕様   スクリプト:ActionScript 2.0   プレーヤー:Flash Player 8 以上   (System.IME.* が Flash Player 8 以上でしか   使えないため。   これを除けば Flash Player 6 以上で動作する。) CapsLock状態になっても,半角/全角キーを押されても, テキストフィールドには「A」~「Z」しか表示されないと思います。 「○○.onEnterFrame = function(){}」 内で 即 「delete ○○.onEnterFrame」 をするのは このご質問の場合に限らずスクリプトの実行を 1フレーム時間 遅延させるときに良く使われる手法です。 使用例(参考まで)↓ 「MovieClip.attachMovieで配置したMovieClipのfunctionが実行されない」 http://www.fumiononaka.com/TechNotes/Flash/FN0307006.html  ~引用~ > 'function'の呼出しを1フレーム待たせるために、処理を > 'MovieClip.onEnterFrame'イベントハンドラメソッドに > 設定しています。  …中略… > 配置から1フレーム遅れた処理になります。 その他 「イベントハンドラメソッドはdeleteで消せ!」 http://f-site.org/articles/2004/05/22140833.html

oomiyaji
質問者

お礼

大変丁寧にご教授いただき、誠にありがとうございます。 こんなに丁寧に教えていただけると思っていなかったので、驚くと同時に、非常に感謝しております。 enterFrameの件、非常に勉強になりました。他のところにもいろいろと使用しているので、処理速度のアップをはかれるのではないかと期待しております。 ただ、タイピングソフトを作成しているのですが、キー入力を常時受け付ける部分については、(私の理解不足かもしれませんが)onClipEvent(enterFrame) onClipEvent(keyDown)を使用しても、それほど処理速度に変化は出ないんでしょうか? >日本語入力オフ の件だけはクリアできたのではないでしょうか? うまく動作しなかったのですが、ヒントをいただいたおかげで、原因がわかりました。 大変恥ずかしいのですが、パブリッシュの設定がActionScript1.0,Flash6になっていました。すみません。 ActionScript2.0,Flash8に変えてみました。 今のところは動作に問題ない気がするのですが、変えても、一般的に、ほかの部分に問題は起こらないものでしょうか?

その他の回答 (2)

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

#1(#2)です。 > 今までは「Hensuu」と「hennsuu」とを同一の変数として扱っていたのに、 > 変更後は別々の変数として扱っていることが原因の不具合でした。 そんなこともあり得ますね。 大文字小文字を区別するようになったのは Flash MX 2004 の Flash Player 7 からです。 それと同時に 何にも定義していない変数の初期値が変わりました。 Flash MX の Flash Player 6 までは,いきなり, a = a + 5; とかができたのですよ。 Flash MX (Flash Player 6 用 SWF パブリッシュ) までは, 変数 a は 何も宣言したり初期値を与えていないと, 自動的に 0 または ""(←空白文字列) になっていたのです。 ですからいきなり a = a + 5; と書けば a = 0 + 5; となって a = 5; となっていました。 しかし Flash MX 2004 (Flash Player 7 以降用 SWF パブリッシュ) からは 何も初期値を与えていない変数の値は undefined になりますから, a = a + 5; みたいなことをいきなりすると, a は NaN(非数) になります。 そんなところが下位バージョンが優先されていない大きな部分だと思います。 とは言いましてもですね..., 全体的に「いったい何年前の話?」だと思います。 今頃そんなことを言ってどうなるの? という感じですか。。。 Flash が現在の Flash たる由縁は, 「積極的に進化をし続けている」ソフトだからです。 どこかの進化しないソフトとはまるっきり違います。 そうしていても,HTML5 や Mac に砲撃されそうになっているのに...。 Flash の進化は日進月歩です。 Flash作成者としては日々動向を観察しておかなければすぐに浦島太郎状態になります。 (キツイ言い方をすれば,過去の無駄な知識が足を引っ張ることは十分あり得ます。つまり,無駄な過去などない方がましな場合も出てきます。続けるのでしたら日々精進&鍛錬&情報収集です。それができないのでしたら,毎回一からやり直す方が良いかもれません。)

oomiyaji
質問者

お礼

非常に丁寧にご指導いただきありがとうございます。 >a = a + 5;みたいなことをいきなりすると,a は NaN(非数) になります。 不具合のいくつかは、アドバイスいただきましたとおり、これが原因でした。 特に、1.計算に使用する変数、2.SharedObjectからgetした変数、3.グローバル変数 を重点的に、ひとつづつ、変数内にデータが入っているか、traceで確認していきたいと思います。 ActionScript以外のプログラムは多少やっていたのですが、FLASHでのプログラムは、実は、これが初めてです。 バージョンのことなどをあまり気にせずに作りはじめてしまい、結果的に古い方法で作ってしまったようで、非常に残念に思っています。 いろいろと本当にありがとうございました。

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

#1です。 > タイピングソフトを作成しているのですが、 > キー入力を常時受け付ける部分については、 > (私の理解不足かもしれませんが) > onClipEvent(enterFrame) onClipEvent(keyDown)を使用しても、 > それほど処理速度に変化は出ないんでしょうか? これに関しましては意味が2つに取れますので何とも言えません。。。 > onClipEvent(enterFrame) onClipEvent(keyDown)を使用しても、 > それほど処理速度に変化は出ない これは, onClipEvent(enterFrame) イベントハンドラの代わりに MovieClip.onEnterFrame イベントハンドラメソッドを使い, onClipEvent(keyDown) イベントハンドラの代わりに Key.onKeyDown イベントリスナー を使っても それほど処理速度に変化は出ない という意味でしょうか? それでしたらその通りです。 onClipEvent(enterFrame) も MovieClip.onEnterFrame も それ自体が PC にかける負担はそれほど変わりませんし onClipEvent(keyDown) も Key.onKeyDown も同じくです。 イベントハンドラメソッド や イベントリスナー の方が 使い勝手が良いとか,無駄なムービークリップを作成しなくて良いとか, 設定&解除が自由にできるとか,そういうことが違うだけです。 それとも, onClipEvent(keyDown) を使っても onClipEvent(enterFrame) イベントハンドラを使っても キー入力を常時受け付ける部分に大差はないという意味でしょうか? それでしたら違います。 キーイベントは通常 onClipEvent(keyDown) イベントハンドラや Key.onKeyDown イベントリスナー で受け取るべきですし, さらに updateAfterEvent() を使うと,onClipEvent(enterFrame) との差は歴然とします。 http://www.google.co.jp/search?sourceid=navclient&hl=ja&q=upDateAfterEvent > ActionScript2.0,Flash8に変えてみました。 > 今のところは動作に問題ない気がするのですが、 > 変えても、一般的に、ほかの部分に問題は起こらないものでしょうか? 変えずに不具合が起きているのでしたら 当然変えるべきでしょう。 変えても変えなくも動作が変わらない場合は, Flash Player のバージョンを低くパブリッシュするほど 閲覧できる環境の人は増えます。 でも今どき Flash Player 6 で頑張っている人もいないと思うので, どっちにしても変わりませんよ↓。 「Adobe - Flash Player Version Penetration」 http://www.adobe.com/products/player_census/flashplayer/version_penetration.html 「Macromedia - Flash Player 8 必要なシステム条件」 http://www.adobe.com/jp/products/flashplayer/productinfo/systemreqs/flashplayer8/

oomiyaji
質問者

お礼

ありがとうございます。 とても丁寧に教えてくださり、非常に感謝しております。 よくわかりました。 アドバイスいただきましたように、Flash8、ActionScript2.0でパブリッシュすることにしました。 ただ、変更後、動作をよく確認してみたら、いくつか不具合が出ていることに気付きました。 たとえば、ひとつは、今までは「Hensuu」と「hennsuu」とを同一の変数として扱っていたのに、変更後は別々の変数として扱っていることが原因の不具合でした。 まだ「定められた出題を終えても結果画面に進まない」などの問題が残っているのですが、「Flash8、ActionScript2.0」「Flash6、ActionScript1.0」の両者には結構差異があるのでしょうか?

関連するQ&A