【问题标题】:Setting the location of a form in access vba在access vba中设置表单的位置
【发布时间】:2015-12-11 02:09:03
【问题描述】:

我正在开发一个具有多个嵌套表单的 Access 应用程序,用户单击这些表单以执行特定任务,例如输入新数据、搜索数据、打印报告等。

目前我每个表单都设置了自动居中。我希望用户能够移动主表单,然后在主表单之上打开所有其他表单。表单通常以对话框的形式打开。

我刚刚添加了允许后续表单在与主表单相同的位置打开的代码。主要表单的代码如下所示:

Private Sub File_Maint_Click()
Dim ObjName As String
FrmWinTop = Forms![Main Form].WindowTop
FrmWinLeft = Forms![Main Form].WindowLeft

ObjName = "File Maintenance Form"
If IsSuper Then DoCmd.OpenForm ObjName
If Not IsSuper Then DoCmd.OpenForm ObjName, acNormal, , , , acDialog

End Sub

每个后续表单都有这样的代码:

Private Sub Form_Open(Cancel As Integer)

    Me.Move FrmWinLeft, FrmWinTop

End Sub

这很好用,除了 - 在正常操作中,我通过打开主窗体的代码最小化了 Access 窗口,然后主窗体的顶部和左侧是一些模糊的数字,这样当后续窗体打开时不可见。如果 Access 窗口可见,则代码可以正常工作。

据我所知,显然我的方法不适用于最小化 Access 窗口并且只显示对话框表单。当应用程序运行时,是否有其他方法可以隐藏 Access 窗口以允许正确定位表单?或者是否有不同的方法在屏幕上定位表单,以便每个后续表单都覆盖打开它的前一个表单?

非常感谢您阅读我的问题,并提供您可能有的任何想法。

【问题讨论】:

    标签: forms ms-access vba ms-access-2007


    【解决方案1】:

    将这些变量作为全局/公共变量移动到模块中:

    Public FrmWinTop  As Long
    Public FrmWinLeft As Long
    

    然后使用主窗体的 OnActivate 事件设置它们:

    FrmWinTop = Me.WindowTop
    FrmWinLeft = Me.WindowLeft
    

    【讨论】:

    • 是的,对不起,我应该注意到变量在单独的模块中是公共的。当用户单击按钮打开后续表单时设置变量。如果我使用 OnActivate 事件设置它们,并且用户移动表单,我担心当新表单打开时他们不会有当前的表单位置。
    • 感谢您的建议。正如我所说,代码似乎可以工作,除非主 Access 窗口被最小化,然后位置值似乎不起作用。
    • 然后你做一个检查,只有当表单的 Top/Left 值在一些合理的值范围内时才设置变量。
    【解决方案2】:

    我在以下位置找到了以下代码 http://www.access-programmers.co.uk/forums/showthread.php?t=218554:

    Function fSetAccessWindow(nCmdShow As Long)
    
    Dim loX As Long
    Dim loForm As Form
    On Error Resume Next
    Set loForm = Screen.ActiveForm
    
        If Err <> 0 Then
            loX = apiShowWindow(hWndAccessApp, nCmdShow)
            Err.Clear
        End If
    
        If nCmdShow = SW_SHOWMINIMIZED And loForm.Modal = True Then
            MsgBox "Cannot minimize Access with " _
            & (loForm.Caption + " ") _
            & "form on screen"
        ElseIf nCmdShow = SW_HIDE And loForm.PopUp <> True Then
            MsgBox "Cannot hide Access with " _
            & (loForm.Caption + " ") _
            & "form on screen"
        Else
            loX = apiShowWindow(hWndAccessApp, nCmdShow)
        End If
        fSetAccessWindow = (loX <> 0)
    
    End Function
    

    如果我使用此方法隐藏主 Access 窗口而不是将其设置为最小化,则位置值似乎可以正常工作。我想我应该在发布问题之前多看看周围。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-23
      • 2014-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多