设计 ActiveX 文档需要不同的思路。不仅没有 QueryUnload 和类似的事件,而且还不知道 ActiveX 文档何时被调用:在普通的应用程序中,可以使用户在三个窗体之间移动到达应用程序的特定点,但是,如果那些窗体是 ActiveX 文档,则用户可以把最后一个放置到 Favorites 列表中,然后在一周之后再返回,而不需要通过中介窗体!该主题将解释如何控制这种行为。
确定用户是进入 ActiveX 文档(例如,从 Favorites 列表),还是读已知的 ActiveX 文档,关键在于建立某种类型的信令系统。已知的 ActiveX 文档必须有某种方法向同组的另一个 ActiveX 文档说明自己,当第二个文档接收到那个信号时,它能够继续进行。
建立信号的一种方法是使用全局变量。已知文档设置了全局变量后,第二个文档可用 Is Nothing 语句来检测到它。例如,假设全局变量是在苏格拉底和柏拉图之间传递的信封。每当苏格拉底想要发送消息给柏拉图时,他就把该消息放到信封内,然后把它放到柏拉图总经过的基架上。当柏拉图经过该基架时,总捡起该信封,打开它,并检查苏格拉底发来的消息。如果有消息,柏拉图就执行指示,否则,继续走他的路。
要实现它,需要三个“演员”:
为了创建全局变量,必须首先在代码模块 (Module1) 中声明它:
Public gEnvelope As UserDocument1
现在,假设 UserDocument1 上有一个按钮名叫 "cmdGoPlato"。它的代码是:
Private Sub cmdGoPlato_Click() Set gEnvelope = Me '
装填信封。Hyperlink.NavigateTo "c:\pedestal\UserDocument2"
End Sub
现在舞台已经设置好了。当用户单击按钮时,“信封”就装填好了,然后,用 Hyperlink 对象把它发给 UserDocument2。
UserDocument2 在 Show 事件中有代码来检查该信封。它首先检查全局变量是否没有被设置为 Nothing。如果没有设置为 Nothing,则“信封”已装填好,代码就可以运行了,否则,它显示一条消息,要求用户打开 UserDocument1 并单击“Go Plato”按钮。
Private Sub UserDocument_Show() If Not gEnvelope Is Nothing Then'
正常处理。'
用对象引用等来设置属性。'
非常重要!把该变量设置为Nothing
。'
否则,该对象引用将使该对象保持存在!Set gEnvelope = Nothing
Else
MsgBox "Sorry, please open UserDocument1 first."
'
如果觉得这样做非常有必要,'
则可以把用户超链接到苏格拉底:Hyperlink.NavigateTo _
"c:\pedestal\UserDocument1.vbd"
End If
End Sub
可能已经注意到,在第一个文档超链接到第二个文档后,前面的代码把对象引用设置为 Nothing。把所有这种全局对象引用设置为 Nothing 是很重要的。因为只要对象存在,它就继续使用资源和内存。关于该问题的详细讨论可在《Visual Basic 程序员指南》的“用对象编程”中的“对象引用和引用计数”中找到。