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

26 มกราคม 2567

Vฺisual Studio 2022 C# Blazor - 01

// youtube : https://youtu.be/dY_AWdCzsCY?si=eQyqwMcRINbhvUYz
// index.razor

@page "/"
@rendermode InteractiveServer 

<h3>Hello, @userName</h3>
<h3>@GetUserName()</h3>
<p>Sum : @GetSum()</p>
<button @onclick = "ChgName">Change Name</button>

@if (testNum == 1)
{
    <p>Num is 1</p>
else {
    <p>Num is not 1</p>
}
@foreach(var name in names)
{
    <p>@((MarkupString)name)</p>
}

@code {
    private string userName = "John";
    private int testNum = 10;
    private List<string> names;

    private string GetUserName()
    {
        return userName + "ซำบายดีไหม?";
    }

    private int GetSum()
    {
        return 2 + 2 + 3;
    }

    private void ChgName()
    {
        userName = "เกษม";
    }

    protected override void OnInitialized()
    {
        base.OnInitialized();
        names = new List<string>
        {
            "<b>Value 01<b>",
            "Value 02",
            "Value 03",
            "Value 04",
            "Value 05",
            "<i>Value 06<i>",
            "Value 07",
            "Value 08",
            "Value 09",
            "Value 10"
        };
    }
}

"I Believe in You"

Copyright(c) 2007 - 2022 by Kasem Kamolchaipisit.