【问题标题】:How to automatically close a modal form如何自动关闭模态表单
【发布时间】:2013-03-27 16:14:36
【问题描述】:

我有一个 VB6 项目,我实现了一个带有自动注销功能的会话计时器。

我的问题是,如果打开了一个模态表单,这个表单不在表单集合中,所以我不知道这个表单是否打开是为了卸载它。使用非模态形式,没有问题。

如果有人有想法?是否可以显示所有打开的表单(非模态和模态)?

感谢您的回复

编辑:代码 sn-p:

表单创建:

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 个项目)

【问题讨论】:

  • 什么打开了表格?如果它不是由您/您的代码创建的,那么唯一的选择可能是向其发布 WM_CLOSE 消息。
  • 如果加载了一个表单,它确实会出现在 Forms 集合中,无论其形式如何。你真的是指“窗户”吗?非 VB 窗体窗口确实会更狡猾。
  • 表单是由我的代码使用 .show 创建的。表单已正确加载,但未出现在表单集合中。
  • @user1069516 你能添加一个sn-p来展示你描述的行为吗?
  • 可能问题出在卸载顺序上。我通常在模块中创建一个子用于卸载并传递调用表单的名称,然后遍历表单并卸载所有表单,除了调用表单,我最后单独卸载

标签: vb6


【解决方案1】:

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

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

只要变宽就变暗 wid=FindWindow(vbnullstring,"") 如果 wid 0 那么 CloseWindow wid

【讨论】:

    【解决方案2】:

    模态、非模态和默认表单确实显示在表单集合中

    运行以下测试项目以查看它的发生情况:

    '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 运行时对其进行测试,并注意显示模式表单、显示无模式表单(有所有者)和显示默认表单(没有所有者)时的区别..注意' 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
    

    【讨论】:

      【解决方案3】:

      一种可行的替代方案;

      do until Screen.ActiveForm is Nothing
          unload Screen.ActiveForm
      loop
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-04-08
        • 2023-03-13
        • 2019-06-25
        • 1970-01-01
        • 1970-01-01
        • 2016-02-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多