我有两个模态用户表单,frmA和frmB。我想平铺表格,当我移动顶部表格时,我希望另一个表格跟随它,保持在平铺位置,好像它们被绑在一起。
FrmA有一个打开frmB的按钮。 当frmB打开时,它处于活动状态,用户与之交互,而frmA可见,但用户无法移动或访问。这都是预期的。
'This is part of the frmA command button to open frmB
'Load, Initialize and Show form B. Send coordinates of form A
Set formB = New frmB
Load formB
Dim iA_Left As Integer
Dim iA_Top As Integer
iA_Left = Me.Left
iA_Top = Me.Top
' Initialize formB and pass current position of formA byRef (used by activate event)
If Not formB.bInitialize(vbFalse, , , iA_Top, iA_Left) Then Err.Raise glHANDLED_ERROR
If iA_Top <> -1 Then
miA_Top = iA_Top
End If
If iA_Left <> -1 Then
miA_Left = iA_Left
End If
formB.Show
我已经想出如何使用userform Activate事件来平滑frmB over frmA(稍微向下和向右)。然后当frmB关闭时,我将frmA的原始左侧和顶部传回,以便在重新初始化后,它将显示在其原始位置。
' This is from frmB Activate event
' The variables miA_Left and miA_Top are set in Initialize event via optional variables
' passed from the code above.
Private Sub UserForm_Activate()
On Error Resume Next
If miA_Left <> -1 Then
Me.Left = miA_Left + 15
End If
If miA_Top <> -1 Then
Me.Top = miA_Top + 15
Else
Me.Top = Round((Application.Top + Application.Height) / 2 - Me.Height / 2, 0)
End If
End Sub
' This is from frmB Layout Event
Private Sub UserForm_Layout()
Debug.Print "Layout Left " & Me.Left
If miA_Left <> -1 And miA_Top <> -1 Then ' In this case, it's true and proceeds to next line
frmA.Left = Me.Left - 10
frmA.Top = Me.Top - 10
End If
End Sub
当我调试Layout事件时,在第一次分配之前我将光标放在frmA.Top上并且它说“对象变量未设置”但是它继续将数字分配给frmA.Left而没有错误。但是,它不会改变frmA的位置。表单类的名称实际上是frmA,但是当我创建一个变量来生成表单时,我使用了
Dim formA as frmA
Set formA = New frmA
但是,formA不在frmB的范围内,所以我认为我不能引用该变量。
我需要做的是当用户拖动frmB时,我希望frmA跟随它,保持平铺。当frmB处于活动状态时,我无法弄清楚如何改变.Top和.Left of frmA。我在frmB的Activate和Layout事件中尝试了各种语句,但我不确定如何直接从frmB访问frmA。
谢谢!
答案 0 :(得分:1)
您可以使用表单B的Layout
事件来更改表单A的位置。
类似的东西(假设形式A称为frmA
)
Private Sub UserForm_Layout()
frmA.Top = Me.Top - 15
frmA.Left = Me.Left - 15
End Sub
更新'正常'使用表单
正如您在评论中暗示的那样,当您想要显示多个实例时,使用表单实例非常有用。 “正常”方法只是引用基本表单类名本身
例如,如果我们有两个表单:frmA
和frmB
,frmA
包含一个命令按钮而frmB
不包含任何控件,我们可以按如下方式演示平铺代码(下面的代码)是所提到的模块的全部内容)
' Code in a standard Module, to show frmA
Option Explicit
Sub Demo()
frmA.Show vbModal
End Sub
' Code in frmA
Option Explicit
Private Sub CommandButton1_Click()
frmB.Show vbModal
End Sub
' Code in frmB
Option Explicit
Private Sub UserForm_Activate()
frmB.Top = Me.Top + 15
frmB.Left = Me.Left + 15
End Sub
Private Sub UserForm_Layout()
frmA.Top = Me.Top - 15
frmA.Left = Me.Left - 15
End Sub