一、代碼
Private Sub Form1_Load(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles MyBase.Load
Button1.Text = "Start"
mText = New TimerState
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles Button1.Click
mText.StartCountdown(10.0, 0.1)
End Sub
Private Sub mText_ChangeText() Handles mText.Finished
TextBox1.Text = "Done"
End Sub
Private Sub mText_UpdateTime(ByVal Countdown As Double) _
Handles mText.UpdateTime
TextBox1.Text = Format(Countdown, "##0.0")
' Use DoEvents to allow the display to refresh.
My.Application.DoEvents()
End Sub
Class TimerState
Public Event UpdateTime(ByVal Countdown As Double)
Public Event Finished()
Public Sub StartCountdown(ByVal Duration As Double, _
ByVal Increment As Double)
Dim Start As Double = DateAndTime.Timer
Dim ElapsedTime As Double = 0
Dim SoFar As Double = 0
Do While ElapsedTime < Duration
If ElapsedTime > SoFar + Increment Then
SoFar += Increment
RaiseEvent UpdateTime(Duration - SoFar)
End If
ElapsedTime = DateAndTime.Timer - Start
Loop
RaiseEvent Finished() End Sub
End Class
二、解釋Event和RaiseEvent意義
Event 相當於給類定義了一個自定義事件,可以在調用此類的時候,給此事件添加代碼
RaiseEvent 是給自定義事件添加的代碼執行的位置,
簡單說,如果你只是添加個事件,沒有在相應位置觸發事件,等於事件沒定義
三、解釋代碼
1.首先點擊 Button1_Click然后就運行:
mText.StartCountdown(10.0, 0.1)
在這個StartCountDown函數中通過:
RaiseEvent UpdateTime(Duration - SoFar) 觸發事件,就會調用上面:Private Sub mText_UpdateTime(ByVal Countdown As Double) Handles mText.UpdateTime 這個過程。更新數值,顯示在textbox1上面。
2.當運行完 Do While ElapsedTime < Duration 這個循環時候,就會觸發事件:
RaiseEvent Finished()
就會調用:
Private Sub mText_ChangeText() Handles mText.Finished
TextBox1.Text = "Done"
End Sub
顯示Done。
四、通俗理解
可以這么理解
private sub xx
起床()
raiseevent 過程()
上班()
end sub
----
寫這個方法的人知道有這么個過程,但是不確定具體應該怎么做
比如是做公交還是打的,還是拼車,還是其他什么,於是提供一個
事件給外部使用,其他使用該方法的人可以在這個事件里面寫具體的
過程
----
通常用在繼承的控件中,比如控件中button的click事件,因為控件已經封裝在外部是不能再寫該事件的,
而寫控件的人又不能確定在click事件中應該怎么操作,於是提供一個公開的事件讓外面的人自己去寫,
等於是外部調用的人間接寫click事件