在按下 Ctrl + Z 之后,如何在文本框出现之前找到它的内容?
How do I find what a TextBox's contents will be after pressing Ctrl + Z, before it occurs?
我正在编写一个小函数,它将在 KeyPress 事件之后但在 KeyPress 事件期间计算 TextBox 的内容。我知道,这听起来很奇怪。 :)
这是因为我在工作中接到了一个项目,我要在其中修复当前程序中的任何错误。
目前有一个 TextBox,它在 KeyPress 事件中触发对 SQL 服务器的搜索。
这将搜索与 Chr(KeyAscii)
串联的 TextBox 的当前内容
这意味着如果您的 TextBox 包含 Hello 并且您的光标位于单词的末尾,它将正常工作,但如果您选择了 o 并按 a 它将搜索 Helloa 而不是 Hella。
为了更正,我想出了以下函数
Private Function TextAfterKeyPress(Ctrl As Control, KeyAscii As Integer) As String
Dim strUnSelLeft As String
Dim strUnSelRight As String
Dim strSel As String
Dim strMid As String
With Ctrl
strUnSelLeft = ""
strUnSelRight = ""
strMid = .Text
Select Case KeyAscii
Case 1 ' Ctrl + A
' No change to text
Case 3 ' Ctrl + C
' No change to text
Case 8 ' BackSpace
If .SelStart = 0 Then
' No change to text
Else
If .SelLength = 0 Then
strUnSelLeft = Left(.Text, .SelStart - 1)
strUnSelRight = Right(.Text, Len(.Text) - (.SelStart + .SelLength))
strMid = ""
Else
strUnSelLeft = Left(.Text, .SelStart)
strUnSelRight = Right(.Text, Len(.Text) - (.SelStart + .SelLength))
strMid = ""
End If
End If
Case 9 ' Tab
' No change to text
Case 13 ' Return
' No change to text
Case 22 ' Ctrl + V
strUnSelLeft = Left(.Text, .SelStart)
strUnSelRight = Right(.Text, Len(.Text) - (.SelStart + .SelLength))
strMid = Clipboard.GetText
Case 24 ' Ctrl + X
If .SelLength = 0 Then
' No change to text
Else
strUnSelLeft = Left(.Text, .SelStart)
strUnSelRight = Right(.Text, Len(.Text) - (.SelStart + .SelLength))
strMid = ""
End If
Case 26 ' Ctrl + Z
Case 27 ' Esc
' No Change to text
Case 137, 153, 160, 169, 188, 189, 190, 215, 247 ' Disallowed Chars
' No Change to text
Case 128 To 255 ' Allowed non standard Chars
strUnSelLeft = Left(.Text, .SelStart)
strUnSelRight = Right(.Text, Len(.Text) - (.SelStart + .SelLength))
strMid = Chr(KeyAscii)
Case 32 To 127 ' Standard Printable Chars
strUnSelLeft = Left(.Text, .SelStart)
strUnSelRight = Right(.Text, Len(.Text) - (.SelStart + .SelLength))
strMid = Chr(KeyAscii)
Case Else
End Select
TextAfterKeyPress = strUnSelLeft & strMid & strUnSelRight
End With
End Function
现在,对于 "Case 26" 部分,它将执行撤消操作,然后搜索将无法再次正常工作。
有什么方法可以找出当您按下 Ctrl + Z 时 TextBox 的内容是什么,但在它发生的 KeyPress 期间? KeyPress 事件在 TextBox 的内容更改之前触发,因此我需要找出撤消缓冲区中的内容,以便我可以 运行 进行正确的搜索。
谁能指出我正确的方向?
我使用过一些文本框 API ..我不认为你可以处理它的 UNDO 缓冲区,因为它的限制..但你可以做的是手动发送一个 UNDO 然后读取文本框内容.
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Const EM_UNDO = &HC7
,
Case 26
KeyAscii = 0
SendMessage .hwnd, EM_UNDO, ByVal 0, ByVal 0
strMid = .Text
如果您只需要阅读文本而不需要更改它,您可以发送另一个 UNDO 消息以使文本恢复到其先前的内容。
我正在编写一个小函数,它将在 KeyPress 事件之后但在 KeyPress 事件期间计算 TextBox 的内容。我知道,这听起来很奇怪。 :)
这是因为我在工作中接到了一个项目,我要在其中修复当前程序中的任何错误。
目前有一个 TextBox,它在 KeyPress 事件中触发对 SQL 服务器的搜索。 这将搜索与 Chr(KeyAscii)
串联的 TextBox 的当前内容这意味着如果您的 TextBox 包含 Hello 并且您的光标位于单词的末尾,它将正常工作,但如果您选择了 o 并按 a 它将搜索 Helloa 而不是 Hella。
为了更正,我想出了以下函数
Private Function TextAfterKeyPress(Ctrl As Control, KeyAscii As Integer) As String
Dim strUnSelLeft As String
Dim strUnSelRight As String
Dim strSel As String
Dim strMid As String
With Ctrl
strUnSelLeft = ""
strUnSelRight = ""
strMid = .Text
Select Case KeyAscii
Case 1 ' Ctrl + A
' No change to text
Case 3 ' Ctrl + C
' No change to text
Case 8 ' BackSpace
If .SelStart = 0 Then
' No change to text
Else
If .SelLength = 0 Then
strUnSelLeft = Left(.Text, .SelStart - 1)
strUnSelRight = Right(.Text, Len(.Text) - (.SelStart + .SelLength))
strMid = ""
Else
strUnSelLeft = Left(.Text, .SelStart)
strUnSelRight = Right(.Text, Len(.Text) - (.SelStart + .SelLength))
strMid = ""
End If
End If
Case 9 ' Tab
' No change to text
Case 13 ' Return
' No change to text
Case 22 ' Ctrl + V
strUnSelLeft = Left(.Text, .SelStart)
strUnSelRight = Right(.Text, Len(.Text) - (.SelStart + .SelLength))
strMid = Clipboard.GetText
Case 24 ' Ctrl + X
If .SelLength = 0 Then
' No change to text
Else
strUnSelLeft = Left(.Text, .SelStart)
strUnSelRight = Right(.Text, Len(.Text) - (.SelStart + .SelLength))
strMid = ""
End If
Case 26 ' Ctrl + Z
Case 27 ' Esc
' No Change to text
Case 137, 153, 160, 169, 188, 189, 190, 215, 247 ' Disallowed Chars
' No Change to text
Case 128 To 255 ' Allowed non standard Chars
strUnSelLeft = Left(.Text, .SelStart)
strUnSelRight = Right(.Text, Len(.Text) - (.SelStart + .SelLength))
strMid = Chr(KeyAscii)
Case 32 To 127 ' Standard Printable Chars
strUnSelLeft = Left(.Text, .SelStart)
strUnSelRight = Right(.Text, Len(.Text) - (.SelStart + .SelLength))
strMid = Chr(KeyAscii)
Case Else
End Select
TextAfterKeyPress = strUnSelLeft & strMid & strUnSelRight
End With
End Function
现在,对于 "Case 26" 部分,它将执行撤消操作,然后搜索将无法再次正常工作。
有什么方法可以找出当您按下 Ctrl + Z 时 TextBox 的内容是什么,但在它发生的 KeyPress 期间? KeyPress 事件在 TextBox 的内容更改之前触发,因此我需要找出撤消缓冲区中的内容,以便我可以 运行 进行正确的搜索。
谁能指出我正确的方向?
我使用过一些文本框 API ..我不认为你可以处理它的 UNDO 缓冲区,因为它的限制..但你可以做的是手动发送一个 UNDO 然后读取文本框内容.
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Const EM_UNDO = &HC7
,
Case 26
KeyAscii = 0
SendMessage .hwnd, EM_UNDO, ByVal 0, ByVal 0
strMid = .Text
如果您只需要阅读文本而不需要更改它,您可以发送另一个 UNDO 消息以使文本恢复到其先前的内容。