我在vb6中创建了一个exe文件,其中包含用户填写的表单。我试图这样做,以便如果Tab超过表单的可见区域,如果您的ActiveControl不在表单的可见部分,它将自动向下滚动。我唯一的问题是我找不到捕捉Tab键的方法。据我所知,经过大量的谷歌搜索后,捕获tab键的方法是将表单的KeyPreview属性设置为True,并为表单上的每个控件设置TabStop属性为false。
我的问题是,如果有任何方法可以捕获vb6中的Tab键,而无需禁用所有TabStop。
答案 0 :(得分:1)
试着看一下不同的房产呢?
当控件“enter”事件被触发时可以读取帮助您确定向下滚动吗? 当用户选中每个项目并允许您确定滚动视图的位置时,就会发生这种情况。
答案 1 :(得分:1)
我想我有一个答案,但是没有经过考验。
使用计时器控件,获取活动控件。然后看表格的Top&高度属性与活动控件相同,您可以确定活动控件是否在窗体的可查看区域内,如果需要,可以滚动窗体。
希望它有所帮助。
答案 2 :(得分:1)
当有控件可以获得焦点时,您无法捕获 Tab 按VB6格式(使用本机方法)。
但是,您可以使用其他方法,例如a timer checking the current control或capturing the GotFocus
events。这些还可以处理其他获取焦点的方法,只需点击鼠标即可。
答案 3 :(得分:0)
它可能不是您问题的完整答案,但有几个例子可以解决如何在vbforums上解决此问题: http://www.vbforums.com/showthread.php?231180-VB-A-demonstration-of-how-to-trap-the-Tab-key
答案 4 :(得分:0)
以编程方式扫描表单上的控件。
请注意具有TabStop = True的那些。
将它们放入按TabIndex排序的列表中。
清除所有控件的TabStop = True属性。
启用表单的KeyPreview选项。
捕获表单的_KeyDown事件。
如果键是Tab键,请单击控制列表以查找下一个或上一个键并将焦点设置为它。
如果焦点位于网格上,您可以选择向前或向后移动选定的行/列。
我在石器时代写过这堂课。可耻的丑陋代码,但它确实有效。
具有多个控件和网格的表单:
Private WithEvents TabStop As cTabStop
Private Sub Form_Load()
Me.MSFlexGrid1.Rows = 3
Me.MSFlexGrid1.Cols = 3
Me.MSFlexGrid1.FixedRows = 0
Me.MSFlexGrid1.FixedCols = 0
Set TabStop = New cTabStop
TabStop.Setup Me
End Sub
Private Sub TabStop_TabPressed(ByVal Shift As Integer, Cancel As Integer)
If Me.ActiveControl.Name = Me.MSFlexGrid1.Name Then
If Shift = 0 Then
If Me.MSFlexGrid1.Col < Me.MSFlexGrid1.Cols - 1 Then
Me.MSFlexGrid1.Col = Me.MSFlexGrid1.Col + 1
Cancel = 1
ElseIf Me.MSFlexGrid1.Row < Me.MSFlexGrid1.Rows - 1 Then
Me.MSFlexGrid1.Col = 0
Me.MSFlexGrid1.Row = Me.MSFlexGrid1.Row + 1
Cancel = 1
End If
Else
If Me.MSFlexGrid1.Col > 0 Then
Me.MSFlexGrid1.Col = Me.MSFlexGrid1.Col - 1
Cancel = 1
ElseIf Me.MSFlexGrid1.Row > 0 Then
Me.MSFlexGrid1.Col = Me.MSFlexGrid1.Cols - 1
Me.MSFlexGrid1.Row = Me.MSFlexGrid1.Row - 1
Cancel = 1
End If
End If
End If
End Sub
类别:
Option Explicit
' ------------------------------------------------------------------------------
' This class ATTEMPTS to manage Tab Keypress events
' The specific advantage is the ability capture and cancel a Tab Keypress
'
' This is a horribly inelegant way to get the job done
'
' Bug:
' If a control should be next to receive focus, but is sitting on a control
' which is hidden, the tab order will not be able to proceed past that control.
' i.e. Command1 on Frame1 where Frame1.Visible = False
' ------------------------------------------------------------------------------
Private Type typeControl
Control As Control
TabIndex As Long
End Type
Private Type typeSettings
Controls() As typeControl
ControlCount As Long
End Type
Public Event TabPressed(ByVal Shift As Integer, ByRef Cancel As Integer)
Private Settings As typeSettings
Private WithEvents Form As Form
Public Sub Setup(Form_ As Form)
Call FunctionTagger("cTabStop", "Setup")
On Error GoTo E
Dim Control As Control
' Get the Form and enable its KeyPreview ability
Set Form = Form_
Form.KeyPreview = True
' Get the Tab-Able controls from the form
Settings.ControlCount = 0
ReDim Settings.Controls(0 To 0)
For Each Control In Form.Controls
Call AddControl(Control)
Next Control
Exit Sub
E:
Debug.Print " " & Err.Description
End Sub
Public Sub Clear()
Call FunctionTagger("cTabStop", "Clear")
Set Form = Nothing
Settings.ControlCount = 0
ReDim Settings.Controls(0 To 0)
End Sub
Private Sub AddControl(ByRef Control As Control)
Call FunctionTagger("cTabStop", "AddControl")
On Error GoTo E
Dim TabIndex As Long
Dim TabStop As Boolean
Dim Visible As Boolean
Dim Enabled As Boolean
' Only accept controls with these four properties
TabStop = Control.TabStop
TabIndex = Control.TabIndex
Visible = Control.Visible
Enabled = Control.Enabled
' Diable the control's TabStop property
Control.TabStop = False
' Add the control to our list
Settings.ControlCount = Settings.ControlCount + 1
ReDim Preserve Settings.Controls(0 To Settings.ControlCount - 1)
Set Settings.Controls(Settings.ControlCount - 1).Control = Control
Settings.Controls(Settings.ControlCount - 1).TabIndex = TabIndex
Exit Sub
E:
End Sub
Private Sub Class_Initialize()
Call FunctionTagger("cTabStop", "Class_Initialize")
Clear
End Sub
Private Sub Class_Terminate()
Call FunctionTagger("cTabStop", "Class_Terminate")
Clear
End Sub
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
Call FunctionTagger("cTabStop", "Form_KeyDown")
Dim Cancel As Integer
If KeyCode = 9 Then
KeyCode = 0
RaiseEvent TabPressed(Shift, Cancel)
Debug.Print " Tab Pressed"
If Cancel <> 0 Then ' Tab Keypress Cancelled...
KeyCode = 0
ElseIf Shift = 0 Then ' Tab Pressed...
TabRight
ElseIf Shift = 1 Then ' Shift-Tab Pressed...
TabLeft
End If
End If
End Sub
Public Sub TabLeft()
Call FunctionTagger("cTabStop", "TabLeft")
On Error GoTo E
Dim CurTabIndex As Long
Dim NextControl As Long
Dim NextTabIndex As Long
Dim c As Long
' Get the Tab Index of the currently active control
If Not Form.ActiveControl Is Nothing Then ' 2012-09-25 - Jaron
CurTabIndex = Form.ActiveControl.TabIndex
End If
' Find the control with the next smallest Tab Index
NextControl = -1
NextTabIndex = -1
For c = 0 To Settings.ControlCount - 1
' With Settings.Controls(c) ' 2007-05-07
If Settings.Controls(c).TabIndex >= NextTabIndex And Settings.Controls(c).TabIndex < CurTabIndex Then
If Settings.Controls(c).Control.Visible And Settings.Controls(c).Control.Enabled Then
NextControl = c
NextTabIndex = Settings.Controls(c).TabIndex
End If
End If
' End With
Next c
' Set focus to the next control
If NextControl >= 0 Then
' With Settings.Controls(NextControl).Control ' 2007-05-07
'Debug.Print " Set Focus to " & Settings.Controls(NextControl).Control.Name
SetFocusSafe Settings.Controls(NextControl).Control ' 2007-06-05
DoEvents
' End With
End If
Exit Sub
E:
Debug.Print " " & Err.Description
End Sub
Public Sub TabRight()
Call FunctionTagger("cTabStop", "TabRight")
On Error GoTo E
Dim CurTabIndex As Long
Dim NextControl As Long
Dim NextTabIndex As Long
Dim c As Long
' Get the Tab Index of the currently active control
If Not Form.ActiveControl Is Nothing Then ' 2012-09-25 - Jaron
CurTabIndex = Form.ActiveControl.TabIndex
End If
' Find the control with the next largest Tab Index
NextControl = -1
NextTabIndex = 999999999
For c = 0 To Settings.ControlCount - 1
' With Settings.Controls(c) ' 2007-05-07
If Settings.Controls(c).TabIndex <= NextTabIndex And Settings.Controls(c).TabIndex > CurTabIndex Then
If Settings.Controls(c).Control.Visible And Settings.Controls(c).Control.Enabled Then
NextControl = c
NextTabIndex = Settings.Controls(c).TabIndex
End If
End If
' End With
Next c
' Set focus to the next control
If NextControl >= 0 Then
' With Settings.Controls(NextControl).Control ' 2007-05-07
'Debug.Print " Set Focus to " & Settings.Controls(NextControl).Control.Name
SetFocusSafe Settings.Controls(NextControl).Control ' 2007-06-05
DoEvents
' End With
End If
Exit Sub
E:
Debug.Print " " & Err.Description
End Sub
' ------------------------------------------------------------------------------
Private Sub SetFocusSafe(ByRef Control As Control)
On Error GoTo E
Control.SetFocus
Exit Sub
E:
End Sub
Private Sub FunctionTagger(ByVal sModule As String, ByVal sFunction As String)
Debug.Print " " & Time$ & " " & sModule & "." & sFunction
End Sub
' ------------------------------------------------------------------------------
' ------------------------------------------------------------------------------