สวัสดีครับ ไม่เข้ามาแวะใน HosXP เสียนาน เช้านี้ว่าง ๆ เลยนั่งเขียนบทความเกี่ยวกับการเขียนโปรแกรมด้วย VB.NET 2005 มาให้พี่ ๆ น้อง ๆ ที่สนใจอ่านครับ (คงไม่มีใครว่าผมที่ผมเอา VB พูดในกลุ่ม Delphi นะครับ
) วันนี้ผมหยิบยกเรื่องการทำ Delegate มาพูดให้ฟัง การทำ Delegate เป็น pointer function ซึ่งกำหนดให้ sub ใด ๆ หรือ function ใด ๆ ทำงานแทน พูดแล้วอาจงงครับ ไปดูตัวอย่างกันเลยดีกว่า
จากตัวอย่าง ผมทำโปรแกรมเล็ก ๆ โดยกำหนดชื่อ controls ตามภาพเลยครับ และตัวอย่าง code ของโปรแกรมอยู่ด้านล่างครับ
=====================================================================
Public Class Form1
Private Delegate Sub TestCommand()
Private Delegates As TestCommand
Private Sub SetDelegates()
If Me.r1.Checked Then
Delegates = New TestCommand(AddressOf SayHelloWorld)
ElseIf Me.r2.Checked Then
Delegates = New TestCommand(AddressOf SayHelloHosxp)
ElseIf Me.r3.Checked Then
Delegates = New TestCommand(AddressOf InputNumber)
ElseIf Me.r4.Checked Then
Delegates = New TestCommand(AddressOf SayHelloWorld)
Delegates = System.Delegate.Combine(Delegates, New TestCommand(AddressOf SayHelloHosxp), _
New TestCommand(AddressOf InputNumber))
Else
Exit Sub
End If
End Sub
Private Sub SayHelloWorld()
MessageBox.Show("Hello World", "Delegate!!!", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1)
End Sub
Private Sub SayHelloHosxp()
MessageBox.Show("Hello HosXP !!!", "Delegate!!!", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1)
End Sub
Private Sub InputNumber()
lv.Items.Clear()
For i As Integer = 1 To 100
lv.Items.Add("My number is " & i)
Next
End Sub
Private Sub bt_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bt.Click
Delegates()
End Sub
Private Sub r1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles r1.CheckedChanged
SetDelegates()
End Sub
Private Sub r2_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles r2.CheckedChanged
SetDelegates()
End Sub
Private Sub r3_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles r3.CheckedChanged
SetDelegates()
End Sub
End Class
=====================================================================
จากตัวอย่างจะเห็นว่าเมื่อผมกดปุ่ม bt ลงไปจะไปสั่งให้ Delegates ทำงาน ซึ่งตัว Delegates ก็อ้างอิงไปถึง TestCommand จึงสั่งไปให้ TestCommand เลือกรูปแบบการทำงานตามคำสั่งจาก sub SetDelegates กล่าวคือ ผมจะไล่ step การทำงานตาม code นี้ให้ดูนะครับ
1.bt_click
2.เรียก SetDelegates ทำงาน ภายใน SetDelegate จะมองดูว่าเงื่อนไขไหนเป็นจริง เช่น เงื่อนไข r1 เป็นจริง ก็จะทำงานต่อว่าไปถาม TestCommand ให้เรียก sub SayHelloWorld ขึ้นมาทำงาน
คงเข้าใจกันนะครับ สำหรับคนที่สนใจก็ลองไปดูครับ เพราะเรื่องของ Delegate มีประโยชน์มากในหลายเรื่อง เช่นการ Add Handler หรือการทำ Thread ก็ลองดูนะครับ พี่ ๆ น้อง ๆ ใครที่สนใจหรือใช้ VB.NET อยู่แวะเวียนมาคุยกันได้นะครับจะได้แลกเปลี่ยนประสบการณ์กัน ขอบคุณมากครับ