文字入力の制限をするには?

解決


なんば  2003-09-10 00:33:28  No: 108600

初心者なので質問が簡単な事かもしれませんが調べるのが下手なので、教えて下さい(><)
textboxに"999999.99"(-が付く場合もある)といった形で入力されたものを、"999k999m99"の形に変換しています。
その入力の部分で、"-"と"."と数値のみ入力できるように制限したいのですが、どうやったらよいか教えて下さい!
お願いします〜


nanashi  2003-09-10 01:44:46  No: 108601

APIのSetWindowLongとGetWindowLongを使えば出来ます。
下記のサイトを参照して下さい。

http://www.vbvbvb.com/jp/gtips/0701/gSetWindowLongEsNumber.html

この状態で"-"と"."を許可するにはKeyPressイベントで入力チェックして
SelTextで渡してやれば出来ます。

ただし先頭以外に"-"が入力された時や、"."が複数入力された時、ペーストされた時
のことを考えるとChangeイベントで更にチェックする必要が出てくると思います。


デルビ(delta-bee)  URL  2003-09-10 16:56:48  No: 108602

TextBoxのKeyPressイベントで数値と.と-以外の文字の番号を0にすればOKです。ちなみに文字の番号を調べるには"Asc("調べたい文字一文字")"でしらべられます。実際のコードとしては

Private Sub Text1_KeyPress(KeyAscii As Integer)
    'MsgBox KeyAscii     '押されたキーの番号を表示(必要ないしねwww)
    If KeyAscii >= 48 And KeyAscii <= 57 Then       '数値
    ElseIf KeyAscii = 46 Or KeyAscii = 45 Then      '.や-
    ElseIf KeyAscii = 13 Then                       'Enter
    ElseIf KeyAscii = 8 Then                        'BackSpace
    Else
        KeyAscii = 0
    End If
End Sub

これで数値と.と-以外の入力は受け付けません。または拒否するキーがわかっている場合は、そちらを拒否の形をとるほうがスマートですね(量多くなるとは思いますが)


nanashi  2003-09-10 20:21:47  No: 108603

なるほど、確かにKeyPressで処理しても良いですね。
入力に関してのみ、色々なことを考えてみたんですがこんなのどうでしょう?
貼り付け禁止、マイナス符号は頭に一つのみ、小数点以下は2桁までしか入力できません。
桁数は最大10桁まで。

Option Explicit

'SendMessage
Private Declare Function SendMessage _
    Lib "user32.dll" Alias "SendMessageA" _
    (ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, lParam As Any) _
        As Long

'アンドゥ
Private Const WM_UNDO As Long = &H304&

Private bNotChange As Boolean

Private Sub Form_Load()
    
    With Text1
        .IMEMode = 3
        .MaxLength = 10
    End With
End Sub

Private Sub Text1_Change()
    Static bUndo As Boolean
    
    If bUndo Or bNotChange Then
        bNotChange = False
        Exit Sub
    End If
    
    bUndo = True
    
    '貼り付け禁止(アンドゥ)
    Call SendMessage(Text1.hWnd, WM_UNDO, 0, 0)
    
    bUndo = False
End Sub

Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
    
    'デリートも許可
    If KeyCode = vbKeyDelete Then
        bNotChange = True
    End If
End Sub

Private Sub Text1_KeyPress(KeyAscii As Integer)
    Dim sText$, sBuff As String
    Dim lPos As Long
    Const sFilter As String = "-.0123456789"
    
    sBuff = Chr$(KeyAscii)
    
    bNotChange = True
    
    If InStr(sFilter, sBuff) > 0 Then
        With Text1
            sText = .Text
            
            If sBuff = "-" Then
                'マイナス符号
                
                If Not (.SelStart = 0 And Left$(sText, 1) <> sBuff) Then
                    '頭に一つのみ許可
                    KeyAscii = 0
                End If
                
            ElseIf sBuff = "." Then
                '小数点
                
                lPos = .SelStart
                If lPos > 0 Then
                    '小数点以下は2桁まで
                    If lPos < Len(sText) - 2 Then
                        KeyAscii = 0
                    ElseIf Len(sText) - Len(Replace$(sText, sBuff, vbNullString)) > 0 Then
                        KeyAscii = 0
                    End If
                Else
                    '頭には小数点は付けない
                    KeyAscii = 0
                End If
                
            Else
                '数字
                
                sBuff = Replace$(sText, "-", vbNullString)
                sBuff = Replace$(sText, ".", vbNullString)
                
                If Len(sBuff) >= 8 Then
                    '数字は8桁まで(マイナス符号と小数点を含めると最大10桁)
                    KeyAscii = 0
                Else
                    lPos = InStr(sText, ".")
                    If lPos > 0 Then
                        '小数点がある場合
                        If .SelStart >= lPos And Len(sText) > lPos + 1 Then
                            '小数点以下は2桁まで
                            KeyAscii = 0
                        End If
                    End If
                End If
            End If
        End With
        
    ElseIf KeyAscii = vbKeyBack Then
        'バックスペースは許可
        
    Else
        '他のものは不許可
        bNotChange = False
        KeyAscii = 0
        
    End If
End Sub


なんば  2003-09-10 22:23:26  No: 108604

すみません(><)
肝心な仕様部分についてあまり詳しく書いてなかったので追加なんですが…
画面の頭にドライブやディレクトリを選択する部分があります。
そこで選択されたディレクトリからファイルの一覧を取り寄せます。
そのファイル一覧から選択されたファイルの情報が色々表示され、内容に変更を加えて再度保存し直すような感じです。
そのファイルの中身の一つが、距離ということで質問しました。
なので、このTextboxには
1.データ(ファイルの中身)の形式は(-)999999.99
2.textboxに取り込む時は(-)999k99m99の形式に変換されている
2.そのまま使う場合と、変更を加える場合がある
現在、初期表示(-)999k999m99→GotFocusの時(-)999999.99に変換→ユーザーが値を変更したり、そのまま次の項目へ移ったり→LostFocusの時に(-)999k999m99に再変換
とゆーような感じです…
なので、入力の時に制限できたらチェックが楽でいいなぁと思ったんですが…
ちょっと説明が上手くできないのでわかりにくくてすみません…
入力された値に対するフォーマットのチェックがまた色々とややこしくて苦労しています…
色々と教えていただき、ありがとうございます!
ちょっと色々試してみますね〜


デルビ(delta-bee)  URL  2003-09-11 03:50:12  No: 108605

TextBoxのGetFocusとLostFocusのイベント時にkやmをとったり張ったりする動作をする方法はどうでしょうか?これと先ほど説明されたnanashiさんの方法や難しければ俺の書いた方法などを同時にに使えばよろしいかと・・・

-GetFocus時-
Text1 = Replace(Text1,"k","")
Text1 = Replace(Text1,"m","")

-LostFocus時-
Dim Km As Long,M As Long,Cm As Long
999999.99からKmとmとcmとに分ける処理をする(ここは自分で考えてください。今回はkmに"999"がmに"999"がcmに"99"が入っていると仮定します)
Text1 = Km & "k" & M & "m" & cm

これで入力時には"k"と"m"を消し、観覧時には"k"と"m"がついた形になります


なんば  2003-09-11 19:47:26  No: 108606

すみません…また2説明不足だったようです…
本当に何度も色んな方法を教えていただき、ありがとうございます(><)
ユーザーの入力方法としては、小数点を付けた値で入力されます。
現在、自動で単位の付いた形式と小数点の付いた数値形式を切り替えるようにはしています。
例えば、小数点数値型で入力したものを単位付きに変換だと、
Kiro = Fix(text / 1000)
    meter = Fix(Abs(text) - Abs(Kiro) * 1000)
    centi = Abs(text) * 100 - Abs(Kiro) * 100000 - meter * 100
    
    If Kiro = 0 And text < 0# Then
        Buf = "    -0k"
    Else
        Buf = Format$(Format$(Kiro, "##0"), "@@@") & "k"
    End If
    Buf = Buf & Format$(Format$(meter, "000"), "@@@") & "m" & Format$(centi, "00")
といった感じで…
色々やってみて何とか先が見えてきました!
あと少し。。。


なんば  2003-09-12 20:46:59  No: 108607

できましたぁー!!!!!
色々あれやこれやと教えてもらったものを色々組み合わせたりして…
質問の仕方が分かりづらく色々とご迷惑をおかけしましたが、
丁寧に教えてくださったお二方本当にありがとうございました!


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

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






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