【问题标题】:VBA Using Global Variables to open Multiple instances of a form in Access 2010VBA 使用全局变量在 Access 2010 中打开表单的多个实例
【发布时间】:2018-08-25 18:14:18
【问题描述】:

我有一个表格Cases 和显示我看过的患者的会议日期。我正在尝试创建一种方法,通过该方法我可以双击任何客户的名称,它会打开一个更详细的不同表单。我希望能够对多个患者执行此操作,例如,我可以为我今天要见的客户选择并打开更详细的表格。

显示摘要详细信息的表单称为CaseAndSessionDetail,更详细的表单称为ClientDetails

我正在使用在 windows 8.1 下运行的 Ms-Access 2010

我已经编写/复制了一个模块,我认为它应该通过使用全局变量来创建表单集合来做我想做的事情:

Option Explicit

'This holds the collection of forms as they are created
Global mcolFormInstances As New Collection

Function OpenFormInstance(FormName As String, WhereCondition As String)
    'Declare for name
    Dim frm As form

    Select Case FormName
    Case "ClientDetails"
        Set frm = New Form_ClientDetails
    Case Else
        Debug.Assert False
    End Select
    If WhereCondition <> "" Then
        frm.Filter = WhereCondition
        frm.FilterOn = True
    End If
    ''make the form visible
    frm.Visible = True
    'Need to add a reference to the form so that it does not
    'immediately close when the for variable goes out of scope
    mcolFormInstances.Add (frm)
End Function

如果您在最后一行 mcolFormInstances.Add(frm) 设置断点,该功能将起作用并选择并打开/显示正确的客户端详细信息表单。如果没有断点,表单将再次关闭(我怀疑是因为函数结束后变量超出了范围。

作为参考,该函数由"CaseAndSessionDetail"形式的宏调用

If Not ISNull([Screen].[ActiveControl] Then 
    Function OpenForm("frmContactDetails" = '"& Ltrim([Screen].[ActiveControl]) & "'") 
EndIF

我怀疑我没有正确地将集合对象声明为全局变量。我尝试使用PublicGlobal 在单独的模块中以两种形式声明它,但尚未成功。

我意识到我可能忽略了一些非常简单的事情,但欢迎任何帮助

【问题讨论】:

  • 尝试从mcolFormInstances.Add (frm) 中删除括号。您正在强制 frm 传递 ByVal 而不是 ByRef
  • 那行得通,我现在可以打开多个表单了。

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


【解决方案1】:

您的问题只是这一行的一个晦涩的语法错误:

mcolFormInstances.Add (frm)

参数frm 周围的括号不是 围绕参数列表 - 这就是 VBE 在 .Add(frm) 之间插入空格的原因当您尝试键入mcolFormInstances.Add(frm) 时。这些在语义上是完全不同的。 VBA 语言规范的第 5.6.6 节描述了在此上下文中用括号括起来的表达式:

5.6.6 带括号的表达式

带括号的表达式由括在 括号。

静态语义。带括号的表达式被归类为值 表达式,并且封闭的表达式必须能够被评估为 简单的数据值。带括号的表达式的声明类型是 括起来的表达式。

 parenthesized-expression = "(" expression ")"

运行时语义。带括号的表达式计算为简单 其封闭表达式的数据值。 a的值类型 括号内的表达式是被括起来的表达式。

这意味着您将运行时表达式frm 评估为一个简单的数据类型,并将那个 存储在您的Collection 中。无论该值实际上是什么(我必须检查评估树以找出它的评估结果),您不会增加 @ 上的引用计数987654329@,这允许它超出范围并在OpenFormInstance 退出时被释放。

【讨论】:

    猜你喜欢
    • 2016-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-04
    • 1970-01-01
    相关资源
    最近更新 更多