天天看點

vb和vb.net事件機制

學習java事件前,回顧了下vb6和vb.net的事件機制,總結在這裡,供對比用。

    事件是面對對象中對象間通信的方法。事件發生者(又叫事件源)發生一個事件時,通過發送一條消息,給事件接受者(事件處理者),事件接受者可以做出響應的處理。比如在某登入界面中,單擊一個按鈕,系統會驗證使用者的使用者名和密碼是否正确。使用者單擊按鈕後,按鈕(事件源)發出了單擊事件,産生了自己被單擊的消息給窗體,窗體(事件接受者)在自身代碼視窗中進行響應的處理。

我們分别看下在vb和vb.net中是怎麼實作事件機制的。

    在vb6中,使用Event關鍵字定義事件,raiseEvent發出事件消息,在接受者的類中使用WithEvent表明自己是某個類的事件的接受者,我們看這樣兩段代碼:

    首先建立一個窗體,是一個登入窗體,輸入使用者名和密碼後,點選登陸按鈕可以登陸,代碼(vb6)如下,使用了WithEvent來接收驗證類(verifyClass)的消息:

Option Explicit

'本句代碼表明該窗體能接受驗證類的事件消息
Private WithEvents vfClass As VerifyClass

Private Sub cmdLogin_Click()
    '定義使用者名和密碼
    Dim userName As String
    Dim password As String
    '定義傳回結果
    Dim Result As Boolean
    Set vfClass = New VerifyClass
    
    userName = txtUserName.Text
    password = txtPassword.Text
    
    '将使用者名和密碼傳到驗證類進行驗證
    Result = vfClass.Verify(userName, password)
    
End Sub

Private Sub Form_Load()

End Sub

'引發驗證失敗事件後,在此處可以進行相應處理
Private Sub vfClass_loginFail(ByVal userName As String)
    MsgBox (userName + "登入失敗")
End Sub
'驗證成功事件
Private Sub vfClass_LoginSuccess(ByVal userName As String)
     MsgBox (userName + "登入成功")
End Sub
      

接下來添加一個類子產品,是登陸窗體中用到的驗證類(verifyClass)的代碼,裡面定義(Event)了并引發(raiseEvent)了事件:

Option Explicit

'定義驗證成功和失敗的事件
Public Event LoginSuccess(ByVal userName As String)
Public Event loginFail(ByVal userName As String)

'驗證方法:對使用者名和密碼進行驗證
Public Function Verify(ByVal userName As String, ByVal password As String) As Boolean
    Dim blnResult As Boolean
    
    If userName = "123" And password = "123" Then
        '如果正确,發出登陸成功的消息
        RaiseEvent LoginSuccess(userName)
        blnResult = True
    Else
        '錯誤則發出登陸失敗的消息
        RaiseEvent loginFail(userName)
         blnResult = False
    End If
    Verify = blnResult
    
End Function
      

在vb.net中事件的實作機制同vb基本相同,并且有了優化,通過Handles關鍵字,使事件實作的機制更靈活,handles可以使多個事件到同一個事件處理程式:

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click, Button3.Click
        System.Windows.Forms.MessageBox.Show("我被觸發了")
End Sub      

也可以通過AddHandler動态的綁定事件處理程式,即可以根據當時的條件選擇将要綁定的事件處理程式,看下面這個例子。

首先定義一個person類,有走路這個事件,在走路方法中觸發走路事件

Public Class Person

    Public Event walked(ByVal Distance As Integer)

    Public Sub walk(ByVal Distance As Integer)
        RaiseEvent walked(Distance)
    End Sub

End Class
      

接下來建立一個窗體類,窗體上有一個文本框和一個按鈕,代碼如下

Public Class Form1
    '本句代碼表明該窗體能接受驗證類的事件消息
    Public WithEvents objPerson As Person


    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click, Button2.Click
        objPerson = New Person()
        '滿足條件下才執行綁定操作
        If (TextBox1.Text = "1") Then
            '滿足條件,執行動态綁定,将事件綁定到某方法,該方法轉變成事件處理程式
            AddHandler objPerson.walked, AddressOf Person_walk
            objPerson.walk(50)
        Else
            System.Windows.Forms.MessageBox.Show("您輸入的文本不是1")
        End If

    End Sub
    '觸發的事件将綁定到本事件處理程式
    Public Sub Person_walk(ByVal Distance As Integer)
        System.Windows.Forms.MessageBox.Show("a person walked" + Distance.ToString() + " kilometer!")
    End Sub

End Class      

這就是vb和vb.net的事件處理機制,等學了java事件機制後将進行對比。