想要使用VB提供的應用程式架構, 但又想自己控制初始執行表單的順序...
這是上課時同學問的問題.
他的問題細節是這樣的, 要先有一個登入視窗, 通過登入流程之後, 顯示SplashScreen 之後才是MainForm.
過去我們會將這程序寫在Sub Main, 然後專案的"啟動表單"指定成為Sub Main.
但是在Visual Studio的Visual Basic專案, 若要指定Sub Main必須將"啟用應用程式架構"停用, 這代表無法享用Visual Baisc提供的應用程式架構, 這個同學的需求中又需要用到這個架構, 該如何解決這問題呢?
測試了一下, 我的解決方案如下:
Step1.使用 "檢視應用程式事件"
Step2.在ApplicationEvents.vb 覆寫 OnInitialize 方法
Protected Overrides Function OnInitialize(ByVal commandLineArgs As System.Collections.ObjectModel.ReadOnlyCollection(Of String)) As Boolean
LoginForm1.ShowDialog()
If User.IsAuthenticated Then
Return MyBase.OnInitialize(commandLineArgs)
End If
End Function
使用User.IsAuthenticated 檢查是否通過驗證, 如果通過驗證才繼續初始化(呼叫 MyBase.OnInitialize(commandLineArgs) ), 如果未呼叫MyBase.OnInitialize的話, Application不會繼續初始化, 應用程式就會自動結束.
完成!!
A1: 為什麼要覆寫OnInitialize 而不寫在Statup 事件?
Q1: 因為Statup事件已經啟動SplashScreen, 不符合要先Login 再進SplshScreen 的需求. 而且無法控制登入失敗要終止程式(無法呼叫Application.Exit方法)
A2: 怎麼寫LoginForm1的程式?
Q2: 以下步驟解說:
step1: 加入新項目, 選取"登入表單"
step2: 允許兩次登入失敗, 宣告變數記錄
Dim errorTry As Short = 0
step3: 修改OK 按鈕的Click事件如下: (要Imports System.Security.Principal)
Private Sub OK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OK.Click
Dim roles() As String
If Not CheckUser(UsernameTextBox.Text, PasswordTextBox.Text, roles) Then
errorTry += 1
If errorTry >= 3 Then
Me.Close()
End If
Return
End If
Dim iden As New GenericIdentity(UsernameTextBox.Text)
My.User.CurrentPrincipal = New GenericPrincipal(iden, roles)
Me.Close()
End Sub
在登入成功之後, 設定My.User.CurrentPrincipal, 就可以讓User.IsAuthenticated 回傳True.
step4: CheckUser 方法是寫檢查帳號密碼的程式, 請自行設計, 下列程式僅供參考.
Private Function CheckUser(ByVal Username As String, ByVal Password As String, ByRef Roles() As String) As Boolean
If String.IsNullOrEmpty(Username) Then
Return False
End If
Roles = New String() {"Users"}
Return True
End Function