应用程序刚启动时,TestThing 在它的 Form_Load 事件过程中调用 ShowDialog 方法显示一个模式对话框。在单击主窗体时,它还会显示出一个无模式的对话框。
注意 创建一个 ActiveX DLL 示例需要分为几步,这个帮助主题只是其中一步。要访问该帮助主题,选择帮助主题“创建 ActiveX DLL”即可。
要添加代码,调用 ShowDialog 方法,请按照以下步骤执行:
Sub Form_Load()
Me.Caption = ShowDialog(Me.Caption)
End Sub
注意,这里没有声明任何对象变量,而且调用 ShowDialog 方法的方式如同调用一个普通的函数过程。之所以能这样做,是因为 Dialogs 对象的 Instancing 属性被设为 GlobalMultiUse。
Private WithEvents mdgs As Dialogs
变量被声明为 WithEvents,因此 Form1 就能够处理由 Dialogs 对象产生的 NotifyClients 事件。
Private Sub mdgs_NotifyClients(Byval Data As String)
Me.Caption = Data
End Sub
无论什么时候收到 NotifyClients 事件,Form1 都会把数据值赋给它的 caption 属性。这样,无模式的对话框就能控制窗体的标题了。
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 属性。确定能否工作。
要确定能否工作,请按照以下步骤执行:
对文本框内容的每次修改都将产生从 dlgDemo 到 Dialogs 对象的一个 NotifyClients 事件。然后 Dialogs 对象将产生自己的 NotifyClients 事件,主窗体将接收到这个事件。
要学到更多的东西,再一次运行这个工程,每次按 F8 键都单步运行一行代码。因为跟踪进入了不同的 Initialize 事件中,所以可以清楚地看到创建了两个不同的 Dialogs 对象。
有趣的是,模式对话框也产生了 NotifyClients 事件,象无模式对话框一样。但是 Form1 没有 WithEvents 变量用于包含对全局 Dialogs 对象的引用,因此它不能处理这些事件。
重点 “全局对象”中的“全局”只是意味着对象的方法和属性被添加到了工程的全局命名空间中,因此在使用时并不需要事先声明对象变量。并不是说只有一个这样的对象,或者多个客户应用程序可以共享一个对象。对于使用类的方法、但未加以限定的每个客户应用程序,都会创建一个类的实例。对每个客户应用程序只创建一个全局对象。
在进程内的部件中显示无模式窗体,这将要求与客户机消息循环进行通讯。不是所有客户机都支持这一功能。为了解释这一局限性,请参阅第八章“建立代码部件”的“从代码部件显示窗体”。
详细信息 关于全局对象,请参阅“部件设计的一般准则”的“ActiveX 部件提供的类的实例化”以及第八章“建立代码部件”。
创建 ActiveX DLL 示例需要好几步,该帮助主题只是其中一步。
目的 | 请参阅 |
到下一步 | 编译和测试 ThingDemo DLL |
从头开始 | 创建一个 ActiveX DLL |