ดาวน์โหลดโปรแกรม RSS Reader ได้ที่นี่ ...

|
|
|
Visitors - Session views |       
7 ธันวาคม พ.ศ.2549 278 Users On-Line. |
|
Visitors - Page views |        1 กุมภาพันธ์ พ.ศ.2551 |
|
|
|
 |
|
ตรวจสอบการกดแป้นคีย์บอร์ดเพื่อให้รับค่าเฉพาะตัวเลข (VB.Net) |
Category »
VB 6/VB.Net โดย : Webmaster เมื่อ 15/6/2551 เวลา: 16:39 | (อ่าน : 37298) | หลายปีก่อนเพื่อนชาวต่างชาติ (คนนี้ไม่ชาติชั่วน่ะครับ ... 55555) เคยถามผมมาว่า "รู้มั้ย Dot Net มันคืออีหยัง เอ๊ย คืออะไร ?" ... ไอ้ตัวกระผมก็ตอบไปตามความคิดซื่อๆ เหมือนกระบือไม่มีเจ้าของตามแบบผมเองนั่นแหละ แต่พอเขาตอบกลับผมมา แค่นั้นเองก็ฮาตรึมเลยครับ ... เขาบอกว่า "มันคือการนำเอาไฟล์ DLL หรือ Dynamics Link Library ไปใช้งานบนอินเทอร์เน็ตไงล่ะ (ไอ้โง่)" ... 55555+ ที่ขำนี่ก็เพราะมันเป็นการเปรียบเปรย แกมประชด M$ เล็กๆแหละครับ ... ก็เอาพอขำๆครับ สำหรับชาว VB6 ที่ใครๆก็มักติว่าเราล้าหลังเทคโนโลยี และดันเป็นความไม่ฉลาดของ VB6 ที่มันไม่ได้เกิดมาเป็น OOP 100% ... 55555+ ... คราวนี้ผมจะนำเอาแนวคิดที่ไม่ใช่ของ VB6 100% หรอกครับ มาแก้ปัญหาให้กับ VB.Net ให้ได้รับชมกัน ... อ่ะจึ๊ยยยย
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 ที่จะส่องทางให้พี่น้องได้นำมาใช้ในการแก้ปัญหา และ พัฒนาโปรแกรมต่อ-ยอดออกไปได้อีกมากมาย
|
|