我在使用时使用OpenArgs
参数发送值DoCmd.OpenForm
:
DoCmd.OpenForm "frmSetOther", acNormal, , , acFormAdd, acDialog, "value"
然后我Me.OpenArgs
在打开的表单中使用来获取value。它有时会发送Null值而不是原始字符串。怎么了?
这通常发生在开发过程中,当表单已经打开(例如在编辑模式下)并且您调用 docmd.OpenForm 函数时。在这种情况下,表单被置于正常(查看)模式并引发 OnOpen 和 OnLoad 事件,但无论您传递给 docmd.OpenForm 什么,OpenArgs 属性都设置为 null。
解决方案显然是在使用 docmd.OpenForm 调用它之前关闭表单。但是有一个我喜欢使用的解决方法。在 OnOpen 事件中,我检查 me.OpenArgs 是否为空,如果是,我将其替换为一些调试值。
if not isnull(me.OpenArgs) then
myvalue = me.OpenArgs
else
msgbox "Debug mode"
myValue = "foo"
endif
我刚遇到这个问题。Arg
字符串没有通过,因为报告已经打开,但不可见。当代码与Null string error
.
解决方案是在即时窗口中关闭报告,使用
Docmd.Close acReport, "myReport"
它修复了我的错误,并且参数被正确传递。
这个“openArgs”参数的一个非常有趣的替代方法是使用 currentProject.allforms("myFormName") 对象的 .properties 集合。当您需要将值传递给表单时(例如从另一个控件或另一个表单继承的过滤器),只需为您的表单添加相应的属性,并将您的值添加到此属性中。
例子:
addPropertyToForm "formFilter","Tbl_myTable.myField LIKE 'A*'",myFormName
被调用的函数将尝试更新对象的“formFilter”属性的值。如果该属性不存在(引发 err 2455),它将作为新属性添加到错误管理代码中。
Function addPropertyToForm(_
x_propertyName as string, _
x_value As Variant, _
x_formName As String)
As Boolean
On Error GoTo errManager
CurrentProject.AllForms(x_formName).Properties(x_propertyName).Value = x_value
addPropertyToForm = True
On Error GoTo 0
Exit Function
errManager:
If Err.Number = 2455 Then
CurrentProject.AllForms(x_formName).Properties.Add x_propertyName, Nz(x_value)
Resume Next
Else
msgbox err.number & ". The property " & x_propertyName & "was not created"
End If
End Function
可能是您已经打开了表单(如建议的那样),但只需检查 null 并且表单也会处理缺少参数的打开。
如果参数不重要,这将允许打开表单以快速查看(由您或用户)。
Private Sub Form_Open(Cancel As Integer)
If Not IsNull(Me.OpenArgs) Then
Me.lblHeading.Caption = Me.OpenArgs
End If
End Sub
通过省略 OpenForm 调用中的值或双击 Access Objects 侧栏中的表单,可以将空值传递给 OpenArgs。
如果它是模态表单,则应明确检查它是否已打开并在打开之前将其关闭。这是一个常见的问题。
当然,所有表单都可以这样做,而不仅仅是模态表单,然后您就不需要 null 检查(前提是您永远不会将 null 传递给它)。但是往往一个项目中的表单很多,而且OpenForm调用比表单还要多……
值是否取自用户完成的控件?您是否确保在运行 openform 行之前将焦点从控件移开?
编辑:控件的 value 属性将等于以前的值,它可能为 null,除非你这样做。
我想我找到了问题的答案:
根据我的经验,必须在打开表单后立即处理 OpenArgs。(关联)
在尝试使用 OpenArgs 值之前,我通过中断来检查这一点,它为空。但是当我删除中断时,程序没有显示错误。这只能在开发时发生。
在这里回答。即使在设计模式下,您的表单也可能已经打开: http ://www.tech-archive.net/Archive/Access/microsoft.public.access.formscoding/2007-02/msg00928.html