一个和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
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
Dim Frm As New Form2
Frm.Show
Set tmpForm = Forms.Add(rs("对象名称"))
Load tmpForm
tmpForm.Show
执行时报无效使用关键字,如要进行打开的窗体名字对比,应如何编写代码,请老师指点
要想不重复打开,就:
你的子窗体叫做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