Events
Event คือสิ่งที่ทำให้คลาสหรือออบเจ็คสามารถแจ้งเตือนไปยังคลาสหรือออบเจ็คอื่นได้เมื่อมีบางอย่างได้เกิดขึ้นในโปรแกรม โดยการทำงานของ Event จะมีสองส่วนคือ ส่วนที่เป็นแหล่งกำเนิด (raise) ของ Event นั้นจะเรียกว่า sender และส่วนที่ทำหน้าที่จัดการกับ Event จะเรียกว่า handler
ในภาษา Visual Basic โดยปกติแล้วการเขียนโปรแกรมกับ Windows form นั้นจะเกิด Event ขึ้นในตอนที่ผู้ใช้กดปุ่ม คลิกเมาส์ หรือลากวัตถุไปมาบนหน้าจอ ดังนั้น Event จึงมักจะเป็นสิ่งที่ไม่สามารถบอกเวลาที่จะเกิดขึ้นอย่างแน่นอนได้ หรือในการพัฒนาเกม เมื่อวัตถุสองวัตถุชนกันจะทำให้เกิด Event ของการชนขึ้น ดังนั้นเราจึงจำเป็นต้องเขียนโปรแกรมเพื่อที่จะจัดการกับ Event เหล่านี้
การสร้าง Event
เราจะยกตัวอย่างการใช้งาน event กับระบบเตือนเพลิงไหม้ โดยจะมี sensor ตรวจจับอุณหภูมิว่าถ้ามีอุณหภูมิที่สูงเกินไป จะส่งสัญญาณแจ้งเตือน ดังนั้น event ก็คือการดังขึ้นของสัญญาณแจ้งเตือน และตัวกำเนิด event ก็คือ sensor ที่ทำการตรวจจับอุณหภูมินั่นเอง
Module EventExample
Dim WithEvents FireEvent As New FireEventClass
Sub Main()
Dim Generator As Random = New Random()
For i = 1 To 10
Dim temp As Integer = Generator.Next(10, 70)
Console.WriteLine(temp)
If temp >= 54 Then
FireEvent.RaiseEvents(temp)
End If
Next
End Sub
Sub EClass_EventHandler(ByVal t As Integer
) Handles FireEvent.TemperatureHighEvent
Console.WriteLine("Alarm sound occurred at " & t & " Celsius")
End Sub
End Module
Class FireEventClass
Public Event TemperatureHighEvent(ByVal t As Integer)
Sub RaiseEvents(ByVal t As Integer)
RaiseEvent TemperatureHighEvent(t)
End Sub
End Class
ในตัวอย่างเป็นโปรแกรมระบบแจ้งเตือนไฟไหม้ถ้ามีอุณหภูมิที่สูงกว่ากำหนด โดยเราจะทำการสุ่มค่าตัวเลขของอุณหภูมิมาแล้วตรวจสอบเงื่อนไขในการเกิด Event ซึ่งเป็นการสร้าง Event พื้นฐานในภาษา Visual Basic
Class FireEventClass
Public Event TemperatureHighEvent(ByVal t As Integer)
....
นี่เป็นคลาสสำหรับการจัดการ Event เราได้ประกาศตัวแปร Event TemperatureHighEvent
เป็นตัวแปรสำหรับกำหนด Event ที่มีอุณหภูมิสูงกว่าปกติ
Sub RaiseEvents(ByVal t As Integer)
RaiseEvent TemperatureHighEvent(t)
End Sub
เมธอด RaiseEvents()
เป็นเมธอดในการสั่งให้เกิด Event ภายในเมธอดเป็นคำสั่งที่ทำให้เกิด Event ขึ้นหรือเรามักจะเรียกว่า raise event โดยการใช้คำสั่ง RaiseEvent
และตามด้วย Event ที่ต้องการจะ raise
Module EventExample
Dim WithEvents FireEvent As New FireEventClass
...
ในโมดูลหลักของโปรแกรม เราได้ประกาศออบเจ็คจากคลาส FireEventClass
กับคำสั่ง WithEvents
เพราะว่าเราจะกำหนด Handler เมธอดสำหรับ Event ภายในคลาสนี้
Sub EClass_EventHandler(ByVal t As Integer
) Handles FireEvent.TemperatureHighEvent
Console.WriteLine("Alarm sound occurred at " & t & " Celsius")
End Sub
ต่อไปเป็นการกำหนด Handler เมธอดให้กับ TemperatureHighEvent
Event สำหรับออบเจ็ค FireEvent
นั่นหมายความว่าเมื่อ Event ของออบเจ็คถูก raise เมธอดนี้จะทำงาน
If temp >= 54 Then
FireEvent.RaiseEvents(temp)
End If
ในคำสั่ง For loop เราได้ทำการสุ่มตัวเลขอุณหภูมิระหว่าง 10 - 70 องศาเซลเซียส โดยถ้ามากกว่า 54 เราทำการ raise Event ขึ้น
54
Alarm sound occurred at 54 Celsius
64
Alarm sound occurred at 64 Celsius
69
Alarm sound occurred at 69 Celsius
49
47
10
15
50
28
36
นี่เป็นผลลัพธ์ของโปรแกรม ซึ่งในการรันแต่ละครั้งอาจจะแตกต่างกันเพราะว่าเราได้สุ่มตัวเลข
การใช้งาน Event กับ Delegate
ในการสร้าง Event ในภาษา Visual Basic นั้นคุณยังสามารถใช้ Delegate เพื่อกำหนดฟังก์ชันการทำงานให้กับ Event ได้ ต่อไปเป็นตัวอย่างในการใช้งาน Event กับ Delegate
Module DelegateEventExample
Delegate Sub OnFireEventHandler(ByVal sender As Object, ByVal e As EventArgs)
Sub Main()
Dim FireEvent As New FireEventClass
AddHandler FireEvent.TemperatureHighEvent, AddressOf EClass_EventHandler
Dim Generator As Random = New Random()
For i = 1 To 10
Dim temp As Integer = Generator.Next(10, 70)
Console.WriteLine(temp)
If temp >= 54 Then
FireEvent.OnFireEventHandler()
End If
Next
End Sub
Sub EClass_EventHandler(ByVal sender As Object, ByVal e As EventArgs)
Console.WriteLine("Alarm sound occurred")
End Sub
End Module
Class FireEventClass
Public Event TemperatureHighEvent As OnFireEventHandler
Public Sub OnFireEventHandler()
RaiseEvent TemperatureHighEvent(Me, EventArgs.Empty)
End Sub
End Class
ในตัวอย่างเป็นโปรแกรมเหมือนกับตัวอย่างก่อนหน้า ในตอนนี้เราได้ใช้ Delegate ในการกำหนด Callback เมธอดสำหรับ Event แทน โดยเราได้สร้าง Delegate สำหรับเมธอด EClass_EventHandler()
AddHandler FireEvent.TemperatureHighEvent, AddressOf EClass_EventHandler
นี่เป็นการกำหนด Callback เมธอดให้กับ Event โดยการใช้ Delegate ในภาษา Visual Basic ซึ่งจะได้ผลลัพธ์การทำงานเช่นเดียวกันกับตัวอย่างก่อนหน้าโดยกรใช้คำสั่ง Handles
ในบทนี้ คุณได้เรียนรู้เกี่ยวกับ Event ในภาษา Visual Basic การสร้างและใช้งาน Event และการใช้งาน Event ร่วมกับ Delegate ซึ่งคุณจะได้ทำงานกับ Event มากขึ้นเมื่อเขียนโปรแกรมกับ Windows Form ซึ่งอยู่นอกเหนือขอบเขตของบทเรียนนี้