如何检查Access 2010表单的实例是否仍处于打开状态?

时间:2011-12-02 10:28:45

标签: ms-access vba access-vba ms-access-2010

前言

我需要创建一个搜索表单的多个副本(在 Access 2010 中),它会向调用返回一个值(也就是创建表单实例的表单)。 / p>

如上所述,这些表单可以并且将同时运行多个副本,例如用户可能希望将公司添加到某些内容中,以便他们:

  • 点击“选择公司”并打开公司搜索屏幕的实例
  • 然后打开公司编辑器(原始公司搜索/选择屏幕保持打开状态),因为他们发现公司有一家尚未添加的母公司。
  • 然后,他们点击“选择父母公司”按钮,打开另一个搜索实例并选择屏幕
  • 他们找到了母公司
  • 选择它关闭第二个搜索屏幕,并将母公司添加到第一个公司。
  • 用户然后使用原始搜索屏幕选择修改后的公司,该屏幕再次关闭原始搜索屏幕并将所选公司返回到他们最初初始化第一次搜索的形式...

这一切都允许用户在发现错误时更新和更正数据,从而减少他们忘记错误的可能性并使其更快!

现在大部分情况都很好,但是我遇到了很多问题,表单的实例无法作为“acDialog”打开,因此在搜索完成之前停止调用代码运行(请参阅this question更多信息)和我已经解决的解决方案是通过使用无限循环模拟调用代码的暂停,并检查搜索屏幕瞬间是否仍然可见。然后,当用户在搜索屏幕上立即选择某些内容时,它将该值放入搜索屏幕中的隐藏字段中并隐藏它的自身(未关闭)。然后调用函数看到它隐藏了从隐藏字段中获取值并卸载瞬间。

问题

我可以使用FormInstant.Visable隐藏表单是否隐藏但是如果用户关闭表单会导致错误,而我通常用来检查表单是否存在的代码需要表单名称因为它是表格的瞬间,所有表格都有相同的名字!我确实有一个对表单的引用,因为它存储在本地“表单”对象中......我通常使用的代码是:

CurrentProject.AllForms("FormName").IsLoaded

那么如何检查表格的即时加载?

4 个答案:

答案 0 :(得分:0)

LOL我刚刚在重新阅读我的消息时意识到,如果表单是打开的话我可能会错误地解决错误!

我已经快速写了这个,似乎工作正常:

Public Function IsFormLoaded(ByRef FormToTest As Form, _
                            Optional ByRef bIsVisable As Boolean = False) As Boolean
    Dim lErrorNum As Long
    bIsVisable = False
    On Error Resume Next
        bIsVisable = NewFormClone.Visible
        lErrorNum = Err.Number
    On Error GoTo 0

    If (lErrorNum = 0) Then
        IsFormLoaded = True
    Else
        IsFormLoaded = False
    End If
End Function

猜猜只要问题得到解答并且下一个人/ gal可以使用它就不会真正回答问题!:)

我会稍微公开一下如果没有人找到更好的答案,我会将其标记为......

答案 1 :(得分:0)

我喜欢你的回答。至于循环/等待的想法?更好的方法是始终在每个表单中包含引用。我实际上声明了名为frmPrevious的表单模块变量。

Create instance of form
Instance.frmPrevious = me

所以现在我们在窗体关闭时使用“调用”代码来代替一些“可见”+循环代码设置。

所以在我们的表格的密切代码中:

frmPrevious.FunctionCodeToRun

上面解决了很多问题,但是一个是你不需要对话框(你注意到它不能使用)而且你还需要从调用代码中编写“循环+等待”代码。

但这意味着您的代码会在调用表单中的新函数中继续。因此,我通常将该函数放在调用表单中的调用代码下面。我也倾向于使用该功能的标准名称。我觉得这个交易是值得的,而不是循环/等待并继续在相同的代码例程中(我同意这在代码中的“继续”通常是可取的,但是然后再次编写循环和等待代码并不是真的那么干净)

答案 2 :(得分:0)

一个老问题,但这里有经验告诉我:如果一个,两个...... FormDefn实例打开然后用户关闭一个(Master是唯一可以设计的),Forms(FormName)给出错误,表格(表格)给出错误的对象, 但Forms(NumberIndex)仍然存在.Name = FormName!

OpenForm创建Forms(FormName)对象。关闭后,Forms(FormName)会出错。任何“Set xForm = New Form_xxx”都会在表单集合中创建只能通过集合号索引访问的表单,并且不能设计。

因此,稍后找到一个多实例表单使用类似:

Dim FormIdx     As Integer
Dim lForm       As Access.Form
For FormIdx = 0 To Application.Forms.Count - 1
    Set lForm = AccessFunc.Appl.Forms(FormIdx)
    If lForm.Name = pFormName Then
        IsFormOpened = True
        Set rForm = lForm
        GoTo IsFormOpened_Exit
    End If
Next

答案 3 :(得分:0)

试试这个

Function IsLoaded(strFrmName As String) As Boolean

    '  Determines if a form is loaded.

    Const conFormDesign = 0
    Dim intX As Integer

    IsLoaded = False
    For intX = 0 To Forms.Count - 1
        If Forms(intX).FormName = strFrmName Then
            If Forms(intX).CurrentView <> conFormDesign Then
                IsLoaded = True
                Exit Function  ' Quit function once form has been found.
            End If
        End If
    Next

End Function

您可以在项目中调用上述功能,如此

If Not isLoaded("MyForm") Then
 MsgBox "MyForm is Not Loaded"
End If