怎樣保證Text1.text輸入必須是數字呢?
如是字符,提示......

解决方案 »

  1.   

    Private Sub Text1_KeyPress(KeyAscii As Integer)
    If KeyAscii < &H30 Or KeyAscii > &H39 Then
    MsgBox "不是数字"
    KeyAscii = 0
    End IfEnd Sub
      

  2.   

    If KeyAscii = 13 Then'回车
    KeyAscii = 0
    SendKeys "{Tab}"
    End If
    If KeyAscii = 46 Then Exit Sub'小数点
    If KeyAscii = 8 Then Exit Sub '退格
    If KeyAscii < 48 Or KeyAscii > 57 Then
        KeyAscii = 0
    End If
      

  3.   

    退格的ascii是8,小数点是&H2E即十进制46,想要什么自己加到判断里。楼主只说数字,没有说退格和小数点。
      

  4.   


    '气泡提示类CTips,记得是坛子里谁的代码来着。Option ExplicitPrivate Declare Function CreateWindowEx Lib "user32.dll" Alias "CreateWindowExA" (ByVal dwExStyle As Long, ByVal lpClassName As String, ByVal lpWindowName As String, ByVal dwStyle As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hWndParent As Long, ByVal hMenu As Long, ByVal hInstance As Long, ByRef lpParam As Any) As Long
    Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByRef lParam As Any) As Long
    Private Declare Function SendMessageLong Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Private Declare Function DestroyWindow Lib "user32" (ByVal hwnd As Long) As Long
    Private Declare Function ClientToScreen Lib "user32" (ByVal hwnd As Long, lpPoint As POINTAPI) As LongPrivate Const WM_USER = &H400
    Private Const CW_USEDEFAULT = &H80000000Private Type RECT
        left As Long
        top As Long
        right As Long
        bottom As Long
    End TypePrivate Type POINTAPI
        X As Long
        Y As Long
    End TypePrivate Const TTS_NOPREFIX = &H2
    Private Const TTF_TRANSPARENT = &H100
    Private Const TTF_CENTERTIP = &H2
    Private Const TTM_ADDTOOLA = (WM_USER + 4)
    Private Const TTM_ACTIVATE = WM_USER + 1
    Private Const TTM_UPDATETIPTEXTA = (WM_USER + 12)
    Private Const TTM_SETMAXTIPWIDTH = (WM_USER + 24)
    Private Const TTM_SETTIPBKCOLOR = (WM_USER + 19)
    Private Const TTM_SETTIPTEXTCOLOR = (WM_USER + 20)
    Private Const TTM_SETTITLE = (WM_USER + 32)
    Private Const TTS_BALLOON = &H40
    Private Const TTS_ALWAYSTIP = &H1
    Private Const TTF_SUBCLASS = &H10
    Private Const TTF_TRACK = &H20
    Private Const TTF_IDISHWND = &H1
    Private Const TTM_SETDELAYTIME = (WM_USER + 3)
    Private Const TTDT_AUTOPOP = 2
    Private Const TTDT_INITIAL = 3
    Private Const TTM_TRACKACTIVATE = WM_USER + 17
    Private Const TTM_TRACKPOSITION = WM_USER + 18
    Private Const WS_POPUP = &H80000000Private Const TOOLTIPS_CLASSA = "tooltips_class32"Private Type TOOLINFO
        lSize As Long
        lFlags As Long
        hwnd As Long
        lId As Long
        lpRect As RECT
        hInstance As Long
        lpStr As String
        lParam As Long
    End TypePublic Enum ttIconType
        TTNoIcon = 0
        TTIconInfo = 1
        TTIconWarning = 2
        TTIconError = 3
    End EnumPublic Enum ttStyleEnum
        TTStandard
        TTBalloon
    End EnumPrivate mvarBackColor As Long
    Private mvarTitle As String
    Private mvarForeColor As Long
    Private mvarIcon As ttIconType
    Private mvarCentered As Boolean
    Private mvarStyle As ttStyleEnum
    Private mvarTipText As String
    Private mvarVisibleTime As Long
    Private mvarDelayTime As Long
    Private mvarPopupOnDemand As BooleanPrivate m_lTTHwnd As Long
    Private m_lParentHwnd As Long
    Private ti As TOOLINFOPrivate Sub Class_Initialize()
        mvarDelayTime = 500
        mvarVisibleTime = 5000
        mvarPopupOnDemand = False
    End Sub
    Private Sub Class_Terminate()
        Destroy
    End Sub
    Public Property Get VisibleTime() As Long
        VisibleTime = mvarVisibleTime
    End Property
    Public Property Let VisibleTime(ByVal lData As Long)
        mvarVisibleTime = lData
    End Property
    Public Property Get DelayTime() As Long
        DelayTime = mvarDelayTime
    End Property
    Public Property Let DelayTime(ByVal lData As Long)
        mvarDelayTime = lData
    End Property
    Public Property Let Icon(ByVal vData As ttIconType)
        mvarIcon = vData
        If m_lTTHwnd <> 0 And mvarTitle <> Empty And mvarIcon <> TTNoIcon Then
            SendMessage m_lTTHwnd, TTM_SETTITLE, CLng(mvarIcon), ByVal mvarTitle
        End If
    End Property
    Public Property Get Icon() As ttIconType
        Icon = mvarIcon
    End Property
    Public Property Let ForeColor(ByVal vData As Long)
        mvarForeColor = vData
        If m_lTTHwnd <> 0 Then
            SendMessage m_lTTHwnd, TTM_SETTIPTEXTCOLOR, mvarForeColor, 0&
        End If
    End Property
    Public Property Get ForeColor() As Long
        ForeColor = mvarForeColor
    End Property
    Public Property Let Title(ByVal vData As String)
        mvarTitle = vData
        If m_lTTHwnd <> 0 And mvarTitle <> Empty And mvarIcon <> TTNoIcon Then
            SendMessage m_lTTHwnd, TTM_SETTITLE, CLng(mvarIcon), ByVal mvarTitle
        End If
    End Property
    Public Property Get Title() As String
        Title = ti.lpStr
    End Property
    Public Property Let PopupOnDemand(ByVal vData As Boolean)
        mvarPopupOnDemand = vData
    End Property
    Public Property Get PopupOnDemand() As Boolean
        PopupOnDemand = mvarPopupOnDemand
    End Property
    Public Property Let BackColor(ByVal vData As Long)
        mvarBackColor = vData
        If m_lTTHwnd <> 0 Then
            SendMessage m_lTTHwnd, TTM_SETTIPBKCOLOR, mvarBackColor, 0&
        End If
    End Property
    Public Property Get BackColor() As Long
        BackColor = mvarBackColor
    End Property
    Public Property Let TipText(ByVal vData As String)
        mvarTipText = vData
        ti.lpStr = vData
        If m_lTTHwnd <> 0 Then
            SendMessage m_lTTHwnd, TTM_UPDATETIPTEXTA, 0&, ti
        End If
    End Property
    Public Property Get TipText() As String
        TipText = mvarTipText
    End Property
    Public Property Let Style(ByVal vData As ttStyleEnum)
        mvarStyle = vData
    End Property
    Public Property Get Style() As ttStyleEnum
        Style = mvarStyle
    End Property
    Public Property Let Centered(ByVal vData As Boolean)
        mvarCentered = vData
    End Property
    Public Property Get Centered() As Boolean
        Centered = mvarCentered
    End Property
    Public Sub Show(Optional X As Long = 0, Optional Y As Long = 0)
        Dim pt As POINTAPI
        Dim ptTip As Long
        Dim ret As Long    With pt
            .X = X
            .Y = Y
        End With
        ret = ClientToScreen(Form1.Text1.hwnd, pt)
        ptTip = pt.Y * &H10000
        ptTip = ptTip + pt.X
        ret = SendMessage(m_lTTHwnd, TTM_TRACKPOSITION, 0, ByVal ptTip)
        ret = SendMessage(m_lTTHwnd, TTM_TRACKACTIVATE, True, ti)
    End Sub
    Public Function CreateToolTip(ByVal ParentHwnd As Long) As Boolean
        Dim lWinStyle As Long
        If m_lTTHwnd <> 0 Then
            DestroyWindow m_lTTHwnd
        End If
        m_lParentHwnd = ParentHwnd
        ''create baloon style if desired
        If mvarStyle = TTBalloon Then lWinStyle = lWinStyle Or TTS_BALLOON    m_lTTHwnd = CreateWindowEx(0&, TOOLTIPS_CLASSA, vbNullString, lWinStyle, 0&, 0&, 0&, 0&, m_lParentHwnd, 0&, 0&, 0&)
        With ti
            If mvarCentered Then
                If mvarPopupOnDemand = False Then
                    .lFlags = TTF_SUBCLASS Or TTF_CENTERTIP Or TTF_IDISHWND
                Else
                    .lFlags = TTF_IDISHWND Or TTF_TRACK Or TTF_CENTERTIP
                End If
            Else
                If mvarPopupOnDemand = False Then
                    .lFlags = TTF_SUBCLASS Or TTF_IDISHWND
                Else
                    .lFlags = TTF_IDISHWND Or TTF_TRACK Or TTF_TRANSPARENT
                End If
            End If        'set the hwnd prop to our parent control's hwnd
            .hwnd = m_lParentHwnd
            .lId = m_lParentHwnd                              '0
            .hInstance = App.hInstance
            .lSize = Len(ti)
        End With
        'add the tooltip structure
        SendMessage m_lTTHwnd, TTM_ADDTOOLA, 0&, ti    'if we want a title or we want an icon
        If mvarTitle <> vbNullString Or mvarIcon <> TTNoIcon Then
            SendMessage m_lTTHwnd, TTM_SETTITLE, CLng(mvarIcon), ByVal mvarTitle
        End If
        If mvarForeColor <> Empty Then
            SendMessage m_lTTHwnd, TTM_SETTIPTEXTCOLOR, mvarForeColor, 0&
        End If
        If mvarBackColor <> Empty Then
            SendMessage m_lTTHwnd, TTM_SETTIPBKCOLOR, mvarBackColor, 0&
        End If
        SendMessageLong m_lTTHwnd, TTM_SETDELAYTIME, TTDT_AUTOPOP, mvarVisibleTime
        SendMessageLong m_lTTHwnd, TTM_SETDELAYTIME, TTDT_INITIAL, mvarDelayTime
    End FunctionPublic Sub Destroy()
        If m_lTTHwnd <> 0 Then
            DestroyWindow m_lTTHwnd
        End If
    End Sub'使用窗体代码,以输入数字为例Option Explicit
    Dim tip As New CTipsPrivate Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
        tip.Destroy
    End SubPrivate Sub Form_Terminate()
        Set tip = Nothing
    End SubPrivate Sub Text1_KeyPress(KeyAscii As Integer)
        If (KeyAscii > 57 Or KeyAscii < 48) And KeyAscii <> 8 Then
            Call ShowMyTip
            KeyAscii = 0
        Else
            tip.Destroy
        End If
    End SubPrivate Sub ShowMyTip()
        tip.Style = TTBalloon
        tip.Icon = TTIconError
        tip.Title = "请输入数字!"
        tip.TipText = " "
        tip.PopupOnDemand = True
        tip.CreateToolTip Text1.hwnd
        tip.Show Text1.Width / Screen.TwipsPerPixelX, Text1.Height / Screen.TwipsPerPixelX / 2 - 1 '//In Pixel only
    End Sub
      

  5.   

    麻烦你看清楚楼主的话,他还需要提示,难道你要每次弹出一个很令人反感的msgbox?
    怎樣保證Text1.text輸入必須是數字呢? 
    如是字符,提示......
      

  6.   

    是别人给楼主的代码加上了MSGBOX
    提示可以放在状态栏中,何必用气泡?
      

  7.   

    用哪个好似乎要看用户习惯,而不是我们说该如何选择。
    从交互设计的角度来讲,用气泡的优点可能交互性更强,缺点可能就是和可能因为一些API的问题耦合性较强。我选择气泡只是提供一个参考。
      

  8.   


    收藏了
    只是tooltip上面那个红色的X,鼠标放到上面没有变成"手",另外那个红色的X也不管用
    不过可以在这个基础上改改
      

  9.   

    謝謝各位對貼的回復;
    TKS!
    特別謝謝 clear_zero
    不愧是一個好BZ;
      

  10.   

    clear_zero 的回复使你获益最大?
      

  11.   

    再次謝謝各位;
    可能我基礎不行吧;
    我的要求是:
    Text1.text必須是數字;
    如果Text1.text輸入的是"字符",提示“你輸入的是字符,請重新輸入數字!”
    如果Text1.text輸入的是"空格",提示“你輸入的是空格,請重新輸入數字!"
    如果Text1.text輸入的是......
    etc;
      

  12.   

    Private Sub Form_Load()
    Text1 = ""
    End SubPrivate Sub Text1_Change()
    If Text1 = "" Then Exit Sub
    If Not IsNumeric(Text1) Then
    MsgBox "请输入数字!"
    Text1 = Left(Text1, Len(Text1.Text) - 1)
    Text1.SelStart = Len(Text1.Text)
    End If
    End Sub
      

  13.   

    各位XD,以下代碼是否可行:
    If Left(Text1.Text, 1) = 0 Then
            Text2.Text = "你輸入的是數字"
        ElseIf Left(Text1.Text, 1) = 1 Then
            Text2.Text = "你輸入的是數字"
        ElseIf Left(Text1.Text, 1) = 3 Then
            Text2.Text = "你輸入的是數字"
        ElseIf Left(Text1.Text, 1) = 4 Then
            Text2.Text = "你輸入的是數字"
        ElseIf Left(Text1.Text, 1) = 5 Then
            Text2.Text = "你輸入的是數字"
        ElseIf Left(Text1.Text, 1) = 6 Then
            Text2.Text = "你輸入的是數字"
        ElseIf Left(Text1.Text, 1) = 7 Then
            Text2.Text = "你輸入的是數字"
        ElseIf Left(Text1.Text, 1) = 8 Then
            Text2.Text = "你輸入的是數字"
        ElseIf Left(Text1.Text, 1) = 9 Then
            Text2.Text = "你輸入的是數字"
        Else
            Text2.Text = "你輸入的是非數字!"
        End If
      

  14.   


    如果这不是特别要求的话,其实不需要做 “你输入的是...”。
    多一些代码是可以实现你的需求,但我们给一个msgbox的最终目的是告诉用户这个text需要什么,客户刚刚敲入的东西其实不必要重复出来。
    如果非要的话,你需要把字符,空格等等用一个字典一样的东西从asc码
    你的msgbox就这样Private Sub Text1_KeyPress(KeyAscii As Integer)
    If KeyAscii < &H30 Or KeyAscii > &H39 Then
    if KeyAscii=&H32 then
     MsgBox "The character you just input is ENTER,please input number"
    else 
     MsgBox "The character you just input is '" & chr(KeyAscii) & "',please input number"
    end ifKeyAscii = 0
    End IfEnd Sub大概就是那样了,你自己再改改
      

  15.   

    以前做过,参考:http://topic.csdn.net/u/20070815/17/f1c68367-7fe3-42ef-ab8f-00f07525908e.htmlhttp://topic.csdn.net/u/20070723/17/fcb3dcf0-eb5c-4144-b6e9-bf33fc86097f.html主要原理很简单,先利用KEYPRESS过滤录入的内容,再利用子类化吃掉剪贴板消息,即可完美解决此问题.我这里有一个示例代码:'本代码在窗体中,窗体中有一个Text1.
    Option Explicit
    '只允许文本框输入数值示例
    '
    '处理思路:
    '           先在文本框的KeyPress事件里处理键盘上的输入,再使用子类化禁止复制粘贴与剪切消息.
    '
    'BY 嗷嗷叫的老马
    '紫水晶工作室
    'http://www.m5home.com/
    '2009-10-03Private Sub Form_Load()
        '复制粘贴剪切使用子类化处理
        PrevWndProc = SetWindowLong(Text1.hwnd, GWL_WNDPROC, AddressOf SubWndProc)
    End SubPrivate Sub Form_Unload(Cancel As Integer)
        SetWindowLong Text1.hwnd, GWL_WNDPROC, PrevWndProc
    End SubPrivate Sub Text1_KeyPress(KeyAscii As Integer)
        '只允许数字键,退格键,小数点进行输入的处理
        Debug.Print KeyAscii
        Select Case KeyAscii
            Case vbKey0 To vbKey9, vbKeyBack        '0 - 9,BACKSPACE处理
            Case vbKeyDelete, vbKeyDecimal          '小数点处理
                If InStr(1, Text1.Text, ".") <> 0 Then KeyAscii = 0
            Case Else
                KeyAscii = 0
        End Select
    End Sub'以下代码在模块中.
    Option Explicit
    '子类化模块
    '
    'BY 嗷嗷叫的老马
    '紫水晶工作室
    'http://www.m5home.com/
    '2009-10-03Public Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongW" ( _
            ByVal hwnd As Long, _
            ByVal nIndex As Long, _
            ByVal dwNewLong As Long) As Long
    Public Declare Function CallWindowProc Lib "user32.dll" Alias "CallWindowProcW" ( _
            ByVal lpPrevWndFunc As Long, _
            ByVal hwnd As Long, _
            ByVal msg As Long, _
            ByVal wParam As Long, _
            ByVal lParam As Long) As Long
    Public Declare Function GetWindowLong Lib "user32.dll" Alias "GetWindowLongA" ( _
            ByVal hwnd As Long, _
            ByVal nIndex As Long) As Long
    Public Const GWL_STYLE      As Long = (-16)
    Public Const ES_NUMBER      As Long = &H2000&
    Public Const GWL_WNDPROC    As Long = (-4)
    Public Const WM_GETTEXT     As Long = &HD
    Public Const WM_COPY        As Long = &H301
    Public Const WM_PASTE       As Long = &H302
    Public Const WM_CUT         As Long = &H300Public PrevWndProc     As LongPublic Function SubWndProc(ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
        Select Case msg                       '在这里进行过滤.如果知道其他的消息,也可以在这里过滤.
            Case WM_COPY, WM_PASTE, WM_CUT      '复制,粘贴,剪切处理
                SubWndProc = 1                  '吃掉不处理.
                Exit Function
        End Select
        SubWndProc = CallWindowProc(PrevWndProc, hwnd, msg, wParam, lParam)                       '其它消息不管
    End Function