どうも、たびたびお世話になっております。
TextBoxのプロパティでMaxLengthというのがあって、
入力文字数を制限するときに使いますが、
全角・半角の区別まではできません。
例えば、全角で20文字入力できるところは、
半角だと倍の40文字入力できるというふうにしたいのですが、
何か方法がありますでしょうか。
お願いします。
WindowsXP:VB.NET 2003
過去ログ検索するなら『半角』とか?
MaxLength プロパティのみで実現することは出来ませんので
自分でエラーチェックする関数を作って下さい。
過去ログ検索したところ、
vbFromUnicode というのが出てきたのですが、
これって VB.NET では使えないんじゃないでしょうか?
使おうとしたらエラーが出てしまったので・・・
代わりになるようなものはないでしょうか。
>vbFromUnicode というのが出てきたのですが、
>これって VB.NET では使えないんじゃないでしょうか?
それはMSDNライブラリを検索すればわかるのでは?
.NetでStrConvがあるかどうかは知りませんが
類似するものはあるのでは?
あくまでも
vbFromUnicode
はVB6.0上で定義されている定数なだけですから
といいつつ調べてしまうのが性ってもんですね・・・
http://santamartadotnet.hp.infoseek.co.jp/documents/dotnettips/tips016.html
この辺で幸せになれます?
932という謎(シフトJISの与えられた定数)のところは
Encoding.GetEncoding("shift_jis")
でいけるっぽいがテストはしていません・・あしからず・・・
ちなみにこの情報の検索>発見に至る時間は1分程度でした・・・
ああ、ごめんなさい。過去に自分でリンク貼ったので
『半角』で過去ログ検索してそのリンクが引っ掛かってる
の見て大丈夫と判断したんですが、[VB6.0]時代のコード
が9割で見つけ難かったかもしれませんね。
[VB.NET]の StrConv 関数には VbStrConv 列挙型メンバ
を指定します。vbFromUnicode は含まれていません。
葉月さんの Encoding クラスを使ったのでも実現できます。
ボクが過去張ったサンプルのリンクは
[VB.NET]全角と半角を区別する
http://www.sugi-family.net/papanvb/vbnet_tips.asp?cate=10&tips=10001
です。
MaxLengthプロパティと同じように、
指定したバイト数を超えて入力しようとしても
できないようにしたいのですが、
Private Sub txtName_Validating(ByVal sender As Object, ByVal e As System.EventArgs) Handles txtName.Validating
'未入力の場合は正常終了
If Trim(Me.txtName.Text) = Nothing Or Trim(Me.txtName.Text) = "" Then
Exit Sub
End If
Dim objEncoding As Encoding = System.Text.Encoding.GetEncoding("Shift_JIS")
Dim intByteCount As Integer = objEncoding.GetByteCount(Me.txtName.Text)
'制限バイト数との比較
If intByteCount > 20 Then
'ここの部分の書き方が分かりません
' Me.txtName.Text.Substring(0,20)
'これだとバイト数ではなく文字数になってしまいますし・・・
End If
End Sub
ああ、ユーザに修正させませんか…。そーゆー処理は自分勝手
だからユーザに直させるようにしなさい…と過去言われた記憶
がありますが、まぁ、処理によっては別にいいと思うので…。
ちょっとオタオタしてて恥ずかしい過去ログですが、
過去ログ検索『半角』か『Encoding』あたりで引っ掛かります。
http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200404/04040020.txt
文字区切りがちょっと問題。
…というか、結局文字の区切りにボクの紹介したリンク先の
判定法を使うなら、それを改造して、Encoding クラスは
使わない方がすっきりしますが…。
無理やりこんな方法でも何とかなります。はてさて(^^;)どうしましょう。
Private Sub Test()
Dim strString As String = "1123漢r字456a7890"
Dim BytesWK() As Byte
Dim sjisEnc As System.text.Encoding
Dim str As String
Dim n As Integer
n = 2 ' 切り取りたいバイト数
sjisEnc = sjisEnc.GetEncoding("Shift_JIS")
BytesWK = sjisEnc.GetBytes(strString)
ReDim Preserve BytesWK(n - 1)
str = sjisEnc.GetString(BytesWK)
str = str & "Dummy" ' 最後に"が付いてないとこの処理がうまくいかないです。
' 強制
Me.TextBox1.Text = str
str = Me.TextBox1.Text & "Dummy"
Debug.WriteLine(str)
'/// ここから質問の回答
Dim objEncoding As System.Text.Encoding = System.Text.Encoding.GetEncoding("Shift_JIS")
Dim intByteCount As Integer = objEncoding.GetByteCount(strString)
'Dim BytesWK() As Byte
'制限バイト数との比較
If intByteCount > 20 Then
'ここの部分の書き方が分かりません
BytesWK = objEncoding.GetBytes(strString)
ReDim Preserve BytesWK(20 - 1)
Me.TextBox1.Text = sjisEnc.GetString(BytesWK)
End If
End Sub
ああ、言うまでも無いですが、できるなら文字の区切りを
意識した方がいいと思います。上の回答はコードの単純さを
優先したボクにとっては邪道な回答です。
よくよく読んでみると
入力時にバイト数制限したいんですね?
ってことはValidatingイベントだと無理なのじゃないかな?
チェンジイベントなり、キー入力イベントなりで回避しないと・・・
Validatingだとコントロールからフォーカスが外れる直前だと思うし
ツイート | ![]() |