2015-10-20 320 views
0

我MDI应用程序,并有其最终应用之前做一些工作有些OnFormClosing事件 - 这些行:执行代码

Projekt.UnlockAllLockedProjects() 
End 'completly close app 

及以下全部代码:

Protected Overrides Sub OnFormClosing(e As FormClosingEventArgs) 
    MyBase.OnFormClosing(e) 

    If e.CloseReason = CloseReason.WindowsShutDown Then 
     Return 
    End If 

    Dim dr As DialogResult 
    Select Case Lang.name 
     Case Lang.LangShortcut.PL 
      dr = MessageBox.Show(Me, "Kontynuować zamykanie okna?", MsgLevel.QUESTION.ToString, MessageBoxButtons.YesNo, MessageBoxIcon.Question) 
     Case Lang.LangShortcut.EN 
      dr = MessageBox.Show(Me, "Are you sure you want to quit?", MsgLevel.ZAPYTANIE.ToString, MessageBoxButtons.YesNo, MessageBoxIcon.Question) 
     Case Else 
    End Select 

    ' Confirm user wants to close 
    Select Case dr 
     Case DialogResult.No 
      e.Cancel = True 
      Exit Select 
     Case Else 
       Projekt.UnlockAllLockedProjects() 
      End 'completly close app 
    End Select 
End Sub 

问题是的,我们假设会出现应用程序错误,因此应用程序会崩溃或手动将其放在代码End子句中的其他位置。我如何确保Projekt.UnlockAllLockedProjects()将在应用程序退出前始终执行。有什么地方可以放置它吗?

+0

什么是程序的入口点?它是MDI形式,“Sub Main”还是其他任何形式。此MDI表单始终是应用程序的最后一种形式,即,是否存在多个MDI表单或任何其他非MDI子表单,即使在关闭此MDI后也可能处于活动状态? – haraman

+0

第一种形式是登录表单,当用户输入凭据时,如果他们正确我正在显示新表单,它是mdi容器和隐藏登录表单 – Arie

+0

不要使用'End'。没有理由做任何事情结束应用程序,因为它会结束*除非*您取消。这应该通常工作,如果这种形式是最后关闭的形式(这就是你显然已经配置了应用程序),并没有一些未处理的异常其他地方 – Plutonix

回答

0

我会在模块中使用Sub Main,它将显示GUI并最终在Try ... Catch中处理解锁过程。

  1. 将模块添加到项目中。
  2. 添加一个Sub Main到模块。
  3. 在Sub Main中,使用Try ... Catch来显示表单并处理异常。
  4. 将Startup对象设置为Sub Main(项目>属性>应用程序)。

例子:

Module Program 

    Public Sub Main(ByVal cmdArgs() As String) 
     Try 
      Application.Run(frmLogin) 
     Catch ex As Exception 
      'Any special code for handling exceptions goes here. 
     Finally 
      Projekt.UnlockAllLockedProjects() 
     End Try 
    End Sub 

End Module 
+0

我应该补充说明如果你使用End语句,这段代码将不起作用。这立即终止执行。这应该处理大多数异常,但是它们是否明确提出或者是一些无意的运行时状况的结果。 – JerryM