- - PR -
Win98とWinXPで動作が異なる
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2004-01-15 14:20
はじめまして。いつも拝見させて頂いています。
当方、VB.NETを開発言語として、Win98とWinXP両方をサポート しなければならないアプリケーションを開発中です。 以下のようなコードを実行した場合、両OSで挙動が異なり、 困っています。 ======================= Code =========================== Private Sub Form1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles MyBase.KeyPress Dim CharTable as String CharTable = "アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲン" If InStr(CharTable, e.KeyChar) = 0 Then e.Handled = True End If End Sub ======================= Code =========================== WinXPではこちらの意図通り、半角カタカナの入力抑制が行えます。 Win98では、KeyPressイベント内でのKeyPressEventArgs.KeyCodeが 全く別の文字列に("ア"が"±"というように)変わってしまうよう です。 どなたか似たようなケースで対処なさった方、いらっしゃいましたら ご教授お願い致します。 | ||||||||||||
|
投稿日時: 2004-01-15 18:46
諸農です。
見た感じ、UNICODEとSJISの違いのように見えます。 0x00b1なら UNICODE ± SJIS 半角のア ですね。 このあたり確認されてみてはいかがですか? #ChrW関数は使えないのかしら。 追加。 ChrWはUNCODEでしたね。。。(^^ゞ _________________ 諸農和岳 Powered by Borland Delphi/C++Builder & Microsoft VS.NET [ メッセージ編集済み 編集者: Jubei 編集日時 2004-01-15 18:59 ] | ||||||||||||
|
投稿日時: 2004-01-15 20:02
その用途であれば、正規表現を使えばもっと楽になるような? #濁点や半濁点、拗音、撥音の指定が抜けていますよ http://support.microsoft.com/default.aspx?scid=kb;ja;301264 http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpqstart/html/cpsmpnetsamples-howtoregularexpressions.asp http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfsystemtextregularexpressionsregexclasstopic.asp 適当にリンクをたどったり、ローカルなMSDNで引きなおしてください | ||||||||||||
|
投稿日時: 2004-01-16 00:05
諸農です。
すみません、教えてください。
もしかして、単純なコード例でいえば、次のような判定が 出来ていなかったって事だったんですか? #いえ、ケチをつけているわけではありません。 #ホントにどんな内容で困っているのかわからないのです。
_________________ 諸農和岳 Powered by Turbo Delphi & Microsoft Visual Studio 2005 十兵衛@わんくま同盟 http://blogs.wankuma.com/jubei/ | ||||||||||||
|
投稿日時: 2004-01-16 06:42
あ、いえ、たぶんXPと98ということなので、OSが扱う文字コードがUNICODEかS-JISかの違いがまず1点あります。これは、KeyPressイベントということなので、「キーコード」で対応すればいいかな? で、どういう処理をしようとしているか、というところを考えると、おそらく「半角カタカナは使用禁止」みたいなことをしたいのだと思います。そうであるなら、「半角カタカナが入力された」ということを判断するのではなく、「英数記号が入力」されたことを判断する方が「文字コードが安定しているため」、安全ではないかと考えました。加えて、判別のための文字列の中に、せっかく「あ」から「ん」まで書き並べていますが、「゛」や「゜」がリストアップされていませんよ、と。これらも、「ひらがな入力」にすれば、すぐ入力できますからね。 | ||||||||||||
|
投稿日時: 2004-01-16 07:09
おはようございます。
KeyCharに格納されている文字コードではなく、 KeyDown、KeyUpイベントのKeyCodeで判定した方が よりベターな判定が出来ると言うことですね。
詳細な解説ありがとうございます。 すっかり疑問が氷解しました。 ありがとうございました。 #元投稿者の方、かなり、クリティカルな事態のようですけど、大丈夫かな。 _________________ 諸農和岳 Powered by Turbo Delphi & Microsoft Visual Studio 2005 十兵衛@わんくま同盟 http://blogs.wankuma.com/jubei/ | ||||||||||||
|
投稿日時: 2004-01-16 08:41
あ〜、でも、処理そのものが「無効」な場合があることも考慮するべきです。Key*イベントでは、「キーをクリックした」ことに反応できても、「ペースとされた」ことには反応できません。つまり、「メモ帳などで半角仮名を入力し、コピーし、ペーストする」と、処理をすり抜けることが可能です。
いじわるですねぇ。そんなこと、するヤツがいるんですかねぇ。でも、私が前にいた会社の「品質担当」は、「できるんだったら対策しなきゃ。ユーザは何やるかわからんよ」と、口癖のように言っておりました。 ではどうしましょう?Windowsアプリケーションだと思いますが、 ・TextBox.CausesValidation プロパティをTrueにする ・TextBox.Validating イベントをハンドルする ・TextBox.ImeMode プロパティをDisableにする ・TextBox.KeyDown イベントで、IME*のキーコードをキャンセルする これくらいの対策が必要でしょう。 | ||||||||||||
|
投稿日時: 2004-01-16 09:32
皆様ご返答ありがとうございます。レスポンスが遅くなりすみません。
また、私の質問の仕方が舌足らずで本当にごめんなさい。 まず、『半角カタカナの入力制御』という部分ですが、 サンプルコードの CharTable = "アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲン" の部分は、実際には考えられる英数や記号を実際には全て記述しています。 CharTable = "アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲン" CharTable = CharTable & "ァィゥェォャュョッー゙゚-" CharTable = CharTable & "0123456789" CharTable = CharTable & "ABCDEFGHIJKLMNOPQRSTUVWXYZ" CharTable = CharTable & "abcdefghijklmnopqrstuvwxyz^\!#$%&()=~|@[`{;:]+*},./<>?_ " これを、Instrで上記テーブルに該当するかを判定し、該当『しない』場合に イベントをキャンセルして、『入力そのものを受け付けなくする』ことで、 『半角しか入力できない』ようにしたかったのです。 ご指摘の通り、IMEモードなどの制御でも可能だと思いますが、この考え方を 拡張してCharTableの中身を色々変えることにより、『意図したキーしか入力させない』 ルーチンを作りたかったというのが本当のところです。 実際、VB6で同様な実装をしていたもので、VB.NETでも大丈夫だろうとテストしていた ところ、Win98では同様の動作をしないことが分かり質問させて頂いた次第です...。 Jittaさんの文字コードの違いではないかというご指摘ですので、その辺をもう少し 掘り下げて調べてみます。ありがとうございます。 また、ご報告します。 |