考虑以下示例。 preferencesDoc作为空值传入。它在此函数中的赋值被忽略,并且在集合之后它保持不变。 tmpDoc设置得很好。两个作业都是相同的,因此它不是视图问题。 preferenceDoc的赋值被阻止,显然是因为它是一个参数。没有错误,并且按键查找工作正常,这可以通过成功分配tmpDoc来证明。
Function test(preferencesDoc As NotesDocument)
If preferencesDoc Is Nothing then
Set preferencesDoc=docLookupView.getDocumentByKey("GENERAL_PREFERENCES", True)
End if
Dim tmpDoc As NotesDocument
Set tmpDoc=docLookupView.getDocumentByKey("GENERAL_PREFERENCES", True)
End Function
有人可以解释这里发生了什么以及如何解决这个问题吗?
澄清。
很高兴看到人们在想法中掏钱。但是,你必须意识到这个功能只是为了说明我的问题。这是一个简单的方法,可以帮助我沟通问题,而不是我的真实代码的一部分。请留意这个问题。
同样,如果将preferencesDoc作为空传入,则完全忽略函数中的“修复”赋值。 Tode似乎在做点什么。当我传入设置的preferenceDoc时,我可以将其重新分配给不同的doc。
答案
call test(Nothing) // will not work
---
Dim doc as NotesDocument
call test(doc) // will work
来自Tode的关键语句:如果您将“Nothing”作为参数传递,那么它将保持不变。如果您传递未初始化的NotesDocument,那么它将被初始化。
Tode和Knut都很重要,我认为Rich暗示同样的事情。谢谢。我相信克努特是第一个,所以我会赞美他。
我在Notes编写的所有年份,这是我第一次遇到这个问题。每天学习一些东西。 :)
答案 0 :(得分:1)
这在LotusScript中是正常的。如果你传入“nothing”,那么这不是NotesDocument类型的Object,而只是“Nothing”......并且没有任何东西不能赋值。
但是你已经做了正确的事:使用一个函数。
你可以这样调用这个函数:
Set preferenceDoc = test(preferenceDoc)
是对的。但是你忘了送回一份文件。你的功能应如下所示:
Function test(preferenceDoc as NotesDocument) As NotesDocument
Dim docTemp as NoresDocument
If preferenceDoc is Nothing then
Set docTemp = docLkpView.GetDocumentBykey( "GENERAL_PREFERENCES", True )
Else
Set docTemp = preferenceDoc
End If
' here comes the "magic"
Set test=docTemp
End Function
当然你可以完全取出docTemp,只需用相应行中的函数名替换docTemp,那么你就不需要最后一行......
答案 1 :(得分:1)
您的代码确实有效。只需使用Call test(doc)
调用您的函数即可使用
Dim doc As NotesDocument
Call test(doc)
If doc Is Nothing Then
Print "Nothing"
Else
Print doc.form(0)
End If
获取首选项文档的一种更舒适的方法是不使用参数:
Function GeneralPreferences() As NotesDocument
Static preferencesDoc As NotesDocument
If preferencesDoc Is Nothing Then
' ... get your docLookupView
Set preferencesDoc=docLookupView.getDocumentByKey("GENERAL_PREFERENCES", True)
End If
Set GeneralPreferences = preferencesDoc
End Function
然后你可以使用这样的结果
Print GeneralPreferences.form(0)
Print GeneralPreferences.created
并且您不需要声明额外的NotesDocument。使用preferencesDoc的Static
,文档只从数据库中读取一次 - 它在函数中被“缓存”
答案 2 :(得分:0)
对象通过引用传递,因此您描述的行为肯定是奇怪的。但作为一种风格问题,我不建议无论如何都这样做。 Sode效应模糊了代码的逻辑。您的函数应声明为返回NotesDocument,并应通过
调用Set doc = test(doc)