我有一个VB6项目,我实现了一个自动注销的会话计时器。
我的问题是如果打开一个模态窗体,这个窗体不在Forms Collection中,所以我不知道是否打开了这个窗体以便卸载它。使用非模态形式,没有问题。
如果有人有想法?是否可以显示所有打开的表格(非模态和模态)?
感谢您的回复
编辑:代码段:
表单创建:
Dim FormLoc As New F_Options
FormLoc.Show vbModal
形式破坏:
For Each mFrm In Forms
unload mFrm
next
For Each mFrm In F_MDIParent.MDIActiveX1.Forms
unload mFrm
next
主要表格是MDI表格。其他形式可以在MDI Mainform中打开和停靠,但有些形式是“正常的”。
编辑:
我做了一些测试并且Forms集合依赖于一个项目,我认为这个集合对于应用程序是全局的,但显然不是。
我想关闭主项目中的所有表单。我可以有一个由另一个项目打开的模态表单(所有应用程序都有90个项目)
答案 0 :(得分:1)
如果您只是想确保它已关闭,您也可以使用Windows API函数:
私有声明函数CloseWindow Lib“user32”别名“CloseWindow”(ByVal hwnd As Long)As Long 私有声明函数FindWindow Lib“user32”别名“FindWindowA”(ByVal lpClassName As String,ByVal lpWindowName As String)As Long
昏昏欲睡 WID = FindWindow函数(vbnullstring, “”) 如果wid<> 0然后是CloseWindow wid
答案 1 :(得分:0)
可能有效的替代方案;
do until Screen.ActiveForm is Nothing
unload Screen.ActiveForm
loop
答案 2 :(得分:0)
模式,无模式和默认表单确实显示在表单集合
中运行以下测试项目以查看它是否发生:
'project with 2 forms
' form1 with :
' 1 label: name=Label1
' 1 timer: name=Timer1
' 4 command buttons: names are Command1, Command2, Command3, Command4
' form2 with nothing on it
Option Explicit
Private Sub Command1_Click()
Dim frm As New Form2
frm.BackColor = vbRed
frm.Show vbModal
End Sub
Private Sub Command2_Click()
Dim frm As New Form2
frm.BackColor = vbGreen
frm.Show vbModeless, Me
End Sub
Private Sub Command3_Click()
Dim frm As New Form2
frm.Show
End Sub
Private Sub Form_Load()
With Screen
Move .Width / 2, 0, .Width / 2, .Height / 2
End With 'Screen
Command1.Caption = "modal"
Command2.Caption = "modeless"
Command3.Caption = "default"
Command4.Caption = "unload"
With Timer1
.Interval = 1000
.Enabled = True
End With 'Timer1
End Sub
Private Sub Form_Resize()
Dim sngLblWidth As Single, sngLblHeight As Single
Dim sngCmdWidth As Single, sngCmdHeight As Single
sngCmdHeight = 495
sngLblHeight = ScaleHeight - sngCmdHeight
sngLblWidth = ScaleWidth
sngCmdWidth = sngLblWidth / 4
Label1.Move 0, 0, sngLblWidth, sngLblHeight
Command1.Move 0, sngLblHeight, sngCmdWidth, sngCmdHeight
Command2.Move sngCmdWidth, sngLblHeight, sngCmdWidth, sngCmdHeight
Command3.Move 2 * sngCmdWidth, sngLblHeight, sngCmdWidth, sngCmdHeight
Command4.Move 3 * sngCmdWidth, sngLblHeight, sngCmdWidth, sngCmdHeight
End Sub
Private Sub Timer1_Timer()
Dim frm As Form
Dim strShow As String
strShow = CStr(Now)
For Each frm In Forms
strShow = strShow & vbCrLf & frm.Name
Next frm
Label1.Caption = strShow
End Sub
<强> [编辑] 强>
向form2添加3个命令按钮,然后单击它们以测试卸载时发生的情况
在从ide运行时测试它,并在显示模态窗体时显示差异,显示无模式窗体(带有所有者),以及显示默认窗体时(没有所有者)..注意'运行'button i the ide ..当卸载带有显示的模型表单的form1时,应用程序仍在运行
这是Form2的代码
Option Explicit
Private Sub Command1_Click()
UnloadForms "Form1"
End Sub
Private Sub Command2_Click()
UnloadForms "Form2"
End Sub
Private Sub Command3_Click()
UnloadForms ""
End Sub
Private Sub Form_Load()
Command1.Caption = "Unload Form1"
Command2.Caption = "Unload Form2"
Command3.Caption = "Unload All"
End Sub
Private Sub UnloadForms(strName As String)
Dim frm As Form
For Each frm In Forms
If InStr(frm.Name, strName) > 0 Then
Unload frm
End If
Next frm
End Sub
[编辑2]
下面是我用来卸载所有表单的子程序,这个子程序在一个模块中,所以我可以随处调用它
Public Sub UnloadAll(strExcept As String, blnKeepMDI As Boolean)
Dim frm As Form
'unload all other forms
For Each frm In Forms
Select Case frm.Name
Case "mdiPaneel" 'unload mdi as last
Case "frmMsg" 'dont unload msg unless specified
Case strExcept 'dont unload this if mdi stays
If blnKeepMDI = False Then
Unload frm
End If
Case Else
Unload frm
End Select
Next frm
If blnKeepMDI = False Then
'unload mdi and finish program
Unload mdiPaneel
End If
End Sub