UserControl 对象的存活期

普通的 Visual Basic 窗体存活期由一些关键事件所标记,比如 Initialize、Load、QueryUnload 和 Unload 等。为了创建行为符合标准的应用程序,知道这些事件在窗体存活期中何时引发是十分重要的。

这对控件也同样适用。UserControl 存活期中的关键事件是 Initialize,InitProperties,ReadProperties,WriteProperties 和 Terminate。下面将探讨这些事件。

注意   本主题是演示创建示例性 ActiveX 控件一系列步骤中的一部分。它是从创建 ActiveX 控件主题开始,可在相关信息中选择该主题。

要观察 ShapeLabel 的关键事件,请按照以下步骤执行:

  1. 在“工程资源管理器”窗口双击“ShapeLabel”以便打开其设计器。

  2. 双击设计器,为 ShapeLabel 打开代码窗口,并输入下列事件过程中的代码:
    Private Sub UserControl_Initialize()
    Debug.Print "Initialize"
    End Sub
    
    Private Sub UserControl_InitProperties()
    Debug.Print "InitProperties"
    End Sub
    
    Private Sub UserControl_ReadProperties(PropBag As _
    PropertyBag)
    Debug.Print "ReadProperties"
    End Sub
    
    Private Sub UserControl_WriteProperties(PropBag _
    As PropertyBag)
    Debug.Print "WriteProperties"
    End Sub
    
    Private Sub UserControl_Terminate()
    Debug.Print "Terminate"
    End Sub
    

    注意   对于 UserControl 对象而言,Load 和 Unload 事件被ReadProperties 和 WriteProperties 事件所代替。“建立 ActiveX 控件”中的“理解控件的存活期和关键事件”部分将更加详细地讨论这些内容。

  3. 确保 ShapeLabel 的设计器在最前,然后按下 CTRL+F4 以关闭窗口,使控件进入运行模式。 调试信息将出现在“立即”窗口中。

    这里发生了什么事情呢?ShapeLabel 控件的另一个实例尚未被放入Form1。所有这些事件来自何处?

    这说明了有关控件的一个重要问题。 把控件放入窗体后,它就被视为这个窗体的永久设施了。以控件作者的眼光来看,控件总是在被撤消和重建。

    通过关闭 ShapeLabel 的设计器而将 ShapeLabel 置于运行模式时,Form1 上的 ShapeLabel 实例被撤消并重建,这时它接收一个 Initialize 事件。为什么首先看不见 Terminate 事件?这是因为置在 Form1 上的原始ShapeLabel 实例是添加 UserControl_Terminate 事件过程代码之前创建的!欢迎来到充满活力的创建控件的拓荒之地。

    注意   单击窗体上下文菜单上的“更新用户控件”时,控件各个实例也都将被撤消和重建。

  4. 按下 CTRL+F5 键或者单击工具栏上的“启动” 按钮来运行TestCtlDemo。工程运行时,Form1 上的网格消失,因此看不见 ShapeLabel,但是在“立即”窗口可以看见其实物在闪烁。

    控件实例创建之后,可以通过 ReadProperties 事件,从包含此控件实例的窗体所属的 .frm 文件获取该控件所保存的属性值。

    当设计时的控件实例被撤消时,WriteProperties 事件提供机会以保存在设计时设置的属性值。属性值保存于控件所属窗体的 .frm 文件中,正如在本章后面“保存 ShapeLabel 控件的属性值”中所见到的一样。

    控件撤消时引发 Terminate 事件。

    注意   根据缺省,在(从“工具”菜单进行访问)“选项”对话框的“通用”选项卡上选中“请求时编译”选项。用 CTRL+F5 (或“运行”菜单上的“启动全编译”)覆盖“请求时编译”,并在进入运行模式之前编译组中全部工程。这是很有用的,因为编译错误通常要求重新设置工程,这意味着要返回设计模式。在调试控件时,可能宁可关闭“请求时编译”,也不愿意使用 CTRL+F5。

  5. 关闭 Form1 将工程返回到设计模式。在“立即”窗口中,当运行时期的 ShapeLabel 实例被撤消时,将看见一个 Terminate事件(但不是 WriteProperties,为什么不是呢?)。然后当设计时的控件实例被创建时会看见 Initialize、ReadProperties 和 Resize 事件。

    运行时期的控件实例永远不会获得 WriteProperties 事件,因为它并不需要保存其属性值。这主要是出于 ShapeLabel 的未来的考虑。当它被编译成 .ocx 文件时,它会被添加到另一个工程,把一个实例放入窗体,将此工程编译成一个 .exe 文件并使其运行。 关闭该 .exe 文件时,ShapeLabel 实例能够保存其属性值的唯一地方就是该 .exe 文件。 而正常运作的操作系统不能容许这类行为。

  6. 滚动到“立即”窗口的顶端,单击左上角,拖动以选择该窗口的全部文本。 按下 DELETE 键清除此窗口。

  7. 在“工程资源管理器”窗口双击 Form1 使其置前。

  8. 在“工具箱”上双击“ShapeLabel”图标把另一个控件实例添加到“Form1”中。这时会看见一个新事件。

    把控件的新实例放入容器时,它获得一个 InitProperties 事件。 可把代码放入 UserControl_InitProperties 事件过程以便:

  9. 单击 Form1 设计器的“关闭”按钮或在设计器前置时按下 CTRL+F4 使其关闭。在“立即”窗口会看见两组 WriteProperties 和 Terminate 事件,各自对应 ShapeLabel的一个实例。

  10. 在“工程资源管理器”窗口双击 Form1 再次打开其设计器。当设计器打开时,Form1上的所有控件均被创建并且它们的 Initialize 事件被触发。之后所有控件接收 ReadProperties 事件,从而允许它们检索其已保存的属性值。 InitProperties 事件不会引发,因为 ShapeLabel 控件的两个实例均已存在。

详细信息    关于控件存活期和其间的关键事件的细节在第九章“建立 ActiveX 控件”中的“理解控件的存活期和关键事件”部分讨论。同一章的“显露子控件属性”部分解释了 ActiveX 控件界面向导如何简化创建用来存取属性值的代码。关于控件存活期和其间的关键事件的细节在“建立 ActiveX 控件”中的“理解控件的存活期和关键事件”部分讨论。同一章的“显露子控件属性”部分解释了 ActiveX 控件界面向导如何简化创建用来存取属性值的代码。

步骤

本主题是演示创建示例性 ActiveX 控件一系列步骤中的一部分。

请参阅
转到下一步 ShapeLabel 控件的画出
从头开始 创建 ActiveX 控件