一个和MDI主窗体附在一起的MDI子窗体是程序的打开界面,通过listview控件打开程序的各个子窗体,代码如下:
Private Sub ModifyEmp()
  Dim tmpForm As Form
  Dim strSQL As String
  If lvEmp.SelectedItem Is Nothing Then Exit Sub
  strSQL = "SELECT 功能ID,功能名称,位图ID,对象名称, 根节点ID FROM USy功能明细 WHERE 功能ID=" & GetID(lvEmp.SelectedItem.Key)
  Set rs = QueryExt(strSQL)
  If rs("根节点ID") = 0 Then
    strSQL = "SELECT USy权限明细.人员ID, USy权限明细.功能ID, USy权限明细.打开窗体, USy人员明细.人员姓名," & _
             "USy功能明细.根节点ID, USy功能明细.功能名称, USy功能明细.对象名称, USy功能明细.位图ID " & _
             "FROM USy功能明细 INNER JOIN (USy人员明细 INNER JOIN USy权限明细 ON USy人员明细.人员ID = " & _
             "USy权限明细.人员ID) ON USy功能明细.功能ID = USy权限明细.功能ID " & _
             "WHERE USy人员明细.人员姓名='" & UserName & "'AND USy权限明细.打开窗体=1 AND USy功能明细.根节点ID='" & rs("功能ID") & "'"
    Set rs = QueryExt(strSQL)
    lvEmp.ListItems.Clear '清除当前的列表内容
      Do While Not rs.EOF '循环显示记录集中的数据
        AddToLV rs.DataSource, lvEmp, False    '添加一项数据
        rs.MoveNext '处理下一记录
      Loop
  Else
  If IsNull(rs("对象名称")) Then Exit Sub
  Set tmpForm = Forms.Add(rs("对象名称"))
  Load tmpForm
  tmpForm.Show
  End If
  Set rs = Nothing
End Sub
问题是通过以上代码可以重复的打开子窗体,在网上找了下,有以下模块可以用,但拼来拼去在我的代码中无效,请老师指点
谢谢!!
网上的代码如下:
Option ExplicitPublic Declare Function CloseHandle Lib "Kernel32.dll" (ByVal Handle As Long) As Long
Public Declare Function OpenProcess Lib "Kernel32.dll" (ByVal dwDesiredAccessas As Long, ByVal bInheritHandle As Long, ByVal dwProcId As Long) As Long
Public Declare Function EnumProcesses Lib "PSAPI.DLL" (ByRef lpidProcess As Long, ByVal cb As Long, ByRef cbNeeded As Long) As Long
Public Declare Function GetModuleFileNameExA Lib "PSAPI.DLL" (ByVal hProcess As Long, ByVal hModule As Long, ByVal ModuleName As String, ByVal nSize As Long) As Long
Public Declare Function EnumProcessModules Lib "PSAPI.DLL" (ByVal hProcess As Long, ByRef lphModule As Long, ByVal cb As Long, ByRef cbNeeded As Long) As LongPublic Const PROCESS_QUERY_INFORMATION = 1024
Public Const PROCESS_VM_READ = 16
Public Const MAX_PATH = 260Public Function CheckProcessesExist(ByVal EXEName As String) As Boolean
    Dim strProcessName As String
    Dim lngCBSize As Long
    Dim lngCBSizeReturned As Long
    Dim lngNumElements As Long
    Dim lngProcessIDs() As Long
    Dim lngCBSize2 As Long
    Dim lngModules(1 To 200) As Long
    Dim lngReturn As Long
    Dim strModuleName As String
    Dim lngSize As Long
    Dim lngHwndProcess As Long
    Dim lngLoop As Long
    Dim booResult As Boolean
    
    On Error GoTo Error_handler
    booResult = False
    EXEName = UCase(Trim(EXEName))
    lngCBSize = 8
    lngCBSizeReturned = 96
    Do While lngCBSize <= lngCBSizeReturned
        DoEvents
        lngCBSize = lngCBSize * 2
        ReDim lngProcessIDs(lngCBSize / 4) As Long
        lngReturn = EnumProcesses(lngProcessIDs(1), lngCBSize, lngCBSizeReturned)
    Loop
    lngNumElements = lngCBSizeReturned / 4
    For lngLoop = 1 To lngNumElements
        lngHwndProcess = OpenProcess(PROCESS_QUERY_INFORMATION Or PROCESS_VM_READ, 0, lngProcessIDs(lngLoop))
        If lngHwndProcess <> 0 Then
            lngReturn = EnumProcessModules(lngHwndProcess, lngModules(1), 200, lngCBSize2)
            If lngReturn <> 0 Then
                strModuleName = Space(MAX_PATH)
                lngSize = 500
                lngReturn = GetModuleFileNameExA(lngHwndProcess, lngModules(1), strModuleName, lngSize)
                strProcessName = UCase(Trim(Left(strModuleName, lngReturn)))
                If strProcessName = EXEName Then
                    booResult = True
                End If
            End If
        End If
        lngReturn = CloseHandle(lngHwndProcess)
        DoEvents
        If booResult Then Exit For
    Next lngLoop
Error_handler:
    Err.Clear
    CheckProcessesExist = booResult
End Function
 

解决方案 »

  1.   

    根本不需要这么麻烦,使用New关键字即可,打开N个都没问题
    Dim Frm As New Form2
    Frm.Show
      

  2.   

    将Dim tmpForm As Form改为 Dim tmpForm As New Form
    Set tmpForm = Forms.Add(rs("对象名称"))
    Load tmpForm
    tmpForm.Show
    执行时报无效使用关键字,如要进行打开的窗体名字对比,应如何编写代码,请老师指点
      

  3.   

    你是不想打开重复的窗体?
    要想不重复打开,就:
    你的子窗体叫做form1,
    在mid主窗体里面声明一个全局变量 xx as form1
    在listview的事件代码里面写:    If xx Is Nothing Then
            Set xx = New Form1
        End If
        xx.Show如果你要运行一个子窗口的重复多次打开,就不要if了,每次都直接set xx=new form1:xx.show