หากมีคำถาม ขอให้ไปโพสต์ลง เว็บบอร์ดจีทูจีเน็ตดอตคอม ตัวใหม่แทนน่ะครับ

หรือติดต่อเข้ามาทาง Inbox ที่ เฟซบุ๊ค ผมครับ

หน้าหลัก
ข่าวสาร - บทความ ทั้งหมด
VB 6/VB.Net
ASP/ASP.Net
จับฉ่ายคอมพิวเตอร์
เรียนรู้ผ่าน Flash Movie
บทความที่มีผู้ตอบล่าสุด  
 RSS Feeds
 ดาวน์โหลดโปรแกรม RSS Reader ได้ที่นี่ ...   Download โปรแกรม RSS Reader

Forum - www.g2gnet.com
Webmaster - www.g2gnet.com
Visitors - Session views
 5 3 1 7 9 6 4

7 ธันวาคม พ.ศ.2549
739 Users On-Line.
Visitors - Page views
 8 6 5 1 6 2 3
1 กุมภาพันธ์ พ.ศ.2551

Google   
เว็บ g2gnet.com
ขนาดตัวอักษร:  

ตรวจสอบการกดแป้นคีย์บอร์ดเพื่อให้รับค่าเฉพาะตัวเลข (VB.Net)

Category »  VB 6/VB.Net
โดย : Webmaster เมื่อ 15/6/2551   เวลา: 16:39
(อ่าน : 36448) 
หลายปีก่อนเพื่อนชาวต่างชาติ (คนนี้ไม่ชาติชั่วน่ะครับ ... 55555) เคยถามผมมาว่า "รู้มั้ย Dot Net มันคืออีหยัง เอ๊ย คืออะไร ?" ... ไอ้ตัวกระผมก็ตอบไปตามความคิดซื่อๆ เหมือนกระบือไม่มีเจ้าของตามแบบผมเองนั่นแหละ แต่พอเขาตอบกลับผมมา แค่นั้นเองก็ฮาตรึมเลยครับ ... เขาบอกว่า "มันคือการนำเอาไฟล์ DLL หรือ Dynamics Link Library ไปใช้งานบนอินเทอร์เน็ตไงล่ะ (ไอ้โง่)" ... 55555+ ที่ขำนี่ก็เพราะมันเป็นการเปรียบเปรย แกมประชด M$ เล็กๆแหละครับ ... ก็เอาพอขำๆครับ สำหรับชาว VB6 ที่ใครๆก็มักติว่าเราล้าหลังเทคโนโลยี และดันเป็นความไม่ฉลาดของ VB6 ที่มันไม่ได้เกิดมาเป็น OOP 100% ... 55555+ ... คราวนี้ผมจะนำเอาแนวคิดที่ไม่ใช่ของ VB6 100% หรอกครับ มาแก้ปัญหาให้กับ VB.Net ให้ได้รับชมกัน ... อ่ะจึ๊ยยยย
 ตรวจสอบการกดแป้นคีย์บอร์ดเพื่อให้รับค่าเฉพาะตัวเลข และจุดทศนิยมเท่านั้น (VB6 น่ะ่ครับ)
 กรุณาอ่านรายละเอียดเพิ่มเติมวิธีการคิดกับตัวเลขจำนวนเต็ม ... ที่นี่
ASCII = American Standard Code for Information Interchange
เวลาที่คุณกดแป้นคีย์บอร์ดตัวอักษร "A" เครื่องคอมพิวเตอร์มันไม่รู้จักหรอกครับ มันรู้จักแต่ความแตกต่างทางศักย์ไฟฟ้า เช่น + กับ Ground หรือ + กับ - หรือ สถานะ High Voltage กับ Low Voltage ... แต่ในภาษามนุษย์เราจะนำมันมาเปรียบเทียบและกล่าวถึงเพียงแค่ "0" กับ "1" (ตัวเลขระบบ Binary หรือ ฐาน 2) ดังนั้นอักขระ "A" เมื่อแทนค่าเป็นเลขฐาน 2 (Binary) เราจะได้ค่าเป็น 0 1 0 0 0 0 0 1 หรือ 65 ในฐาน 10 (มาจาก 0+64+0+0+0+0+0+1 = 65 หรือ ที่เราจะเรียกมันว่า ASCII Code ไงล่ะครับพี่น้อง) ... เอาล่ะครับติ๊ต่างว่าเรารู้ที่มาของ ASCII (อ่านว่า แอสกี้) กันเป็นที่เรียบร้อยแล้ว ดังนั้นค่า ASCII Code สำหรับตัวอักขระ 0 - 9 คือ
  • "0" = 0 0 1 1 0 0 0 0 หรือ 48 (ฐาน 10)
  • "1" = 0 0 1 1 0 0 0 1 หรือ 49 (ฐาน 10)
  • "2" = 0 0 1 1 0 0 1 0 หรือ 50 (ฐาน 10)
  • ..... ไปเรื่อยๆ ....
  • "9" = 0 0 1 1 1 0 0 1 หรือ 57 (ฐาน 10)
    พอมองเห็นทางสว่างรำไรแล้วใช่มั้ยครับพี่น้อง ... โจทย์ในข้อนี้ตรวจสอบการกดแป้นคีย์บอร์ดเพื่อให้รับค่าเฉพาะตัวเลข ... ดังนั้นแนวคิดแบบหนูน้อยอนุบาลแมวเหมียว คือ
  • หากผู้ใช้กดคีย์ตัวเลขระหว่าง 0 - 9 (แต่ต้องใช้ ASCII Code ระหว่าง 48 ถึง 57) ให้ส่งค่า ASCII Code นั้นๆกลับคืนไป (จะใช้ฟังค์ชั่น Asc, Chr เข้าช่วย ยังไงๆแล้ว ตัวแปลภาษามันก็รู้จัก แต่ ASCII Code เท่านั้นแหละ)
  • นอกเหนือจากคีย์ที่ว่ามา จะต้องล็อคการกดคีย์ไว้ หรือ เสมือนหนึ่งว่าไม่มีการกดคีย์ใดๆ
    แนวคิดแบบที่ 1 :
    ตัวอย่างนี้ผมไม่ได้เปลี่ยนแนวคิดจาก VB6 เลย ... ดังนั้นผมก็จะเล่นตามแนวทางเดิม โดยอาศัย ASCII Code แต่ทว่าเราไม่สามารถนำ KeyAscii ใน VB6 มาใช้งานใน Dot Net ได้ ดังนั้นจึงต้องอาศัย e.KeyChar (มันจะระบุคีย์นั้นๆ ออกมาเลย เช่น "S") เข้ามาช่วย แล้วแปลงให้เป็นรหัส ASCII Code ด้วยคำสั่ง Asc อีกที
    ส่วน e.Handled ในความหมายของผม คือ การบ่งบอกสถานะการล็อคเหตุการณ์ Keypress ซึ่ง ...
  • หากมันเป็น False แสดงว่าเกิดการ Return ค่าคีย์ที่กดได้ (ก็ค่า ASCII นั่นแหละ)
  • หากมันเป็น True แสดงว่าเกิดการ Return ค่าคีย์ที่กดเป็น 0 (ไม่มีการกดคีย์)
    
        Private Sub TextBox1_KeyPress(ByVal sender As Object, _
                                      ByVal e As System.Windows.Forms.KeyPressEventArgs _
                                      ) _
                                      Handles TextBox1.KeyPress
    
            Dim KeyAscii As Short = Asc(e.KeyChar)
            Select Case KeyAscii
                Case 48 To 57
                    e.Handled = False
                Case 8, 13, 46 ' Backspace = 8, Enter = 13, Delete = 46
                    e.Handled = False
                Case Else
                    e.Handled = True
            End Select
        End Sub
    
    เขียนโค้ดแบบนี้หากมี TextBox จำนวนมากๆจะทำยังไงดีล่ะ ... ก็เปลี่ยนเป็นฟังค์ชั่น (Function) แทนซิครับพี่น้อง
    
        Private Sub TextBox1_KeyPress(ByVal sender As Object, _
                                      ByVal e As System.Windows.Forms.KeyPressEventArgs _
                                      ) _
                                      Handles TextBox1.KeyPress
    
            Dim KeyAscii As Short = Asc(e.KeyChar)
            ' ตรวจสอบการ Return ค่ากลับว่า True หรือ False
            e.Handled = CheckDigitOnly(KeyAscii)
        End Sub
    	
        Function CheckDigitOnly(ByVal index As Integer) As Boolean
            Select Case index
                Case 48 To 57 ' เลข 0 - 9
                    CheckDigitOnly = False
                Case 8, 13, 46 ' Backspace = 8, Enter = 13, Delete = 46
                    CheckDigitOnly = False
                Case Else
                    CheckDigitOnly = True
            End Select
        End Function
    
    แนวคิดแบบที่ 2 :
    แบบที่ 1 รู้สึกว่ามันจะบ้านๆเกินไป ต้องลดรูปแบบลงมา ... โดยใช้ฟังค์ชั่น (หรือ คำสั่ง) Asc(ตัวอักขระ) เพื่อระบุตัวอักขระนั้นๆโดยตรง เช่น Asc("0") ก็จะมีค่า ASCII Code เท่ากับ 48
    
        Private Sub TextBox1_KeyPress(ByVal sender As Object, _
                                      ByVal e As System.Windows.Forms.KeyPressEventArgs _
                                      ) _
                                      Handles TextBox1.KeyPress
            Select Case Asc(e.KeyChar)
                Case 48 To 57
                    e.Handled = False
                Case 8, 13, 46 ' Backspace = 8, Enter = 13, Delete = 46
                    e.Handled = False
                Case Else
                    e.Handled = True
            End Select
        End Sub
    
    แนวคิดแบบที่ 3 :
    จะใช้ฟังค์ชั่น (หรือคำสั่ง) Chr(รหัสแอสกี้) เข้ามาช่วย นั่นคือ Chr(48) ก็จะมีค่าเท่ากับตัวอักขระ "0"
    
        Private Sub TextBox1_KeyPress(ByVal sender As Object, _
                                      ByVal e As System.Windows.Forms.KeyPressEventArgs _
                                      ) _
                                      Handles TextBox1.KeyPress
            Select Case e.KeyChar
                Case Chr(48) To Chr(57)
                    e.Handled = False
                Case Chr(8), Chr(13), Chr(46)
                    e.Handled = False
                Case Else
                    e.Handled = True
            End Select
        End Sub
    
    แนวคิดแบบที่ 4 :
    คราวนี้มาใช้ตัวอักขระโดยตรงไปเลย คือ "0", "1", ... "9" (ต้องอยู่ภายในเครื่องหมาย Double Quote หรือ "")
    
        Private Sub TextBox1_KeyPress(ByVal sender As Object, _
                                      ByVal e As System.Windows.Forms.KeyPressEventArgs _
                                      ) _
                                      Handles TextBox1.KeyPress
            Select Case e.KeyChar
                Case "0" To "9"
                    e.Handled = False
                Case Chr(8), Chr(13), Chr(46)
                    e.Handled = False
                Case Else
                    e.Handled = True
            End Select
        End Sub
    
    Conclusion:
    เป็นอย่างไรกันบ้างครับพี่น้อง ... ได้เห็นภาพกันชัดๆจะๆหรือยัง ไม่ว่าเราจะเริ่มต้นศึกษาจากภาษาโปรแกรมอะไรก็แล้วแต่ จะเห็นได้ว่า "แนวคิด หรือ Algorithm" ในการแก้ปัญหานั้น มันไม่ได้เปลี่ยนแปลงไปตามภาษาโปรแกรมที่ใช้งานเลย จะเปลี่ยนก็แต่รูปแบบคำสั่ง (Syntax) และ วิธีการนำมาใช้งาน และจากตัวอย่างที่นำมาเสนอนี้ มันเป็นแนวคิดที่เรียกได้ว่าเป็น "พื้นฐาน" (ที่ผมมักกล่าวถึงเป็นประจำ) ... ลองย้อนกลับไปศึกษาดูเกี่ยวกับเรื่องของ Bit/Byte ประเภท ชนิดของข้อมูลต่างๆ เพราะพวกนี้แหละคือ BASIC ที่จะส่องทางให้พี่น้องได้นำมาใช้ในการแก้ปัญหา และ พัฒนาโปรแกรมต่อ-ยอดออกไปได้อีกมากมาย

  • จี ทู จี เน็ต ดอต คอม - g2gNet Dot Com
    เลขทะเบียนพาณิชย์อิเล็กทรอนิกส์ 0407314800231
    CopyLeft © 2004 - 2099 g2gNet.Com All rights reserved.
    Email: [email protected] หรือ โทร. 08-6862-6560