调试的时候出现“模块之间循环相关”的警告。 希望各位高手帮忙解决 。。先谢谢了

解决方案 »

  1.   


    '里面的事件有问题
    Event NotifyClients(ByVal Data As String)'dialogs
    'Private Sub mdlg_NotifyClients(ByVal Data As String)
    '    RaiseEvent NotifyClients(Data)
    'End Sub'dlgDemo
    Private Sub mdgs_NotifyClients(ByVal Data As String)
        Me.Caption = Data
    End Sub
      

  2.   

    我要的结果是:
    1. 按 Ctrl+F5 键运行工程组。第一个出现的将是对话框,它的标题是Form1:
    2. 输入新的标题,然后关闭对话框。这时主窗体出现,显示的是新的标题。
    3. 在主窗体上单击,创建另一个 Dialogs 对象,它将显示一个无模式的对话框,包括主窗体当前的标题。再输入一个新的标题,可以看到每次击键都会使主窗体的标题发生改变:
    对文本框内容的每次修改都将产生从 dlgDemo 到 Dialogs 对象的一个 NotifyClients 事件。然后 Dialogs 对象将产生自己的NotifyClients 事件,主窗体将接收到这个事件。差不多就行
      

  3.   

    这是代码说明部分 帮我看看 运行是的结果在楼上有说明 全部代码在附件里。
    <在ThingDemo工程中添加窗体>
    进程内部件可以用作提供过程和对话框的库,使用进程内部件既能够节省编程时间,又能为应用程序提供一致的外观和风格。本主题介绍对象如何控制模式的或无模式的对话框。两种情况都采用了同一个窗体,如下图所示。图就是dlgDemo窗体要在 ThingDemo 工程中添加窗体,请按照以下步骤执行:
    1. 在“工程资源管理器”窗口中,单击“ThingDemo“使之成为活动的工程。
    2. 在“工程”菜单中,单击“添加窗体”打开“添加窗体”对话框。双击“添加窗体”图标添加一个窗体。设计一个 Visual Basic 窗体,并把它保存为 ThingDemo_dlgDemo.frm。客户应用程序并不直接调用对话框,因为窗体是私有类。客户应用程序不能创建私有类的实例,也不能将私有类的实例传递到客户应用程序。与此有关的详细说明,请参阅第八章“部件设计的一般准则”的“属性和方法中所用的数据类型”。为了显示对话框,客户应用程序需要调用全局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
    9. 把类模块保存为 ThingDemo_Dialogs.cls。显示对话框的 ShowDialog 方法有两个可选的参数:
    ?准备显示的初始文本
    ?决定对话框是否为模式对话框的布尔参数
    在显示对话框之前,Text 参数被赋给 dlgDemo 上的文本框。Modal 参数的缺省值是 True,如果忽略它,对话框将是模式的。
    如果对话框为模式的,那么在用户关闭了对话框之后,ShowDialog 方法返回 txtDemo 文本框的内容。
    如果对话框为无模式的,则不需要返回任何值。因为只要文本框的内容改变了,客户应用程序立刻就能收到 NotifyClients 事件。
    <在TestThing中使用全局对象>
    应用程序刚启动时,TestThing 在它的 Form_Load 事件过程中调用ShowDialog 方法显示一个模式对话框。在单击主窗体时,它还会显示出一个无模式的对话框。要添加代码,调用 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 对象创建并管理一个 dlgForm 对象,同时还接收它的 NotifyClients
    事件。Form1 创建了两个不同的 Dialogs 对象,一个是隐含的(用来显示模式对话框的全局实例),另一个是显式的(用来显示无模式的对话框)。无模式的对话框通过产生 NotifyClients 事件与 Dialogs 对象通讯。Dialogs对象通过产生自己的 NotifyClients 事件进行响应,而 Form1 在处理事件时将数据赋予它 Caption 属性,确定能否工作。