- PR -

Win98とWinXPで動作が異なる

投稿者投稿内容
くろすけ
会議室デビュー日: 2004/01/15
投稿数: 4
投稿日時: 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が
全く別の文字列に("ア"が"±"というように)変わってしまうよう
です。
どなたか似たようなケースで対処なさった方、いらっしゃいましたら
ご教授お願い致します。
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2004-01-15 18:46
諸農です。

引用:

くろすけさんの書き込み (2004-01-15 14:20) より:

全く別の文字列に("ア"が"±"というように)変わってしまうよう
です。



見た感じ、UNICODEとSJISの違いのように見えます。

0x00b1なら

UNICODE ±
SJIS 半角のア

ですね。
このあたり確認されてみてはいかがですか?
#ChrW関数は使えないのかしら。

追加。
ChrWはUNCODEでしたね。。。(^^ゞ

_________________
諸農和岳
Powered by Borland Delphi/C++Builder & Microsoft VS.NET

[ メッセージ編集済み 編集者: Jubei 編集日時 2004-01-15 18:59 ]
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-01-15 20:02
引用:

くろすけさんの書き込み (2004-01-15 14:20) より:

WinXPではこちらの意図通り、半角カタカナの入力抑制が行えます。


 その用途であれば、正規表現を使えばもっと楽になるような?
#濁点や半濁点、拗音、撥音の指定が抜けていますよ

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で引きなおしてください
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2004-01-16 00:05
諸農です。

すみません、教えてください。

引用:

Jittaさんの書き込み (2004-01-15 20:02) より:
引用:

くろすけさんの書き込み (2004-01-15 14:20) より:

WinXPではこちらの意図通り、半角カタカナの入力抑制が行えます。


 その用途であれば、正規表現を使えばもっと楽になるような?
#濁点や半濁点、拗音、撥音の指定が抜けていますよ



もしかして、単純なコード例でいえば、次のような判定が
出来ていなかったって事だったんですか?
#いえ、ケチをつけているわけではありません。
#ホントにどんな内容で困っているのかわからないのです。

コード:
private void Form1_KeyPress(object sender,
                            System.Windows.Forms.KeyPressEventArgs e)
{
    if ((e.KeyChar >= 'ヲ')&&(e.KeyChar <= '゚'))
    {
        label1.Text += e.KeyChar.ToString();
        e.Handled = true;
    }
}




_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-01-16 06:42
引用:

Jubeiさんの書き込み (2004-01-16 00:05) より:

もしかして、単純なコード例でいえば、次のような判定が
出来ていなかったって事だったんですか?
#いえ、ケチをつけているわけではありません。
#ホントにどんな内容で困っているのかわからないのです。


 あ、いえ、たぶんXPと98ということなので、OSが扱う文字コードがUNICODEかS-JISかの違いがまず1点あります。これは、KeyPressイベントということなので、「キーコード」で対応すればいいかな?

 で、どういう処理をしようとしているか、というところを考えると、おそらく「半角カタカナは使用禁止」みたいなことをしたいのだと思います。そうであるなら、「半角カタカナが入力された」ということを判断するのではなく、「英数記号が入力」されたことを判断する方が「文字コードが安定しているため」、安全ではないかと考えました。加えて、判別のための文字列の中に、せっかく「あ」から「ん」まで書き並べていますが、「゛」や「゜」がリストアップされていませんよ、と。これらも、「ひらがな入力」にすれば、すぐ入力できますからね。
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2004-01-16 07:09
おはようございます。

KeyCharに格納されている文字コードではなく、
KeyDown、KeyUpイベントのKeyCodeで判定した方が
よりベターな判定が出来ると言うことですね。


引用:

 で、どういう処理をしようとしているか、というところを考えると、



詳細な解説ありがとうございます。
すっかり疑問が氷解しました。

ありがとうございました。

#元投稿者の方、かなり、クリティカルな事態のようですけど、大丈夫かな。

_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-01-16 08:41
 あ〜、でも、処理そのものが「無効」な場合があることも考慮するべきです。Key*イベントでは、「キーをクリックした」ことに反応できても、「ペースとされた」ことには反応できません。つまり、「メモ帳などで半角仮名を入力し、コピーし、ペーストする」と、処理をすり抜けることが可能です。

 いじわるですねぇ。そんなこと、するヤツがいるんですかねぇ。でも、私が前にいた会社の「品質担当」は、「できるんだったら対策しなきゃ。ユーザは何やるかわからんよ」と、口癖のように言っておりました。

 ではどうしましょう?Windowsアプリケーションだと思いますが、
・TextBox.CausesValidation プロパティをTrueにする
・TextBox.Validating イベントをハンドルする
・TextBox.ImeMode プロパティをDisableにする
・TextBox.KeyDown イベントで、IME*のキーコードをキャンセルする
これくらいの対策が必要でしょう。
くろすけ
会議室デビュー日: 2004/01/15
投稿数: 4
投稿日時: 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さんの文字コードの違いではないかというご指摘ですので、その辺をもう少し
掘り下げて調べてみます。ありがとうございます。
また、ご報告します。

スキルアップ/キャリアアップ(JOB@IT)