在 ThingDemo 工程中添加窗体

进程内部件可以用作提供过程和对话框的库,使用进程内部件既能够节省编程时间,又能为应用程序提供一致的外观和风格。

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

本主题介绍对象如何控制模式的或无模式的对话框。两种情况都采用了同一个窗体,如图 2.3 所示。

图 2.3   “dlgDemo”对话框

要在 ThingDemo 工程中添加窗体,请按照以下步骤执行:

  1. 在“工程资源管理器”窗口中,单击“ThingDemo”使之成为活动的工程。

    重点   在使用工程组时,在添加新的模块之前,必须确保活动的工程是正确的。

  2. 在“工程”菜单中,单击“添加窗体”打开“添加窗体”对话框。双击“添加窗体”图标添加一个窗体。

设计一个 Visual Basic 窗体,并把它保存为 ThingDemo_dlgDemo.frm。下表列出了窗体中对象的属性设置。

对象 属性 设置值
Form Name
BorderStyle
Caption
dlgDemo
Fi xed Dialog
Dialog Box
TextBox Name
Text
txtDemo
(Null)

客户应用程序并不直接调用对话框,因为窗体是私有类。客户应用程序不能创建私有类的实例,也不能将私有类的实例传递到客户应用程序。与此有关的详细说明,请参阅“部件设计的一般准则”的“属性和方法中所用的数据类型”。

为了显示对话框,客户应用程序需要调用全局的 Dialogs 对象的 ShowDialog 方法,这将创建并显示 dlgDemo 窗体。

要在 dlgDemo 窗体中添加代码,请按照以下步骤执行:

  1. 双击 dlgDemo,打开它的代码窗口,添加下列代码。
    '声明一个事件。
    Event NotifyClients(ByVal Data As String)
    
  2. 向文本框的 Change 事件添加下列代码。当文本框的内容改变时会产生 NotifyClients 事件,并以新的文本内容作为事件的参数。
    Private Sub txtDemo_Change()
    RaiseEvent NotifyClients(txtDemo.Text)
    End Sub
    
  3. 为了禁止在没有通知 Dialogs 对象的情况下关闭对话框,可以把下列代码放在 QueryUnload 事件过程中。
    Private Sub Form_QueryUnload(Cancel As Integer, _
    UnloadMode As Integer)
    '如果按了 Close 按钮,则
    '   隐藏对话框,但是不卸载它。
    If UnloadMode = vbFormControlMenu Then
    Cancel = True
    Me.Visible = False
    End If
    End Sub
    

如果 dlgDemo 以模式对话框的形式显示,那么隐藏它而不是卸载它将允许 Dialogs 类的 ShowDialog 方法检索文本框的值。

要创建 Dialogs 类,请按照以下步骤执行:

  1. 在“工程”菜单中,选择“添加类模块”打开“添加类模块”对话框。双击“类模块”图标向工程中添加类模块。

  2. 在“属性”窗口中,将类的 Name 属性改为 Dialogs

  3. 在“属性”窗口中,将 Instancing 属性改为 GlobalMultiUse。这样,即使没有显式地创建 Dialogs 对象,也可以调用 ShowDialog 方法。

  4. 在声明部分加入下列代码,它的作用是:创建一个 WithEvents 变量,以便处理 dlgDemo 的 NotifyClients 事件;创建一个事件,使 Dialogs 对象能够为自己的客户应用程序产生这个事件。
    Private WithEvents mdlg As dlgDemo
    Event NotifyClients(ByVal Data As String)
    
  5. 在“对象”框中,选择“mdlg”来显示由 dlgDemo 产生的 NotifyClients 事件的事件过程。添加下列代码:
    Private Sub mdlg_NotifyClients(ByVal Data As String)
    RaiseEvent NotifyClients(Data)
    End Sub
    

    一旦对话框的文本框内容改变,Dialogs 对象就可以从它的 dlgDemo 窗体接收到 NotifyClients 事件。Dialogs 对象立即产生它自己的 NotifyClients 事件,并向它的客户应用程序传递数据。

  6. 在代码窗口的“对象”框中,选择“”。在“过程”框中,选择“初始化”。向 Class_Initialize 事件过程中添加下列代码:
    Private Sub Class_Initialize()
    Debug.Print "Dialogs object created"
    Set mdlg = New dlgDemo
    End Sub
    
  7. 在“过程”框中,选择“终止”。向 Class_Terminate 事件过程中添加下列代码:
    Private Sub Class_Terminate()
    Debug.Print "Dialogs object terminated"
    Unload mdlg
    Set mdlg = Nothing
    End Sub
    

    在终止时,控制窗体的对象应该卸载该窗体,并把它对该窗体的引用设为 Nothing,从而避免孤立的窗体占用资源。

  8. 在“工具”菜单中,单击“添加过程”打开“添加过程”对话框。在“名称”框中输入 ShowDialog。单击“函数”和“公共的”,然后单击“确定”。

    在代码窗口中,修改新创建的 Function 过程如下所示:

    Public Function ShowDialog( _
    Optional ByVal Text As String = "", _
    Optional ByVal Modal As Boolean = True) _
    As String
    With mdlg
    .txtDemo.Text = Text
    If Modal Then
    .Caption = "Modal Dialog Box"
    .Show vbModal
    ShowDialog = .txtDemo.Text
    Else
    .Caption = "Modeless Dialog Box"
    .Show vbModeless
    End If
    End With
    End Function
    

    可选的 Typed 参数使编译器能够捕捉到类型不匹配错误,这样就可以在运行之前发现错误。关于可选的 Typed 参数,请参阅《Visual Basic 程序员指南》的“编程基础”。

  9. 把类模块保存为 ThingDemo_Dialogs.cls。

显示对话框的 ShowDialog 方法有两个可选的参数:

在显示对话框之前,Text 参数被赋给 dlgDemo 上的文本框。Modal 参数的缺省值是 True,如果忽略它,对话框将是模式的。

如果对话框为模式的,那么在用户关闭了对话框之后,ShowDialog 方法返回 txtDemo 文本框的内容。

如果对话框为无模式的,则不需要返回任何值。因为只要文本框的内容改变了,客户应用程序立刻就能收到 NotifyClients 事件。

详细信息 关于事件,在“部件设计的一般准则”的“给类添加事件”中讨论。

循序渐进

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

目的 请参阅
到下一步 在 TestThing 中使用全局对象
从头开始 创建一个 ActiveX DLL