vb中的Mdi子窗体不能正确读取另外一个子窗体的visible属性
一旦读取,无论被读取的窗体是不是可见的,都会显示出来并返回True具体情况如下
现有mdi主窗体一个,子窗体2个Form1和Form2Form1中有一个按钮,代码如下Option ExplicitPrivate Sub Command1_Click()    If Form2.Visible Then
        MsgBox "ccc"
    End IfEnd Sub
这时无论Form2如果是可见的,则直接返回True,问题在于如果此时Form2是不可见的,则会被显示出来再返回True不知道有什么方法解决,麻烦大家看看,谢谢

解决方案 »

  1.   

    又试了一下 好像不光是读取Visible 属性时会这样,其它属性也会
      

  2.   

    读取Visble属性你想显示form2 msgbox("ccc")吗?
    如果是这样
    form2.show
    msgbox("ccc")
      

  3.   

    使用窗体属性=如果窗体未加裁,先自动加裁窗体,然后再使用它的属性。判断form2是否已经加裁可以用以下方法:
    Private Sub Command1_Click()
        Dim frm As Form
        For Each frm In Forms
            If frm.Name = "Form2" Then
               MsgBox "ccc"
            End If    NextEnd Sub
      

  4.   

    判断窗体是否可见是需要用到visible属性,不过要先判断该窗体是否已加载,所以要用到两步.
      

  5.   

    那为什么非mdi窗体就没有这种问题?
      

  6.   


    看4楼
    Private Sub Command1_Click()
      Dim frm As Form
      For Each frm In Forms
          If frm.Name = "Form2" Then
              If Form2.Visible Then
                  MsgBox "ccc"
              End If
           end if
      NextEnd Sub
      

  7.   


    那为什么非mdi窗体就没有这种问题?
      

  8.   

    这要看你是怎么打开的窗体
    如果是 Form2.Show那么就可以看
    如果用Dim Frm as New Form2.Show
    那么需要判断的是Frm,如果这种方式打开多次
    需要用Private Sub Command1_Click()
      Dim frm As Form
      For Each frm In Forms
        If Typeof frm is Form2 and frm.Visible=True  Then
          MsgBox "ccc"
        End If
      Next
    End Sub
      

  9.   

    MSDN: 当在代码中引用一个未装载窗体的属性时,该窗体自动被装载但不自动成为可视窗体,除非 MDIChild 属性被设置为 True。
      

  10.   

    MDIForm Load 事件中的下列代码可自动装载一个 MDI 子窗体(假设 Form1 本身的 MDIChild 属性被设置为 True):Dim NewForm As New Form1
    NewForm.Caption = "New Form"   '.‘按引用装载窗体’。由于所有子窗体在装载时都可视,对 Caption 属性的引用将装载该窗体并使其可视。
      

  11.   

    非MDI窗体也有这种问题,只不过它不让你直接看到罢了。当你调用“窗体名称.属性”的时候,程序会做两件事,第一件事,检查“窗体名称”这个对象是否存在,不存在时创建这个对象;第二件事,对象存在以后再调用对象的属性。
      

  12.   

    只要设置了MDIChild属性,不存在你说的情况,以下是Form1中的测试代码:
    Private Sub Command1_Click()
        Form2.Visible = Not Form2.Visible
        Me.ZOrder
    End SubPrivate Sub Command2_Click()
        If Form2.Visible Then
            MsgBox "ccc"
        End If
    End SubPrivate Sub Form_Load()
        Load Form2
    End Sub