我使用OpenArgs
参数在使用DoCmd.OpenForm
时发送值:
DoCmd.OpenForm "frmSetOther", acNormal, , , acFormAdd, acDialog, "value"
然后我在打开的表单中使用Me.OpenArgs
来获取 值 。它有时会发送 Null 值而不是原始字符串。有什么问题?
答案 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