1

我有一个 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 中打开和停靠,但有些表单是“正常的”。

编辑 :

我做了一些测试和表单集合依赖于一个项目,我认为这个集合对于应用程序来说是全局的,但显然不是。

我想关闭主项目的所有表格。我可以让另一个项目打开一个模态表单(所有应用程序的 90 个项目)

4

3 回答 3

1

如果您只想确保它已关闭,您还可以使用 Windows API 函数:

Private Declare Function CloseWindow Lib "user32" Alias "CloseWindow" (ByVal hwnd As Long) Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Dim wid 只要 wid=FindWindow(vbnullstring,"") if wid <> 0 then CloseWindow wid

于 2013-04-10T13:42:23.497 回答
0

一种可行的替代方案;

do until Screen.ActiveForm is Nothing
    unload Screen.ActiveForm
loop
于 2013-04-05T10:27:09.877 回答
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

[编辑]

将 3 个命令按钮添加到 form2 并单击它们以测试卸载时会发生什么

在从 ide 运行时对其进行测试,并注意显示模式表单、显示无模式表单(有所有者)和显示默认表单(没有所有者)时的区别..注意“运行”按钮i 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
于 2013-04-08T06:10:15.457 回答