C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[7]: テキストボックス入力制限について


(過去ログ 53 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■29232 / inTopicNo.1)  テキストボックス入力制限について
  
□投稿者/ yasu (1回)-(2008/12/05(Fri) 18:22:49)

分類:[VB.NET/VB2005 以降] 

2008/12/05(Fri) 18:33:45 編集(投稿者)
2008/12/05(Fri) 18:30:07 編集(投稿者)
2008/12/05(Fri) 18:30:05 編集(投稿者)

開発環境 : WindowsCe (WindowsXPにてPocketPCを使用)
言語 : VB.NET

現状、テキストボックスの入力制限(Byte数制限)を行う為、
添付の関数をKeyPress時に呼び出しています。

ただし、下記のような操作を行った際、3)にてKeyPressイベントが発生。
その時点ですでに、TextBox.SelectedTextにてExceptionが発生してしまいうまく動作しません。
          ※指定された引数は、有効な範囲にありません。

回避方法等ございましたら、ご教授ください。

【操作内容】
1)全角文字を入力 あああ    ※この際確定はしない
2)Spaceキーを押下 あああ    ※変換対象変更可能な状態
3)Enterを押下せず文字キーを押下 あああ1 ※この時点で'あああ'が確定?

【入力制限関数】  ※テキストボックスのMaxLength以上の場合入力されたテキストを削除


'文字列有効Byte数
Dim dintByteCount As Integer = aItxtTarget.MaxLength

'文字列初期値
Dim dstrText As String = aItxtTarget.Text

'入力文字列レングス
Dim dintInputStrLen As Integer = aItxtTarget.SelectionLength - 1

'文字挿入位置
Dim dintDefSelectionStart As Integer = aItxtTarget.SelectionStart

'--------------------------------------------------------------------------------
'■BackSpaceは無視 ※引数変えたくなければ外だし
'--------------------------------------------------------------------------------
If (e.KeyChar = Chr(Keys.Back)) Then
Return False
End If

'--------------------------------------------------------------------------------
'■処理対象のTextがMaxLength以上の間繰り返し
'--------------------------------------------------------------------------------
While (mencFileEncoding.GetByteCount(dstrText) > dintByteCount)

'--------------------------------------------------------------------------------
'■入力最後尾より一文字削除
'--------------------------------------------------------------------------------
dstrText = dstrText.Remove(dintDefSelectionStart + (dintInputStrLen), 1)
dintInputStrLen -= 1
End While

'--------------------------------------------------------------------------------
'■文字列 / 文字列挿入位置を再設定
'--------------------------------------------------------------------------------
aItxtTarget.Text = dstrText

Return True


引用返信 編集キー/
■29237 / inTopicNo.2)  Re[1]: テキストボックス入力制限について
□投稿者/ Jitta on the way (239回)-(2008/12/05(Fri) 19:24:18)
2008/12/05(Fri) 19:25:26 編集(投稿者)

No29232 (yasu さん) に返信

KeyPress に、いつ入って来ますか?
例外が発生するときの、関係する変数の値は、どうなっていますか?


# ペーストされたら KeyPress は発生しませんよね?
引用返信 編集キー/
■29238 / inTopicNo.3)  Re[2]: テキストボックス入力制限について
□投稿者/ .SHO (309回)-(2008/12/05(Fri) 20:00:09)
操作内容 3) の状態では、文字が何も選択されていないからではないですか?
引用返信 編集キー/
■29281 / inTopicNo.4)  Re[3]: テキストボックス入力制限について
□投稿者/ yasu (3回)-(2008/12/07(Sun) 02:46:10)
Jitta on the wayさん

返答が遅くなり申し訳ありません。

KeyPressに入ってくるタイミング・関係するプロパティは下記のようになっていました。
ペーストに関しては、今のところChangedイベントにて対応する予定です。  

【KeyPress発生タイミング】
   1)Key Aを押下
      ・表示        'あ’
      ・KeyPress     未発生

   2)Key Aを押下
      ・表示        'ああ’
      ・KeyPress     未発生

   3)Key Aを押下
      ・表示        'あああ’
      ・KeyPress     未発生

   4)Key Spaceを押下
      ・表示        'あああ'  ※'あああ' 選択状態(背景色青)
      ・KeyPress     未発生
     
   5)Key 1を押下
      ・表示        'あああ1'
      ・KeyPress     発生

【その他プロパティ】 ※KeyPress初回時
   1).Text           'ああ'   ※せめて 'あああ'できてくれれば・・・
   2).SelectionStart     0
   3).SelectionLength    0
引用返信 編集キー/
■29282 / inTopicNo.5)  Re[4]: テキストボックス入力制限について
□投稿者/ yasu (4回)-(2008/12/07(Sun) 02:58:25)
.SHOさん

返答が遅くなり申し訳ありません。

>>操作内容 3) の状態では、文字が何も選択されていないからではないですか?
  →操作内容 3)にて、'1'を入力しています。
   その為、'1'入力前まで未確定だった'あああ'が確定されKeyPressが発生しているようです。

   VB & WIndows初心者の為、IME等の処理はよく分かりませんが、
   IME制御が入っている場合のみ質問内容のような事象が発生します。

     ※ちなみにIME制御を止めてみると、ボタン入力毎に必ずKeyPressが発生していました。
                ↑
                言葉が違うかもしれません (ImmAssociateContext)

引用返信 編集キー/
■29283 / inTopicNo.6)  Re[5]: テキストボックス入力制限について
□投稿者/ 出水 (102回)-(2008/12/07(Sun) 07:39:33)
IMEが起動していると、文字が確定した後KeyPressがまとめて発生するってのは仕様です
そういうものなので、文字入力中にどうこうしたい、ってのはできません

こういう場合はいったんTextBox.Textに入れておいて
その文字数を見て多ければ後ろをカットだと思ってたんですけど、それだと無理なんですかね?
引用返信 編集キー/
■29293 / inTopicNo.7)  Re[6]: テキストボックス入力制限について
□投稿者/ yasu (5回)-(2008/12/07(Sun) 17:27:16)
No29283 (出水 さん) に返信
> IMEが起動していると、文字が確定した後KeyPressがまとめて発生するってのは仕様です
> そういうものなので、文字入力中にどうこうしたい、ってのはできません
>
> こういう場合はいったんTextBox.Textに入れておいて
> その文字数を見て多ければ後ろをカットだと思ってたんですけど、それだと無理なんですかね?

単純に最後尾からでなく入力された文字列の最後尾からカット(カーソルを文字列中に設定しての入力時等)
していきたいのですが、やはり無理なんでしょうか・・・

ちなみに、KeyPress時点で関連するプロパティ値にExceptionが設定される理由ってご存知でしょうか?
いろいろ検索かけているんですが、同様のケースがみつかりません。
引用返信 編集キー/
■29327 / inTopicNo.8)  Re[7]: テキストボックス入力制限について
□投稿者/ .SHO (325回)-(2008/12/08(Mon) 12:33:15)
> 単純に最後尾からでなく入力された文字列の最後尾からカット(カーソルを文字列中に設定しての入力時等)
> していきたいのですが、やはり無理なんでしょうか・・・

KeyPress 発生前の文字列を保存しておき
KeyPress 発生時の状態との差分を取れば出来ると思います。

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -