OpenArgs是Null错误

时间:2008-11-03 12:59:57

标签: ms-access access-vba openform openargs

我使用OpenArgs参数在使用DoCmd.OpenForm时发送值:

DoCmd.OpenForm "frmSetOther", acNormal, , , acFormAdd, acDialog, "value"

然后我在打开的表单中使用Me.OpenArgs来获取 。它有时会发送 Null 值而不是原始字符串。有什么问题?

7 个答案:

答案 0 :(得分:23)

这通常发生在开发期间,表单已经被oppened(例如在编辑模式下),并且您调用了docmd.OpenForm函数。在这种情况下,表单处于正常(视图)模式,并引发OnOpen和OnLoad事件,但OpenArgs属性设置为null,而不是您传递给docmd.OpenForm的内容。

解决方案显然是在使用docmd.OpenForm调用它之前关闭表单。但是我想使用一种解决方法。在OnOpen事件中,我检查me.OpenArgs是否为null,如果是,我将其替换为一些调试值。

if not isnull(me.OpenArgs) then
   myvalue = me.OpenArgs
else
   msgbox "Debug mode"
   myValue = "foo"
endif

答案 1 :(得分:8)

我刚遇到这个问题。 Arg字符串未通过,因为报告已打开,但不可见。当代码与Null string error崩溃时,它一直处于打开状态。

解决方案是使用

在即时窗口关闭报告
Docmd.Close acReport, "myReport"

它修复了我的错误并且args正确传递了。

答案 2 :(得分:2)

这个“openArgs”参数的一个非常有趣的替代方法是使用currentProject.allforms(“myFormName”)对象的.properties集合。当您需要将值传递给表单(例如,从其他控件或其他表单继承的过滤器)时,只需为表单添加相应的属性,并将值添加到此属性。

示例:

addPropertyToForm "formFilter","Tbl_myTable.myField LIKE 'A*'",myFormName

被调用的函数将尝试更新对象的“formFilter”属性的值。如果该属性不存在(引发错误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 

答案 3 :(得分:1)

可能是你的表单已打开(如建议的那样),但只检查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。

如果是modal形式,您应该明确检查它是否打开并关闭它,然后再打开它。这是一个常见的问题。

当然可以对所有表单执行相同的操作,而不仅仅是模态表单,然后您不需要空检查(前提是您永远不会将null传递给它)。但是通常项目中有很多表单,甚至比表单更多的OpenForm调用......

答案 4 :(得分:0)

用户完成控制的值是否已经完成?在运行openform生产线之前,您是否确保从控件移开焦点?

编辑:控件的value属性将等于之前的值,除非你这样做,否则它可能为null。

答案 5 :(得分:0)

我想我找到了问题的答案:

  

根据我的经验,OpenArgs必须在打开表单后立即处理。 (link)

我通过在尝试使用OpenArgs值之前休息来检查这个,并且它是null。但当我删除休息时,程序显示没有错误。这必须在开发过程中发生。

答案 6 :(得分:0)

在这里回答。您的表单可能已经打开,即使在设计模式下: http://www.tech-archive.net/Archive/Access/microsoft.public.access.formscoding/2007-02/msg00928.html