我在VB6中创建了一个拨号器来拨打电话号码。它有以下按钮:数字0-9,退格键,“呼叫”和“断开连接”。现在我想使用键盘的键盘部分在表单中输入数字。在文本框中,可以使用键盘输入任何键。但我只想让数字键盘运行。
为此,我使用KeyPress事件检查ASCII值 - 查看按下的键值是否介于47和58之间。但是除了键值之外,其ASCII值也会显示在文本框中。
还有一件事 - 我在表单上有一个MS Flex Grid和拨号器。因此,当光标位于表单上时,或者如果鼠标单击文本框以外的任何位置,则值不会显示在文本框中。那么我如何始终专注于文本框?
Dim val As Integer
Private Sub append(val As Integer)
Text1.Text = Text1.Text & val
End Sub
Private Sub Backspace_Click()
With Text1
'FOCUS TO THE TEXTBOX
.SetFocus
'PUT THE CURSOR AT THE END OF THE TEXT
.SelStart = Len(.Text)
'SEND THE KEY
SendKeys ("{BACKSPACE}")
'AND THATS IT :D
End With
End Sub
Private Sub key_0_Click()
val = 0
append val
End Sub
Private Sub key_1_Click()
val = 1
append val
End Sub
Private Sub key_2_Click()
val = 2
append val
End Sub
Private Sub key_3_Click()
val = 3
append val
End Sub
Private Sub key_4_Click()
val = 4
append val
End Sub
Private Sub key_5_Click()
val = 5
append val
End Sub
Private Sub key_6_Click()
val = 6
append val
End Sub
Private Sub key_7_Click()
val = 7
append val
End Sub
Private Sub key_8_Click()
val = 8
append val
End Sub
Private Sub key_9_Click()
val = 9
append val
End Sub
Private Sub Text1_KeyPress(KeyAscii As Integer)
If (KeyAscii > 47 And KeyAscii < 58) Then
val = KeyAscii
append val
Else
KeyAscii = 0
'Text1.Text = KeyAscii 万一 结束子
'Private Sub Text1_LostFocus()
' Text1.SetFocus
'End Sub
答案 0 :(得分:1)
您可以将表单上的KeyPreview属性设置为true。 完成后,将代码放在Textbox的KeyPress中的表单的KeyPress中,并设置文本框的文本值,或者更好地将代码移动到一个函数中并从那里设置它,这样一来如果您在其他地方需要,您不会需要复制代码。
看看这个,看它是否有助于KeyPreview from MSDN
您好, 抱歉耽搁了。要使用表单的KeyPreview,请尝试:
在表单的属性中找到KeyPreview属性并将其设置为true
双击表单以显示代码窗口
选择表单的按键事件,并添加以下代码或类似内容。
Private Sub Form_KeyPress(KeyAscii As Integer)
Text1.Text = Text1.Text & Chr$(NrOnly(KeyAscii))
End Sub
使用Hqrls发布的NrOnly函数,因为它只允许帮助您进行验证的数字。您不会需要Text1_KeyPress中的任何代码,表单现在将为您处理。 尝试一下,如果您需要任何其他信息,请告诉我,我会看到我能做些什么。
[EDIT 29/05/2014]
您好,
我已经对代码进行了一些游戏,并添加了一些我认为可能有用的内容。看看这个,看看它是否有意义。如果您将其复制到代码中,请确保备份原始代码,以防万一您需要回复它。
如果您保留文本框
,这是代码Option Explicit
Dim val As String
Dim m_blnTextHasFocus As Boolean 'Added this, so it knows wether the the textbox
'has the focus or not
'it is so the sendkeys doesn't get stuck in a
'loop with the key presses
Private Sub append(strIn As String)
'Changed the parameter from an int to a string, so we can use it in the key press events
Text1.Text = Text1.Text & strIn
End Sub
Private Sub Backspace_Click()
'Moved the code into it's own sub
DeleteAChar
End Sub
Private Sub Form_KeyPress(KeyAscii As Integer)
'Handle a key press if the textbox doesn't have the focus but ignore the keypress if it does
If Not m_blnTextHasFocus Then
If IsNumeric(Chr$(KeyAscii)) Then
append Chr$(KeyAscii)
ElseIf KeyAscii = vbKeyBack Then
DeleteAChar
End If
End If
End Sub
Private Sub key_0_Click()
val = "0"
append val
End Sub
Private Sub key_1_Click()
val = "1"
append val
End Sub
Private Sub key_2_Click()
val = "2"
append val
End Sub
Private Sub key_3_Click()
val = "3"
append val
End Sub
Private Sub key_4_Click()
val = "4"
append val
End Sub
Private Sub key_5_Click()
val = "5"
append val
End Sub
Private Sub key_6_Click()
val = "6"
append val
End Sub
Private Sub key_7_Click()
val = "7"
append val
End Sub
Private Sub key_8_Click()
val = "8"
append val
End Sub
Private Sub key_9_Click()
val = "9"
append val
End Sub
Private Sub Text1_GotFocus()
m_blnTextHasFocus = True
End Sub
Private Sub Text1_KeyPress(KeyAscii As Integer)
'Check the keyascii value and ignore it if it isn't numeric or backspace
If Not IsNumeric(Chr$(KeyAscii)) And KeyAscii <> vbKeyBack Then
KeyAscii = 0
End If
End Sub
Private Sub DeleteAChar()
With Text1
'FOCUS TO THE TEXTBOX
.SetFocus
'PUT THE CURSOR AT THE END OF THE TEXT
.SelStart = Len(.Text)
'SEND THE KEY
SendKeys ("{BACKSPACE}")
'AND THATS IT :D
End With
End Sub
Private Sub Text1_LostFocus()
m_blnTextHasFocus = False
End Sub
如果您不需要保留文本框,那么您可以用标签替换它并尝试使用它。它将消除跟踪文本框是否已获得焦点的需要。快来看看它是否有帮助。唯一的另一件事是确保为表单启用KeyPreview,或者只有具有焦点的按键代码才能用于表单。
答案 1 :(得分:0)
文本框是您想要获得焦点的唯一控件吗?
在这种情况下,您可以使用以下代码:
Private Sub Text1_LostFocus()
Text1.SetFocus
End Sub
如果您还希望能够拥有其他任何控件,那么您可以在不希望具有焦点的控件的_GotFocus()事件中使用Text1.SetFocus
另一种可能的解决方案是使用其他控件的_KeyPress()事件,并将当前的Text1_KeyPress()事件转换为可由其他控件的_KeyPress()事件调用的常规函数。确保将此常规函数的输出发送到正确的文本框
如果您发布代码的相关部分,我们可以提供更具体的答案
<强> [编辑] 强>
对于原始问题的答案,请使用表格上的keypreview来回答lardymonkey
仅允许使用数字键和退格键的示例函数:
Private Sub Text1_KeyPress(KeyAscii As Integer)
KeyAscii = NrOnly(KeyAscii)
End Sub
Private Function NrOnly(intAscii As Integer) As Integer
Dim intReturn As Integer
intReturn = intAscii
Select Case intAscii
Case vbKeyBack
Case vbKey0 To vbKey9
Case Else
intReturn = 0
End Select
NrOnly = intReturn
End Function