Events

29 October 2016

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 ซึ่งอยู่นอกเหนือขอบเขตของบทเรียนนี้

บทความนี้เป็นประโยชน์หรือไม่? Yes · No