14 กุมภาพันธ์ 2567

Visual FoxPro : การใช้ BindEvent

ลาย ๆ ครั้งเราอยากจะตรวจสอบเหตุการณ์ (event) ที่เกิดขึ้นใน Visual FoxPro 9 แต่บางเหตุการณ์ดันไม่มี method ของเหตุการณ์นั้นมารองรับ เช่น VFP มีแต่ KeyPress Event เป็นเหตุการณ์สำหรับตรวจสอบการกดปุ่มบนคีย์บอรด์อย่างเดียวเลย แต่..ถ้าเราอยากจะตรวจสอบเฉพาะตอนกดปุ่ม (KeyDown) หรือเฉพาะตอนปล่อยปุ่ม (KeyUp) จะทำไงละ แต่...คนสร้าง VFP ก็ช่างคิดเสียนี่กระไร ในเมื่อฉันไม่ได้เตรียม event/method ไว้ให้ แต่ก็ทิ้งคำสั่ง BindEvent เอาไว้ให้แทน 

าดูตัวอย่างการทำฟอร์มให้สามารถใช้งาน การตรวจสอบการกดปุ่ม (KeyDown) และปล่อยปุ่ม (KeyUp) (ตัวอย่างนี้มาจากคำถามของสมาชิกชาว Fox จะป้องกัน user กดปุ่มค้างไม่ยอมปล่อย ดังนั้นถ้าไปเช็คใน KeyPress Event มันวิ่งตลอด ที่เขียนโปรแกรมทำอะไรไว้วิ่งเป็นพรวน....) ดังนั้น การตรวจสอบ KeyDown  KeyUp จะได้มันใจว่ากดยาว กดแช่ กดสั้น กดไว อย่างไรก็ทำครั้้งเดียวจนกว่าจะกดใหม่

 สำหรับตัวอย่างนี้สามารถใช้เป็นแนวทางในการทำ BindEvent กับเหตุการอื่น ๆ ได้อีกมากมาย นะจ๊ะ...

1. ให้สร้างฟอร์มขึ้นมาใหม่ จากนั้นไปที่เมนู Form -> New Method จะปรากฎหน้าต่าง New Method
        -  ที่ช่อง Name ป้อน KeyDown แล้วคลิกปุ่ม Add
        -  ที่ช่อง Name ป้อน KeyUp แล้วคลิกปุ่ม Add











2. ไปป้อนคำสั่งที่ฟอร์มในเมธอด ดังนี้

    -  เมธอด Init ป้อนคำสั่ง

        * สร้างตัวแปรฟอร์มสำหรับตรวจสอบการกดปุ่มค้าง
    =ADDPROPERTY(ThisForm, "nPreventKeyPress",0)
        * ทำการผูกการกดคีย์(keydown)(เลข 256) กับ object ฟอร์ม(This) เรียกเมธอด KeyDown
    =BINDEVENT(0, 256, This, "KeyDown")
    
* ทำการผูกการกดคีย์(keydown)(เลข 257) กับ object ฟอร์ม(This) เรียกเมธอด KeyUp
    =BINDEVENT(0, 257, This, "KeyUp")

ดูความหมายของค่าตัวเลข 256 257 หรืออื่น ๆ ของ Windows Message ที่ส่งมา   https://wiki.winehq.org/List_Of_Windows_Messages

    -  เมธอด KeyDown ป้อนคำสั่ง

    LPARAMETERS nHwn,Msg,nKeyCode,lParam

    IF ThisForm.nPreventKeyPress = 0
?"Key Down : " + STR(nKeyCode)
ThisForm.nPreventKeyPress = 1
    ENDIF 

    -  เมธอด KeyUp ป้อนคำสั่ง

    LPARAMETERS nHwn,Msg,nKeyCode,lParam

    
IF ThisForm.nPreventKeyPress = 1
        ?"Key Up : " + STR(nKeyCode)
        ThisForm.nPreventKeyPress = 0
    ENDIF 



จากนั้นให้บันทึกฟอร์ม แล้วทดสอบ การกดปุ่มต่าง ๆ จะส่งค่าของปุ่มกลับมาก ที่เหลือจะไปทำอะไรต่อได้แล้ว

อ้างอิงจาก : 

วันวาเลนไทน์ ผ่านไป อีกสองวันหวยออก โชคดี โชคดี

ไม่มีความคิดเห็น:

"I Believe in You"

Copyright(c) 2007 - 2022 by Kasem Kamolchaipisit.