TextBoxの文字数制限で全角・半角の区別をつけるには


@関西  2004-10-13 23:05:29  No: 116948

どうも、たびたびお世話になっております。

TextBoxのプロパティでMaxLengthというのがあって、
入力文字数を制限するときに使いますが、
全角・半角の区別まではできません。

例えば、全角で20文字入力できるところは、
半角だと倍の40文字入力できるというふうにしたいのですが、
何か方法がありますでしょうか。
お願いします。

WindowsXP:VB.NET 2003


特攻隊長まるるう  2004-10-14 01:13:41  No: 116949

過去ログ検索するなら『半角』とか?
MaxLength プロパティのみで実現することは出来ませんので
自分でエラーチェックする関数を作って下さい。


@関西  2004-10-14 02:20:29  No: 116950

過去ログ検索したところ、
vbFromUnicode というのが出てきたのですが、
これって VB.NET では使えないんじゃないでしょうか?
使おうとしたらエラーが出てしまったので・・・

代わりになるようなものはないでしょうか。


葉月  2004-10-14 02:36:01  No: 116951

>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分程度でした・・・


特攻隊長まるるう  2004-10-14 02:59:30  No: 116952

ああ、ごめんなさい。過去に自分でリンク貼ったので
『半角』で過去ログ検索してそのリンクが引っ掛かってる
の見て大丈夫と判断したんですが、[VB6.0]時代のコード
が9割で見つけ難かったかもしれませんね。
[VB.NET]の StrConv 関数には VbStrConv 列挙型メンバ
を指定します。vbFromUnicode は含まれていません。

葉月さんの Encoding クラスを使ったのでも実現できます。

ボクが過去張ったサンプルのリンクは
[VB.NET]全角と半角を区別する
http://www.sugi-family.net/papanvb/vbnet_tips.asp?cate=10&tips=10001
です。


@関西  2004-10-16 01:29:33  No: 116953

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


特攻隊長まるるう  2004-10-16 02:46:30  No: 116954

ああ、ユーザに修正させませんか…。そーゆー処理は自分勝手
だからユーザに直させるようにしなさい…と過去言われた記憶
がありますが、まぁ、処理によっては別にいいと思うので…。

ちょっとオタオタしてて恥ずかしい過去ログですが、
過去ログ検索『半角』か『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


特攻隊長まるるう  2004-10-16 02:52:19  No: 116955

ああ、言うまでも無いですが、できるなら文字の区切りを
意識した方がいいと思います。上の回答はコードの単純さを
優先したボクにとっては邪道な回答です。


葉月  2004-10-21 23:40:54  No: 116956

よくよく読んでみると
入力時にバイト数制限したいんですね?

ってことはValidatingイベントだと無理なのじゃないかな?
チェンジイベントなり、キー入力イベントなりで回避しないと・・・
Validatingだとコントロールからフォーカスが外れる直前だと思うし


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加