Event , Methods และ Properties

อีเวนต์ (Events)
เกริ่นนำ…ในการเขียนโปรแกรมเชิงวัตถุ(Object Oriented Program) สิ่งที่จำเป็นอย่างยิ่งที่จะต้องรู้ก็คือการทำงานของ event ต่างๆที่เกิดขึ้นกับ object นั้นๆ ยิ่งถ้าท่านเคยทำการเขียนโปรแกรมแบบโครงสร้างมาก่อนแล้ว พอมาเจอกับ event งงเป็นไก่ตาแตก บางท่านถึงกับเลิกที่จะเรียนรู้ไปเลย ผมก็เป็นคนหนึ่งในจำนวนนั้นเหมือนกัน แต่ชีวิตนี้ยังมีหวังเลยไปรายการฝันที่เป็นจริง คุณไตรภพให้รถเข็นขายก๋วยเตี๋ยวมาคันหนึ่ง ก็เลยคิดได้ตั้งหน้าตั้งตากลับมาศึกษาใหม่หมด เลยได้สัจจะธรรมของเหตุการณ์(event) ต่างๆใน Visual FoxPro ว่าระหว่างที่เราทำงานกับวัตถุหนึ่งๆมันเกิดเหตุการณ์ขึ้นมากับ วัตถุนั้นหลายอย่างด้วยกัน แต่พอเกิดแล้วเราไม่รู้สึกว่ามันเกิดอะไรขึ้นหรอกเพราะเนื่องจากเรายังไม่ได้ทำการนำมันไปใช้งาน แต่ก่อนที่คุณจะนำมันไปใช้งานนั้นคุณต้องทำความเข้าใจกับลำดับการทำงานของ event ต่างๆกันก่อนว่าไก่กับไข่อะไรเกิดก่อน

ให้คุณทำการ download ฟอร์ม EVENTEST แล้วลองทำการรันฟอร์มขึ้นมาดู คุณได้เห็นลำดับของการทำงานของ event ที่เกิดขึ้นกับฟอร์มนี้ตั้งแต่ load ฟอร์ม จนถึง unload ฟอร์มเป็น event สุดท้ายที่เกิดขึ้น
ให้คุณทำการ เรียกฟอร์มโดยใช้คำสั่ง DO FORM EVENTEST NAME FORMOBJ

c8001.JPG (7795 bytes)

event Load จะเกิดเป็นอันดับแรก เมื่อเราทำการเรียกฟอร์มขึ้นมาใช้งาน
event Init จะเกิดเป็นอันดับถัดมา event นี้จะเกิดกับ object ทุกๆ object ส่วนใหญ่จะใช้ในการกำหนดค่าเริ่มต้นต่างๆของ object หรือกำหนดให้ทำงานอย่างใดอย่างหนึ่งซึ่งจะทำเพียงครั้งเดียวเมื่อเรียกฟอร์มนั้นมาใช้งาน
event Activate จะเกิดเมื่อฟอร์มนี้แสดงขึ้นมา หรือเมื่อฟอร์มนั้นถูกกระทำ ให้คุณลองคลิ๊กเมาส์ไปที่ command window แล้วกลับมาคลิ๊กที่ ฟอร์ม eventest อีกครั้ง event นี้ก็จะทำงาน หรือถ้าคุณพิมพ์คำสั่ง FORMOBJ.HIDE ที่ command windows เพื่อทำการซ่อนฟอร์ม แล้วใช้คำสั่ง FORMOBJ.SHOW เพื่อทำการแสดงฟอร์ม event นี้ก็จะทำงานเหมือนกัน
event When จะเกิดขึ้นกับ object ที่ cursor นั้นจะไปปรากฏอยู่ซึ่งตอนนี้ event When จะอยู่ที่ object Text1 (ถ้าเพิ่งทำการรันฟอร์มขึ้นมา) ส่วนใหญ่เราจะใช้ event นี้ในการเช็คว่าจะให้สามารถเข้ามาที่ object นี้ได้หรือไม่ ให้คุณลองเข้าไปแก้ไขฟอร์ม EVENTEST แล้วเข้าไปที่ object text2 เขียนคำสั่งใน event When ดังนี้
RETURN !EMPTY(THIS.PARENT.TEXT1.VALUE)
คำสั่งข้างต้นเป็นการเช็คว่าถ้า object text1 มีข้อมูลถึงเข้ามาทำงานที่ object text2 ได้
event GotFocus จะเกิดเมื่อเราทำการ focus ไปที่ objcet นั้นสังเกตุให้ดีว่า event นี้จะเกิดหลังจาก event When ถ้าผ่านจาก event When มาได้ถึงจะมาทำงานที่ GotFocus คำสั่งประเภท focus นี้มีประโยชน์มาใน Visual FoxPro ต่อๆไปคุณจะได้ใช้มันอย่างแน่นนอน
event KeyPress จะเกิดขึ้นเมื่อคุณทำการกดคีย์ใดๆก็ตามบน keyboard คุณได้พบกับการใช้ไปแล้วในการสร้างเครื่องคิดเลข
event InteractiveChange จะเกิดขึ้นเมื่อ object นั้นๆเกิดการเปลี่ยนแปลง
event Valid event นี้ส่วนใหญ่จะใช้ในการตรวจสอบข้อมูลของ object นั้นว่าป้อนข้อมูลถูกต้องหรือไม่ ให้คุณลองเข้าไปแก้ไขฟอร์ม EVENTEST แล้วเข้าไปที่ object text1 เขียนคำสั่งใน event Valid ดังนี้
RETURN !EMPTY(THIS.PARENT.TEXT1.VALUE)
คำสั่งข้างต้นเป็นการเช็คว่าถ้า object text1 ไม่ได้มีการป้อนข้อมูลก็ไม่สามารถออกจาก object นี้ได
event LostFocus จะเกิดขึ้นเมื่อเราจะทำการละออกจาก object นั้นๆ วิธีการใช้งานจะอธิบายต่ออีกทีในตอนหน้า
event Click จะเกิดขึ้นเมื่อเราทำการคลิ๊กเมาส์ 1 ครั้ง หรือกดปุ่ม enter ที่ object นั้นๆ event นี้คุณก็เคยเห็นบ่อยๆ
event DoubleClick จะเกิดขึ้นเมื่อเราทำการ double click เมาส์ 2 ครั้ง
เมื่อเราทำการออกจากฟอร์ม(ปิดฟอร์ม) จะเกิด event อะไรขึ้นบ้าง
event Destroy จะเกิดกับ object ทุกๆ object ก่อน ซึ่งส่วนใหญ่เราจะใช้ในการ clear ค่าต่างๆที่เกิดขึ้น
event Unload จะเกิดเป็นตอนสุดท้าย หรือท้ายสุด

ACTIVATE SCREEN เป็นคำสั่งที่ให้ทำการแสดงผลบน Main Visual FoxPro Window

เป็นอย่างไรบ้างครับสำหรับ event พื้นฐานที่เราควรรู้ ซึ่ง event ที่ผมากล่าวมานี้เป็นเพียงส่วนหนึ่งเท่านั้น ส่วน event อื่นๆ อีกมากมายจะเกิดขึ้นมาได้อย่างไรนั้น เราต้องย้อนกลับไปดู ที่ control class ของแต่ละตัว ซึ่งแต่ละตัวนั้นจะมี event แตกต่างกันออกไป ถ้าผมจะนำมากล่าวทั้งหมดก็จนปัญญา เพราะผมเองก็ยังรู้ไม่หมดเหมือนกัน ตัวใหนที่ถูกเรียกใช้งานผมพยายามอธิบายรายละเอียดอีกทีก็แล้วกัน

คุณเคยสงสัยบ้างหรือไม่ว่าเวลาตอนคุณเรียก event ขึ้นมาเพื่อจะทำการเขียนโปรแกรมเข้าไปนั้น บาง event ก็มี พารามิเตอร์(Parameter) โผล่ออกมาด้วย บางอันก็ผลุบหายเข้าไปไม่มีขึ้นมา ผมบอกได้คำเดียวว่าคุณควรจะต้องรู้ไว้บ้างว่า ค่าที่แต่ละ event ส่งผ่านมาให้นั้นส่งค่าอะไรมาให้เรา
เช่น เราเรียก Keypress Event ขึ้นมา ก็จะปรากฎพารามิเตอร์ส่งผ่านค่ามาให้ดังนี้
LPARAMETERS nKeyCode, nShiftAltCtrl
เริ่มจาก สัญลักษณ์ n ตัวเล็กข้างหน้าตัวแปรก่อน หมายถึงค่าที่ส่งมาเป็นแบบ ตัวเลข (numeric)
สัญลักษณ์ a หมายถึงค่าที่ส่งมาเป็น อะเรย์ (array)
สัญลักษณ์ c หมายถึงค่าที่ส่งมาเป็น ตัวอักษร (charecter)
สัญลักษณ์ l หมายถึงค่าที่ส่งมาเป็น ตรรกะ .T. , .F. (logical)
สัญลักษณ์ d หมายถึงค่าที่ส่งมาเป็น วันที่ (date)
สัญลักษณ์ f หมายถึงค่าที่ส่งมาเป็น ตัวเลข float
สัญลักษณ์ o หมายถึงค่าที่ส่งมาเป็น ออปเจ็ก (object)
สัญลักษณ์ t หมายถึงค่าที่ส่งมาเป็น วันเวลา (datetime)
สัญลักษณ์ y หมายถึงค่าที่ส่งมาเป็น เคเรนซี่ (currency)
สัญลักษณ์ u หมายถึงค่าที่ส่งมาเป็น unknow
สัญลักษณ์ที่ผมกล่าวมาทั้งหมดนี้ ครอบคุมไปถึงตัวแปรต่างๆของ Visual FoxPro ที่แสดงออกมา
nKeyCode หมายถึง ค่าของปุ่มที่เราได้ทำการกด เช่น กดปุ่ม a (เล็ก) จะได้ค่า 97 ค่าพวกนี้ได้มาจากไหน เป็นค่าในตาราง ANSI Code เราสามารถแปลงค่าตัวเลขนี้กลับมาเป็นตัวอักษรได้โดยใช้ฟังก์ชัน CHR(nKeyCode)
nShiftAltCtrl หมายถึง ค่าที่ส่งออกมาเมื่อเรากดปุ่ม Shift, Ctrl หรือ Alt จะได้ค่า 1,2 และ 4 ตามลำดับ ถ้าไม่ได้กดสามปุ่มดังกล่าวจะได้ค่า 0 ในกรณีที่เรากดปุ่ม Alt กับ Ctrl จะได้ค่าอะไร คุณก็นำค่าที่มันมีมาบวกกัน  2+4=6

หรือ ActivateCell Event ใน คอนโทรกริด (grid control) ส่งผ่านค่า nRow,nCol คือลำดับของ แถวใน และคอลัมน์ ใน grid ณ.ตำแหน่งของ cursor อยู่ เป็นต้น
ส่วนที่เหลือคุณจะได้พบกับมันอีก แน่นอน เนื่องจากอธิบายตอนนี้ก็ไม่หมดเยอะจริงๆ เท่านี้ก่อนเพื่อเป็นแนวทางในการศึกษาต่อไป

เมธอต (Methods)
ในแต่ละ object นั้นจะมีเมธอตให้เราทำการเรียกใช้ หรือให้ object ทำตามคำสั่งที่เราสั่งให้ทำ ถ้าคุณสังเกตุให้ดีๆ คุณก็จะทราบว่า เมธอตก็คือคำสั่งธรรมดาคำสั่งหนึ่งเท่านั้นเองซึ่งก็เหมือนกับคำสั่งทั่วๆไป เพียงแต่ เมธอตส่วนใหญ่จะกระทำกับ object เช่น
Circle Method เป็นคำสั่งใช้วาดรูปวงกลม เช่น   _SCREEN.Circle(100,100,100)
รูปแบบคำสั่ง   Object.Circle (nRadius, nXCoord, nYCoord [, nAspect])
CloneObject Method เป็นคำสั่งที่ใช้สำเนา object ซึ่งจะทำการสำเนาทั้ง properites,event และ method ไปด้วย
รูปแบบคำสั่ง     Object.CloneObject(NewName)
Refresh Method เป็นคำสั่งที่เราใช้ให้ทำการแสดงใหม่ เพื่อทำการแสดงค่าใหม่ที่เกิดขึ้น คำสั่งนี้เราใช้บ่อยมาก
รูปแบบคำสั่ง     [[FormSet.]Object.]Refresh
Object.Refresh

Requery Method เป็นคำสั่งที่ใช้ให้ทำการเรียกใช้งาน SQL อีกครั้งใช้กับคอนโทร ComboBox และ ListBox ซึ่งเราจะใช้ในกรณีที่ต้องการให้แสดงข้อมูลใหม่เพื่อทำการ update ข้อมูลเข้ามาใน ComboBox หรือ ListBox (เมธอตนี้ก็ใช้บ่อย)
รูปแบบคำสั่ง     Control.Requery
Release Method เป็นคำสั่งที่ให้ทำการล้าง ฟอร์ม, ฟอร์มเซ็ตออกจากหน่วยความจำ หรือก็คือการทำให้ออกจากฟอร์มนั้นเอง เราจะใช้กับทุกๆฟอร์มเสมอ
รูปแบบคำสั่ง     Object.Release
Show Method เป็นคำสั่งให้ทำการแสดง ฟอร์ม, ฟอร์มเซ็ต, ทูลบาร์ ขึ้นมา
รูปแบบคำสั่ง     [FormSet.]Object.Show([nStyle])
สำหรับในส่วนของเมธอตของ Visual FoxPro เอาเท่านี้ก่อน ก็แล้ว

ในบางครั้งเมื่อคุณต้องการใช้งาน methods แต่ใน object นั้นไม่มีให้คุณจะทำอย่างไร? คุณต้องทำการสร้าง เมธอต (methods) ขึ้นมา
ในบทที่แล้วคุณได้เห็นการสร้าง method  m_keypress ในการทำเครื่องคิดเลขมาบ้างแล้วทีนี้ผมจะนำมาอธิบายในรายละเอียดอีกครั้ง เกี่ยวกับวิธีการสร้าง วิธีการใช้งานซึ่งเราสามารถนำมันไปใช้งานได้อย่างไรบ้าง และรูปแบบการสร้าง การส่งผ่านค่า
การสร้างนั้นก็มีวิธีการง่ายๆ แต่ควรคำนึงถึงด้วยว่าเราจะสร้างเมื่อไหร่ และจะต้องอยู่ที่ object ในตัวไหน เพื่อที่จะให้การทำงานเกิดประสิทธิภาพสูงสุด
1. ถ้ากรณีทำการสร้างฟอร์ม ให้ทำการคลิ๊กที่เมนู Form หรือ
ถ้ากำลังทำการสร้าง Visual Class Library อยู่ให้คลิ๊กที่เมนู Class
2. เลือก New Method
3. จากนั้นให้พิมพ์ชื่อ Method ที่ต้องการจะสร้าง ในช่อง Name
คุณสามารถใส่หมายเหตุต่างๆได้โดยใส่ไว้ในช่อง Description

c8002.gif (3393 bytes)

เมื่อคุณทำการสร้างเสร็จแล้วคุณสามารถเข้าไปเขียนคำสั่งในเมธอตซึ่งจะเก็บอยู่ในส่วนของ properties ในหัวข้อ methods
การเขียนโค้ดคำสั่ง ของ เมธอตนั้นจะเหมือนกับการเขียน ฟังก์ชั่น การใช้งานก็จะคล้ายกับการเรียกใช้ฟังก์ชั่นอีกเหมือนกัน เมื่อคุณจะทำการเรียกใช้งาน เมธอตนั้นมีรูปแบบการเรียกใช้งานดังนี้
objcetName.MethodName
หรือ ถ้าคุณต้องการส่งผ่านค่าให้กับเมธอตแล้วให้ทำการส่งค่ากลับมายังตัวแปรก็ทำการเรียกใช้งานดังนี้
cVarible = ObjectName.MethodName(cParameter,nParameter..)
หรือ เรียกใช้งานแบบนี้ก็ได้  = ObjectName.MethodName
มาถึงตรงนี้ในส่วนของกาสร้างและการเรียกใช้ เมธอตคงพอจะได้อะไรบ้างไม่มากก็น้อย จริงๆถ้าคุณเคยใช้งาน FoxPro รู่นเก่าหรือใหม่ เมธอตมันก็เหมือนกับ โพซิเยอร์ย่อยๆ(Procedure) นั่นเอง

คุณสมบัติ (Properties)
Properties เป็นการกำหนดคุณสมบัติให้กับวัตถุนั้นๆ ตัวอย่างง่ายๆเลยที่คุณทำการกำหนดก็คือการกำหนดประเภทของฟอนต์ ขนาดของฟอนต์ หรือกำหนดให้วัตถุนั้นสามารถทำอะไรบางอย่างเช่น สามารถเคลื่อนย้ายได้ หรือเปลี่ยนขนาดก็ตาม ซึ่งการกำหนดคุณสมบัติใดๆได้นั้นมันจะขึ้นอยู่กับคอนโทรลที่คุณนำมาทำเป็น object ว่าจะเปิดโอกาศให้มากแค่ไหน ผมจะขอยกตัวอย่าง properties บางตัวให้ดูก่อนก็แล้วกัน
AlwaysOnTop เป็นการสั่งให้แสดงฟอร์มนั้นอยู่บน windows เสมอ
รูปแบบคำสั่ง     Object.AlwaysOnTop[ = lExpr]
AutoCenter เป็นการสั่งให้แสดงฟอร์มนั้นอยู่ตรงกลาง windows
รูปแบบคำสั่ง     Object.AutoCenter [ = lExpr]
Closeable เป็นการกำหนดให้แสดงปุ่ม ปิดฟอร์มหรือไม่
รูปแบบคำสั่ง     Object.Closable[ = lExpr]
WindowState กำหนดขนาดของฟอร์มตอนเริ่มต้นให้มีขนาด 0 ปรกติ, 1 ขยายใหญ่, 2 ย่อเล็ก
รูปแบบคำสั่ง     [Object.]WindowState[ = nState]
WindowType กำหนดลักษณะของการเปิดฟอร์ม ถ้าเป็น 0 สามารถที่จะเปิดฟอร์มต่อไปได้ , 1 จะต้องปิดฟอร์มปัจจุบันก่อนถึงจะทำการเปิดฟอร์มใหม่ได้
รูปแบบคำสั่ง     Object.WindowType[ = nType]
เป็นต้น

คุณสามารถกำหนดคุณสมบัติของ object ทั้งหมดพร้อมๆกันได้โดยใช้คำสั่ง SetAll
รูแบบคำสั่ง Container.SetAll(cProperty, Value [, cClass])
เช่น myForm.myOptionGroup.SetAll(“Enabled”,.F.)

คุณเคยสงสัยบ้างหรือไม่ในบางครั้งเราต้องการใช้งานตัวแปรซักตัวบนฟอร์ม หรือใน object ตัวอื่นๆ เช่น เราอยากได้ตัวแปรสักตัวที่เป็นตัวเลข หรือเป็นแบบตรรกะ เป็นวันที่ เราจะทำอย่างไร ในเรื่องของ properties นี้ Visual FoxPro ก็เปิดโอกาสให้เราสามารถสร้าง properties ของเราขึ้นมาเองได้ ซึ่งส่วนใหญ่ที่ผมสร้างขึ้นมาจะเป็นในลักษณะของตัวแปรเสียมากกว่า ถ้าใครเคยนำไปทำอย่างอื่นได้กรุณาช่วยบอกด้วยก็แล้วกัน ในบทที่แล้วมาเรื่องการสร้างเครื่องคิดเลข คุณจะได้เห็นการสร้าง properties ขึ้นมาบ้างแล้ว ซึ่งวิธีการมีดังนี้คือ

1. ถ้ากรณีทำการสร้างฟอร์ม ให้ทำการคลิ๊กที่เมนู Form หรือ
ถ้ากำลังทำการสร้าง Visual Class Library อยู่ให้คลิ๊กที่เมนู Class
2. เลือก New Property
3. จากนั้นให้พิมพ์ชื่อ property ที่ต้องการจะสร้าง ในช่อง Name
คุณสามารถใส่หมายเหตุต่างๆได้โดยใส่ไว้ในช่อง Description

c8003.JPG (7979 bytes)

คุณสามารถดูตัวอย่างการใช้งาน properties ที่สร้างขึ้นมาใหม่ได้จาก เรื่องของการสร้าง เครื่องคิดเลข เช่นที่ผมทำการสร้างไว้นั้นจะอยู่ในส่วนของ คลาส container calculator ซึ่งก็ได้แก่
r_lnewvalue = .T.
r_ncaltxt = 0
r_coldmath = “+”
หรือ  author = “Program by Kasem K.” เป็นต้น

เป็นอย่างไรบ้างครับ เรียนรู้มาจนถึง ณ. ขณะนี้ ถึงคุณยังเขียนฟอร์มป้อนข้อมูลยังไม่เป็นก็อย่าเพิ่งท้อนะครับ ที่ผมอธิบายมาหลายบทหลายตอน เป็นเพียงแค่ปูถนน เพื่อเป็นทางก้าวเดินไปด้วยความเข้าใจต่างหาก ตอนหน้าจะเป็นการสร้างระบบงานแล้วครับ ง่ายๆแต่ได้ใจความ