vb和vb.net事件机制
學(xué)習(xí)java事件前,回顧了下vb6和vb.net的事件機(jī)制,總結(jié)在這里,供對(duì)比用。
??? 事件是面對(duì)對(duì)象中對(duì)象間通信的方法。事件發(fā)生者(又叫事件源)發(fā)生一個(gè)事件時(shí),通過發(fā)送一條消息,給事件接受者(事件處理者),事件接受者可以做出響應(yīng)的處理。比如在某登錄界面中,單擊一個(gè)按鈕,系統(tǒng)會(huì)驗(yàn)證用戶的用戶名和密碼是否正確。用戶單擊按鈕后,按鈕(事件源)發(fā)出了單擊事件,產(chǎn)生了自己被單擊的消息給窗體,窗體(事件接受者)在自身代碼窗口中進(jìn)行響應(yīng)的處理。
?
我們分別看下在vb和vb.net中是怎么實(shí)現(xiàn)事件機(jī)制的。
??? 在vb6中,使用Event關(guān)鍵字定義事件,raiseEvent發(fā)出事件消息,在接受者的類中使用WithEvent表明自己是某個(gè)類的事件的接受者,我們看這樣兩段代碼:
??? 首先建立一個(gè)窗體,是一個(gè)登錄窗體,輸入用戶名和密碼后,點(diǎn)擊登陸按鈕可以登陸,代碼(vb6)如下,使用了WithEvent來接收驗(yàn)證類(verifyClass)的消息:
?
Option Explicit'本句代碼表明該窗體能接受驗(yàn)證類的事件消息 Private WithEvents vfClass As VerifyClassPrivate Sub cmdLogin_Click()'定義用戶名和密碼Dim userName As StringDim password As String'定義返回結(jié)果Dim Result As BooleanSet vfClass = New VerifyClassuserName = txtUserName.Textpassword = txtPassword.Text'將用戶名和密碼傳到驗(yàn)證類進(jìn)行驗(yàn)證Result = vfClass.Verify(userName, password)End SubPrivate Sub Form_Load()End Sub'引發(fā)驗(yàn)證失敗事件后,在此處可以進(jìn)行相應(yīng)處理 Private Sub vfClass_loginFail(ByVal userName As String)MsgBox (userName + "登錄失敗") End Sub '驗(yàn)證成功事件 Private Sub vfClass_LoginSuccess(ByVal userName As String)MsgBox (userName + "登錄成功") End Sub接下來添加一個(gè)類模塊,是登陸窗體中用到的驗(yàn)證類(verifyClass)的代碼,里面定義(Event)了并引發(fā)(raiseEvent)了事件:
?
?
Option Explicit'定義驗(yàn)證成功和失敗的事件 Public Event LoginSuccess(ByVal userName As String) Public Event loginFail(ByVal userName As String)'驗(yàn)證方法:對(duì)用戶名和密碼進(jìn)行驗(yàn)證 Public Function Verify(ByVal userName As String, ByVal password As String) As BooleanDim blnResult As BooleanIf userName = "123" And password = "123" Then'如果正確,發(fā)出登陸成功的消息RaiseEvent LoginSuccess(userName)blnResult = TrueElse'錯(cuò)誤則發(fā)出登陸失敗的消息RaiseEvent loginFail(userName)blnResult = FalseEnd IfVerify = blnResultEnd Function?
在vb.net中事件的實(shí)現(xiàn)機(jī)制同vb基本相同,并且有了優(yōu)化,通過Handles關(guān)鍵字,使事件實(shí)現(xiàn)的機(jī)制更靈活,handles可以使多個(gè)事件到同一個(gè)事件處理程序:
?
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click, Button3.ClickSystem.Windows.Forms.MessageBox.Show("我被觸發(fā)了") End Sub?
?
也可以通過AddHandler動(dòng)態(tài)的綁定事件處理程序,即可以根據(jù)當(dāng)時(shí)的條件選擇將要綁定的事件處理程序,看下面這個(gè)例子。
首先定義一個(gè)person類,有走路這個(gè)事件,在走路方法中觸發(fā)走路事件
?
Public Class PersonPublic Event walked(ByVal Distance As Integer)Public Sub walk(ByVal Distance As Integer)RaiseEvent walked(Distance)End SubEnd Class接下來新建一個(gè)窗體類,窗體上有一個(gè)文本框和一個(gè)按鈕,代碼如下
?
?
Public Class Form1'本句代碼表明該窗體能接受驗(yàn)證類的事件消息Public WithEvents objPerson As PersonPrivate Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click, Button2.ClickobjPerson = New Person()'滿足條件下才執(zhí)行綁定操作If (TextBox1.Text = "1") Then'滿足條件,執(zhí)行動(dòng)態(tài)綁定,將事件綁定到某方法,該方法轉(zhuǎn)變成事件處理程序AddHandler objPerson.walked, AddressOf Person_walkobjPerson.walk(50)ElseSystem.Windows.Forms.MessageBox.Show("您輸入的文本不是1")End IfEnd Sub'觸發(fā)的事件將綁定到本事件處理程序Public Sub Person_walk(ByVal Distance As Integer)System.Windows.Forms.MessageBox.Show("a person walked" + Distance.ToString() + " kilometer!")End SubEnd Class
這就是vb和vb.net的事件處理機(jī)制,等學(xué)了java事件機(jī)制后將進(jìn)行對(duì)比。
?
轉(zhuǎn)載于:https://www.cnblogs.com/snake-hand/p/3155433.html
總結(jié)
以上是生活随笔為你收集整理的vb和vb.net事件机制的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TP-Link TL-WDR6600 无
- 下一篇: JQuery插件:动态列和无间隙网格布局