在一个文本框textbox的KeyPress事件中,如何能够得知KeyPress之后文本框的值是什么?这个创意题目,咱一直没解决

解决方案 »

  1.   

    你可能需要参考下这个,当然,我这代码没处理个别特殊键,比如回车,退格:)
    Private Sub Text1_KeyPress(KeyAscii As Integer)
        Dim strLeft As String, strRight As String
        strLeft = Mid$(Text1.Text, 1, Text1.SelStart)
        strRight = Mid$(Text1.Text, Text1.SelStart + Text1.SelLength + 1)
        'MsgBox strLeft
        MsgBox strLeft & Chr(KeyAscii) & strRight
    End Sub
      

  2.   


    这个还要考虑text1.sellength吧?在选择了某些文本的情况下,再键入值就是替换了
      

  3.   

    KeyPress之后TextBox的内容是什么?这个很容易理解啊,就是响应的KeyPress后该有的内容啊。
    楼主只问就像再问吃了东西之后人是什么感觉。什么感觉???别问我,那得看看你吃了什么
      

  4.   


    或者,换个问题,如何知道change事件之前的textbox.text是什么?
      

  5.   

    这又是问Text1_KeyPress时,textbox.text的值。
    就在KeyPress事件中获取吧。KeyPress之后文本框的值是什么?
    就在KeyPress事件以后,从Text1_Change事件中获取.这样行不?
      

  6.   


    Option ExplicitPrivate Sub Text1_Change()
    MsgBox Text1.Text & vbCrLf & "改变后的"
    End SubPrivate Sub Text1_KeyPress(KeyAscii As Integer)
    MsgBox Text1.Text & vbCrLf & "改变前的"
    End Sub
      

  7.   


    可以用鼠标右键删除字符,这样触发了change事件,但是无keypress事件
    另外,delete键删除字符也没kepress
      

  8.   

    鼠标删除有撤销。Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
    Private Declare Function MapVirtualKey Lib "user32" Alias "MapVirtualKeyA" (ByVal wCode As Long, ByVal wMapType As Long) As Long
    Private Const VK_CONTROL = &H11
    Private Const KEYEVENTF_KEYUP = &H2
    Private disa As BooleanPrivate Sub Text1_Change()
    Text1.SetFocus
      If disa = False Then
        keybd_event VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), 0, 0
        keybd_event Asc("Z"), MapVirtualKey(Asc("Z"), 0), 0, 0
        keybd_event Asc("Z"), MapVirtualKey(Asc("Z"), 0), KEYEVENTF_KEYUP, 0
        keybd_event VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), KEYEVENTF_KEYUP, 0
        disa = True
      End If
    End Sub
    Delete则用KeyDown事件替换KeyPress
      

  9.   

    找了一个替换方法,每次change之前都记录一下当前的值,留作下次change的时候做判断,这样在下次change事件发生的时候就知道上次是什么值了
      

  10.   


    对于没有提供类似BeforeChange一类事件的控件来说,最容易想到也是最基本的也就是你说的这样做了.
    我这所以要和你进一步讨论KeyPress等,只是因为在很多时候,我们会需要做更多的处理, 以便用户录入起来更方便.比如说,当用户输入了无效字符时,要把当前值恢复为原始值,并且当前字符位置也要恢复,这就需要在KeyPress等事件中做处理.补充两点:
    1,我在2楼中的代码你可能没仔细测试,你说"这个还要考虑text1.sellength吧?在选择了某些文本的情况下,再键入值就是替换了",但事实上我这代码已经考虑了这点的.
    2,delete键在KeyDown事件中通过KeyCode参数可识别.
      

  11.   

    sorry,没仔细看你的这个代码,刚仔细看了一下,确实,这样处理能解决这个问题。
    我来做个补充:
    1,如果是功能键(比如回车)要过滤掉,因为这个受单行文本和多行文本的限制;
    2,如阁下所说:在keycode中处理delete(不过一般来说,如果只是做校验,是不需要处理delete的);
    3,如果用来做校验,还是要处理右键菜单才行的
    做了这几点,用它做校验就比较完善了
      

  12.   

    纯粹把问题搞复杂了,自找麻烦!
    在文本框输入的中间状态,Text 值并不能一直“合法有效”的,比如一个非空字段中,我准备全选、按 DELETE 清除、重新输入,那么清除时的 Text 并不是有效的,难道你就马上恢复旧值了?标准的做法是在 Validate 事件中进行校验,最多如果你存有旧值,校验非法时恢复一下,这就够了。
      

  13.   


    Validate 这个事件好像在用了一些表格或者皮肤控件之后有点小问题。
      

  14.   

    另外,你说的在Validate 中判断,那是事后判段了,数据已经输进去了,用户再来更改错误,那用户就必须要知晓输入规则,这样无形中就给用户的使用增加了难度