F_DataAccess:设计好的MDI子窗体
其中F_DataAccess窗体中添加了自定义属性:
WindowTitle属性:窗口标题
TableId:表编号属性,映射需要打开的表模块中的定义:
Public Enum dtTableId
      dtProducts = 1
      dtEmployees = 2
      dtSuppliersAndCustomers = 3
End EnumMDI窗体中我使用菜单调出窗体MenuProducts菜单的事件过程:
      Dim Products As New F_DataAccess
      With Products
            .WindowTitle = "产品"
            .TableId = dtTableId.dtProducts
            .Show
      End With
MenuEmployees菜单的事件过程:
      Dim Employees As New F_DataAccess
      With Products
            .WindowTitle = "职员"
            .TableId = dtTableId.dtEmployees
            .Show
      End With
思路是正常的,但有一个问题,就是每次点击菜单都会有一个新MDI新窗体启动。有没有办法让MDI窗体在关闭之前再次点击菜单时让已经启动的窗体获得焦点而不再次启动窗体,前提是不重新设计窗体。如:点击二次菜单“MenuProducts”就会有2个产品窗体被加载,真烦。

解决方案 »

  1.   

    打错了一个词:
    MenuEmployees菜单的事件过程:  
               Dim  Employees  As  New  F_DataAccess  
               With  Employees  
                           .WindowTitle  =  "职员"  
                           .TableId  =  dtTableId.dtEmployees  
                           .Show  
               End  With  
      

  2.   

    考虑如果使用窗体变量的话就会定义很多个比如:
    Private Products As New F_DataAccess
    Private Employees As New F_DataAccessMenuProducts菜单的事件过程改为: 
         If Products.Visual Then
               Products.SetFouce
         Else 
               With  Products  
                      .WindowTitle  =  "产品"  
                      .TableId  =  dtTableId.dtProducts  
                      .Show  
               End  With
         End If现在考虑有没有其他方案.  
      

  3.   

    将Products和Employee声明为模块级变量。MenuProducts菜单的事件过程:
          if Products Is Nothing then
             Dim Products As New F_DataAccess
             With Products
                   .WindowTitle = "产品"
                   .TableId = dtTableId.dtProducts
                   .Show
             End With
          else
             Products.SetFocus'忘了form有没有这个方法,如果没有,则调用SetFocusAPI:
                              'SetFocusAPI Products.hwnd
          end if
    Employee类似。
      

  4.   

    上面有错误,代码第二行改为:
    Set Products = New F_DataAccess
      

  5.   

    API声明:
    Private Declare Function SetFocusAPI Lib "user32" Alias "SetFocus" (ByVal hwnd As Long) As Long
      

  6.   

    基本上按照楼主最后的那个思路, 把窗体对象变量声明成全局的。
    菜单代码上没必要判断Visible是否为真:Private Products As New F_DataAccess
    Private Employees As New F_DataAccessMenuProducts菜单的事件过程改为: 
    With  Products  
         .WindowTitle  =  "产品"  
         .TableId  =  dtTableId.dtProducts  
         .Show  
    End  With另外,F_DataAccess的Unload事件中可以加上以下代码:
    Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
        If UnloadMode = vbFormControlMenu Then
            Cancel = True
            Me.Hide
        End If
    End Sub这样可以避免Products和Employees对象被频繁地Unload和Load
      

  7.   

    首先给楼主一个例子看看是不是您要的效果程序如下:
    http://download.csdn.net/source/162250
      

  8.   

    关键是楼主根本没有把自己的要求表达清楚,看看我对上面程序的描述:
    midi数字音乐编辑软件。
    1、使用MDI子窗体,可以打开多个midi文件。比如001.mid,002.mid
    2、如果选择的文件已经打开时比如001.mid,直接让已经打开001.mid的MDI子窗体显示在最前端。并且获得焦点,如果此时001.mid已经被修改过,则会提示:“此文件已经打开,并且已经修改,放弃修改重新打开001.mid文件?”,VByes,vbno
    3、选择打开其他文件比如003.mid没有什么提示直接在新的子窗体中打开显示并获得焦点。
      

  9.   

    Dim Employees As New F_DataAccess
          With Products
                .WindowTitle = "职员"
                .TableId = dtTableId.dtEmployees
                .Show
          End With
    ————————————————————————
    把Dim Employees As New F_DataAccess
    改为:public Employees As New F_DataAccess放在模块里
    菜单事件:
    if Employees is nothing then
      set Employees =new F_DataAccess
      Employees .show
    else
      Employees .得到焦点    '那个函名记不住名了,嘿
    end if
    另外在这个窗体关闭时要释放自己,unload me(vb6里行,不知道VBA里是不是这样)
      

  10.   

    为什么要放在模块里呢,直接放在MDI窗体中不就行了,我上面已经说过了.不过这样得定义很多对象变量,对性能肯定有影响.
    不过还是谢谢各位的热心解答.