2008年8月23日 星期六

VB 的Windows 應用程式程式架構

想要使用VB提供的應用程式架構, 但又想自己控制初始執行表單的順序...

這是上課時同學問的問題.

他的問題細節是這樣的, 要先有一個登入視窗, 通過登入流程之後, 顯示SplashScreen 之後才是MainForm.

過去我們會將這程序寫在Sub Main, 然後專案的"啟動表單"指定成為Sub Main.

但是在Visual Studio的Visual Basic專案, 若要指定Sub Main必須將"啟用應用程式架構"停用, 這代表無法享用Visual Baisc提供的應用程式架構, 這個同學的需求中又需要用到這個架構, 該如何解決這問題呢?

測試了一下, 我的解決方案如下:

Step1.使用 "檢視應用程式事件"

1

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

1 則留言:

  1. 羅老師您好!

    買了您的書(VB2008最佳實務講座)才知道您有blog,我之前有在台中跟台北恆逸上過SQL的課,雖沒有上過您的課,但您寫的書很有"功力",也給我很多的啟發、讓我學到很多新的東西!(即使在看過好幾本VB的書籍,也練習寫過一些程式之後)

    我想跟老師您請教一個Disk Buffer的問題,因為我要讀取的檔案過大,光一個就數十到上百MB,可以請問老師提供我哪裡有書籍或是網頁資料,可以找到這個技術的運作原理? 讓我可以順利的應用在實作上! (我上台北天瓏書局找遍所有的VB中英文書都找不到相關的資料) 我目前為止僅接觸過VB2008這個程式 (我是寫程式的初學者),或許其他書也會提到也說不定,希望老師能撥空為我解個惑!

    如果可以的話,可以請老師您回信到我下面的信箱,或是發表意見到我剛申請的BLOG嗎?

    http://jackson-lai.blogspot.com/
    jlai.2006小老鼠m2k.com.tw

    學生在此感激不盡!

    回覆刪除