11

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

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

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

4

7 回答 7

27

这通常发生在开发过程中,当表单已经打开(例如在编辑模式下)并且您调用 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
于 2008-11-03T15:28:10.943 回答
8

我刚遇到这个问题。Arg字符串没有通过,因为报告已经打开,但不可见。当代码与Null string error.

解决方案是在即时窗口中关闭报告,使用

Docmd.Close acReport, "myReport"

它修复了我的错误,并且参数被正确传递。

于 2012-10-14T04:01:00.903 回答
3

这个“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 
于 2008-11-03T14:28:45.710 回答
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。


如果它是模态表单,则应明确检查它是否已打开并在打开之前将其关闭。这是一个常见的问题。

当然,所有表单都可以这样做,而不仅仅是模态表单,然后您就不需要 null 检查(前提是您永远不会将 null 传递给它)。但是往往一个项目中的表单很多,而且OpenForm调用比表单还要多……

于 2017-09-07T07:01:33.077 回答
0

值是否取自用户完成的控件?您是否确保在运行 openform 行之前将焦点从控件移开?

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

于 2008-11-03T13:04:35.367 回答
0

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

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

在尝试使用 OpenArgs 值之前,我通过中断来检查这一点,它为空。但是当我删除中断时,程序没有显示错误。这只能在开发时发生。

于 2008-11-03T13:10:51.780 回答
0

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

于 2009-05-02T06:36:12.990 回答