在 TestThing 中使用全局对象

应用程序刚启动时,TestThing 在它的 Form_Load 事件过程中调用 ShowDialog 方法显示一个模式对话框。在单击主窗体时,它还会显示出一个无模式的对话框。

注意 创建一个 ActiveX DLL 示例需要分为几步,这个帮助主题只是其中一步。要访问该帮助主题,选择帮助主题“创建 ActiveX DLL”即可。

要添加代码,调用 ShowDialog 方法,请按照以下步骤执行:

  1. 在“工程资源管理器”窗口中,单击“Form1”选择它,然后按 F7 键或者单击“工程资源管理器”窗口工具栏上的 Code 按钮,打开窗体的代码窗口。把下列代码加入 Form_Load 事件中。
    Sub Form_Load()
    Me.Caption = ShowDialog(Me.Caption)
    End Sub
    

    注意,这里没有声明任何对象变量,而且调用 ShowDialog 方法的方式如同调用一个普通的函数过程。之所以能这样做,是因为 Dialogs 对象的 Instancing 属性被设为 GlobalMultiUse。

  2. 在声明部分添加下列代码:
    Private WithEvents mdgs As Dialogs
    

    变量被声明为 WithEvents,因此 Form1 就能够处理由 Dialogs 对象产生的 NotifyClients 事件。

  3. 在“对象”框中选择“mdgs”来显示事件过程。添加下列代码:
    Private Sub mdgs_NotifyClients(Byval Data As String)
    Me.Caption = Data
    End Sub
    

    无论什么时候收到 NotifyClients 事件,Form1 都会把数据值赋给它的 caption 属性。这样,无模式的对话框就能控制窗体的标题了。

  4. 要显示无模式的对话框并开始事件处理,可以在 Form_Click 事件过程中添加下列代码:
    Private Sub Form_Click()
    If mdgs Is Nothing Then
    Set mdgs = New Dialogs
    End If
    mdgs.ShowDialog Me.Caption, False
    End Sub
    

    重点 在这里创建的 Dialogs 对象不同于 Load 事件中用于显示模式对话框的全局实例。在 Form_Load 中调用 ShowDialog 方法时,全局实例是自动创建的,以后在调用方法时如果省略了对象变量,使用的将是这个实例。用来显示无模式对话框的实例是显式创建的,而且被赋予 WithEvents 变量,所以才能处理它的 NotifyClients 事件。

Dialogs 对象创建并管理一个 dlgForm 对象,同时还接收它的 NotifyClients 事件。Form1 创建了两个不同的 Dialogs 对象,一个是隐含的(用来显示模式对话框的全局实例),另一个是显式的(用来显示无模式的对话框)。

无模式的对话框通过产生 NotifyClients 事件与 Dialogs 对象通讯。Dialogs 对象通过产生自己的 NotifyClients 事件进行响应,而 Form1 在处理事件时将数据赋予它 Caption 属性。确定能否工作。

要确定能否工作,请按照以下步骤执行:

  1. 按 CTRL+F5 键运行工程组。第一个出现的将是对话框,它的标题是 Form1:

  2. 输入新的标题,然后关闭对话框。这时主窗体出现,显示的是新的标题。

  3. 在主窗体上单击,创建另一个 Dialogs 对象,它将显示一个无模式的对话框,包括主窗体当前的标题。再输入一个新的标题,可以看到每次击键都会使主窗体的标题发生改变:

    对文本框内容的每次修改都将产生从 dlgDemo 到 Dialogs 对象的一个 NotifyClients 事件。然后 Dialogs 对象将产生自己的 NotifyClients 事件,主窗体将接收到这个事件。

要学到更多的东西,再一次运行这个工程,每次按 F8 键都单步运行一行代码。因为跟踪进入了不同的 Initialize 事件中,所以可以清楚地看到创建了两个不同的 Dialogs 对象。

有趣的是,模式对话框也产生了 NotifyClients 事件,象无模式对话框一样。但是 Form1 没有 WithEvents 变量用于包含对全局 Dialogs 对象的引用,因此它不能处理这些事件。

重点 “全局对象”中的“全局”只是意味着对象的方法和属性被添加到了工程的全局命名空间中,因此在使用时并不需要事先声明对象变量。并不是说只有一个这样的对象,或者多个客户应用程序可以共享一个对象。对于使用类的方法、但未加以限定的每个客户应用程序,都会创建一个类的实例。对每个客户应用程序只创建一个全局对象。

无模式窗体的应用程序支持

在进程内的部件中显示无模式窗体,这将要求与客户机消息循环进行通讯。不是所有客户机都支持这一功能。为了解释这一局限性,请参阅第八章“建立代码部件”的“从代码部件显示窗体”。

详细信息 关于全局对象,请参阅“部件设计的一般准则”的“ActiveX 部件提供的类的实例化”以及第八章“建立代码部件”。

循序渐进

创建 ActiveX DLL 示例需要好几步,该帮助主题只是其中一步。

目的 请参阅
到下一步 编译和测试 ThingDemo DLL
从头开始 创建一个 ActiveX DLL