UserDocument 对象的存活期

普通的 Visual Basic 窗体的存活期中有一些明显的关键事件,例如 Initialize、Load、QueryUnload 及 Unload。为了创建一个优良的应用程序,必须知道在窗体的生命周期中何时发生这些事件。

尽管 ActiveX 文档看起来与窗体十分类似,但它们有着不同的行为方式,这主要是因为 ActiveX 文档必须被其它的应用程序所包容。在编制 ActiveX 文档时,必须清醒地认识到 ActiveX 文档是“短命的”。当容器程序为 Web 浏览器(例如 Internet Explorer)时尤其如此。

UserDocument 对象生命周期中的关键事件包括:Initialize、InitProperties、Show、Hide 和 Terminate。下面将展示这些事件。

注意 本主题是创建示例 ActiveX 文档的步骤之一。如果要从头开始学习有关的内容,选择“创建 ActiveX 文档”主题。

要查看 FirstDoc UserDocument 对象的关键事件

  1. 在“工程资源管理器”窗口中双击“FirstDoc”,使它的设计器显示在桌面的最前面。

  2. 双击设计器,为 UserDocument 对象打开代码窗口。并在下列事件过程中输入代码:
    Private Sub UserDocument_Initialize()
    Debug.Print "Initialize"
    End Sub
    
    Private Sub UserDocument_InitProperties()
    Debug.Print "InitProperties" 
    End Sub
    
    Private Sub UserDocument_Show()
    Static intCount As Integer
    intCount = intCount + 1
    Debug.Print "Show " & intCount
    End Sub
    
    Private Sub UserDocument_Hide()
    Static intCount As Integer
    intCount = intCount + 1
    Debug.Print "Hide " & intCount
    End Sub
    
    Private Sub UserDocument_Terminate()
    Debug.Print "Terminate"
    End Sub
    
  3. 按 F5 键运行工程。

  4. 在 Internet Explorer 中,直接键入文件 FirstDoc.vbd 作为 URL,或单击“地址”文本框旁边的箭头,从下拉列表中选择 FirstDoc.vbd,然后浏览该 ActiveX 文档。

  5. 按 ALT+Tab 键使 Visual Basic 回到桌面的最前面。注意,这时在“立即”窗口中将有三个事件:Initialize、InitProperties 和 Show,它们被显示在窗口中。象 UserControl 对象一样,Intialize 事件先于 InitProperties 事件发生。

    注意 可以看到在 Show 的后面紧跟了一个 1,这表示 ActiveX 文档被 Internet Explorer 显示了一次。只要对该 ActiveX 文档的引用保留在 Internet Explorer 的高速缓存中,那么每当从另外的 URL 中定位至该文档,数字将加一。

  6. 按 ALT+Tab 键切换回 Internet Explorer。下面漫游到另一个 URL,这可以在“地址”文本框中输入合法的 URL 值,也可以使用下拉列表。不必考虑具体到达哪个 HTML 页。

  7. 在定位到新的 URL 之后,按 ALT+Tab 键切换回 Visual Basic。观察“立即”窗口,可以看到发生了 Hide 和 Terminate 事件。

  8. 按 ALT+Tab 键返回 Internet Explorer。单击“后退”,直至再一次看到 FirstDoc ActiveX 文档。

  9. 按 ALT+Tab 键切换回 Visual Basic。查看“立即”窗口,可以看到 Initialize、InitProperties 以及 Show 事件被触发。

Initialize 与 InitProperties 事件

Initialize 与 InitProperties 事件有一些相似的地方,但必须注意到它们之间存在的区别。简单地说,当 ActiveX 文档被加载时,总会触发 Initialize 事件,但是 InitProperties 事件仅在每次保存文档时被触发一次。在 Initialize 事件发生时,将触发 ReadProperties 和 WriteProperties 事件。请看下面的例子:

  1. 如果 Internet Explorer 仍在运行,则关闭它。

  2. 如果 ActXDoc 工程仍在运行,则停止它。为了触发 InitProperties 事件,这一步是必需的。

  3. 重新启动 ActXDoc 工程。

  4. 在 Internet Explorer 中,在“地址”文本框中输入 FirstDoc.vbd 文件的路径,或从 URL 的下拉列表中选择曾经用过的值。

  5. 在 TextBox (txtFirstDoc) 控件中输入一些文字。

  6. 关闭 Internet Explorer。应用程序将提示保存所作的修改。单击“”。

  7. 重新启动 Internet Explorer。(但是不要中止 ActXDoc 工程的运行)。

  8. 按 ALT+Tab 键切换回 Visual Basic。

  9. 注意在“立即”窗口中,可以看到 InitProperties 仅仅触发了一次:第一次在 Internet Explorer 中浏览 FirstDoc 文档的时候。在第二次浏览 FirstDoc 文档时仅仅触发了 Initialize 事件,而没有触发 InitProperties 事件;取而代之的是触发了 ReadProperties 事件。

    必须注意上述的区别,这关系到应该把代码放到什么地方。毫无疑问,如果希望在启动文档时总是执行某个过程,那么把它放到 Initialize 事件中。如果希望仅在第一次浏览 ActiveX 文档时才执行某一段程序,那么把它放到 InitProperties 事件中。

    但是,必须注意到在使用 Initialize 事件时的限制条件。简单地说,在 Initialize 事件中不能获得有关容器的信息(例如 Parent 属性)的过程。解决的办法是使用 Show 事件,该事件发生在 ActiveX 文档在容器中定位之后。