该代码用于表单上的切换按钮布局,使用此代码,您可以将多个切换按钮设置为可见,并具有多个子菜单,这些子菜单在不使用时将保持隐藏状态。 我的主菜单是用此代码设置的,我将其设置为第一个按钮的方式是我的搜索切换按钮无子菜单(这防止在第一次打开表单时显示子菜单)TabIndex设置为0(我喜欢使用键盘)第二个切换按钮称为“表单”,表单切换按钮具有我要显示的表单的子菜单按钮。 TabIndex有时可能会使顺序井井有条,但很妙的是,在此窗体的“设计”视图中,您可以将按钮放置在所需的任何位置,并且它们在被调用时会自行定位。 我喜欢将标签索引结构化,搜索按钮将为0,表单按钮将为1,第一个子菜单按钮将为2,下一个子菜单= 3继续,直到所有子菜单按钮都有其索引,然后返回菜单下一个主按钮。
我将以下内容放在我保留的大多数表单代码模块中。 您可能需要将粗体语句重命名为TabIndex = 0控件
Option Compare Database
Option Explicit
Public myDetVal As Integer
Public XVal As Integer
Public myX As Integer
Public myY As Integer
Public Sub FocusYN(frm As Form, Optional strCtlName As String)
Dim ctl As Control
Dim GrpInt As Integer, i As Integer, cnt As Integer, myInt As Integer, inInt As Integer
Dim GrpNme() As Variant, GrpOrd() As Variant
Dim FndIt As Boolean
On Error GoTo FocusYNErr
If strCtlName <> "Detail" Then
If frm(strCtlName).Tag <> "" Then
GrpInt = Right(frm(strCtlName).Tag, 1)
frm(strCtlName).Value = 1
Else
frm(strCtlName).Value = 0
End If
frm(strCtlName).SetFocus
myDetVal = 0
Else
frm!Search.SetFocus
End If
ReDim Preserve GrpOrd(myInt)
For Each ctl In frm.Controls
If ctl.ControlType = 122 Then 'also known as ControlType acToggleButton
If strCtlName = "Detail" Then frm(ctl.Name).Value = 0
If GrpInt = Right(frm(ctl.Name).Tag, 1) And Left(frm(ctl.Name).Tag, 1) <> "V" Then
If ctl.Name <> strCtlName Then
inInt = InStr(frm(ctl.Name).Tag, ";")
If Left(frm(ctl.Name).Tag, inInt - 1) - 1 > myInt Then
myInt = Left(frm(ctl.Name).Tag, inInt - 1) - 1
ReDim Preserve GrpOrd(myInt)
End If
GrpOrd(Left(frm(ctl.Name).Tag, inInt - 1) - 1) = ctl.Name
End If
Else
If ctl.Name <> strCtlName And frm(ctl.Name).Value <> 0 Then
frm(ctl.Name).Value = 0
End If
If frm(ctl.Name).Tag <> "" And Not frm(ctl.Name).Tag Like "V*" Then
frm(ctl.Name).Visible = False
End If
End If
End If
Next
For i = 0 To UBound(GrpOrd)
Set ctl = frm(GrpOrd(i))
If ctl.ControlType = 122 And strCtlName <> "DETAIL" Then 'also known as ControlType acToggleButton
Select Case i
Case 0
ctl.Top = frm(strCtlName).Top
ctl.Left = frm(strCtlName).Left + frm(strCtlName).Width
Case 1 To 6
ctl.Top = frm(GrpOrd(i - 1)).Top + frm(GrpOrd(i - 1)).Height
ctl.Left = frm(strCtlName).Left + frm(strCtlName).Width
Case 7
ctl.Top = frm(strCtlName).Top
ctl.Left = ((frm(strCtlName).Left + frm(strCtlName).Width) + frm(strCtlName).Width)
Case 8 To 13
ctl.Top = frm(GrpOrd(i - 1)).Top + frm(GrpOrd(i - 1)).Height
ctl.Left = ((frm(strCtlName).Left + frm(strCtlName).Width) + frm(strCtlName).Width)
Case 14
ctl.Top = frm(strCtlName).Top
ctl.Left = (((frm(strCtlName).Left + frm(strCtlName).Width) + frm(strCtlName).Width) + frm(strCtlName).Width)
Case 15 To 20
ctl.Top = frm(GrpOrd(i - 1)).Top + frm(GrpOrd(i - 1)).Height
ctl.Left = (((frm(strCtlName).Left + frm(strCtlName).Width) + frm(strCtlName).Width) + frm(strCtlName).Width)
Case Else
MsgBox "Check your controls or your code there appears to be more buttons than 3 rows of 7 in each!"
End Select
frm(GrpOrd(i)).Visible = True
End If
SkipIt:
Next
Set ctl = Nothing
FocusYNExit:
Exit Sub
FocusYNErr:
If Err.Number = 2100 Then
MsgBox "Your form is too small to show all of the buttons!"
Exit Sub
ElseIf Err.Number <> 0 Then
MsgBox Err.Number & " " & Err.Description
End If
End Sub
要有效显示和隐藏按钮,您需要在主按钮的标签属性中放置一个值,该值将控制按钮的显示或隐藏。 对于示例1,我的菜单表单上的主按钮称为“表单”,它具有标签属性= VGrp1(V始终可见,我也使用字母Grp来中继它属于哪个组)。 此“表单”按钮的子菜单按钮应具有标签属性,该属性应按您希望它们显示的顺序的数字开头,从顶部开始一直向下移动,然后向右并以半冒号分隔,它们应在编号中以1开头。您希望它们列出的顺序,例如“添加发票”按钮具有标签属性= 1; Grp1,下面的下一个按钮具有标签属性= 2; Grp1(同一组的按钮2)! 菜单下一个主按钮将带有VGpr2标签,子菜单按钮将带有1; Grp2,2; Grp2等标签。最多21个按钮,每行3行,共7行。
现在,对于表单模块中的其余代码:
Option Compare Database
Option Explicit
Private Sub Form_Load()
myDetVal = 0
XVal = 1
myX = 1
Detail_MouseMove 1, 0, 1, 1
End Sub
Private Sub Detail_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
If myDetVal = 0 Then
If XVal = 0 Then
myX = X
myY = Y
XVal = 1
Else
If myY > 0 Then
If myY - Y > 100 Or myY - Y < -100 Then
FocusYN Me, "Detail"
myDetVal = 1
End If
End If
If myX > 0 Then
If myX - X > 100 Or myX - X < -100 Then
FocusYN Me, "Detail"
myDetVal = 1
End If
End If
End If
End If
End Sub
Private Sub Search_GotFocus()
Detail_MouseMove 1, 0, 1, 1
End Sub
Private Sub Search_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Detail_MouseMove 1, 0, 1, 1
End Sub
Private Sub Toggle1_GotFocus()
If Me!Toggle1 = 0 Then
FocusYN Me, "Toggle1"
End If
End Sub
Private Sub Toggle1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Me!Toggle1 = 0 Then
Me!Toggle1.SetFocus
FocusYN Me, "Toggle1"
End If
End Sub
Private Sub Toggle3_GotFocus()
If Me!Toggle3 = 0 Then
FocusYN Me, "Toggle3"
End If
End Sub
Private Sub Toggle3_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Me!Toggle3 = 0 Then
Me!Toggle3.SetFocus
FocusYN Me, "Toggle3"
End If
End Sub
From: https://bytes.com/topic/access/insights/621840-hide-display-submenu-buttons