|
เรื่องของการดักเช็คค่าการกดคีย์ใน TextBox เรียกได้ว่าเป็นคีย์เวิร์ดยอดฮิตที่ใช้ค้นหาใน Google รวมไปถึงคนที่เข้ามาอ่านในส่วนของบทความของแอดมินเพียบเลย ซึ่งแอดมินได้นำเสนอไปในรูปแบบของฟังค์ชั่น แต่แยกแต่ละแบบออกจากกัน เช่น ฟังค์ชั่นนี้เฉพาะการกดคีย์ตัวเลข หรือฟังค์ชั่นนั้นเฉพาะตัวอักษรเท่านั้น มาวันนี้แอดมินจะขอนำเสนอแบบเหมาหมด โดยรวบยอดเอามาไว้ในฟังค์ชั่นตัวเดียวกัน และอาศัยหลักการผสมผสาน VB6 กับ VB.NET เข้าด้วยกัน
Enum เป็นประเภทข้อมูลที่เป็นชุดของตัวเลขจำนวนเต็ม มันใช้กำหนดกลุ่มของค่าคงที่ ที่ทำให้มีความหมายและเข้าใจได้ง่ายขึ้นในการเขียนโปรแกรม
การประกาศตัวแปรแบบ Enum
- Private Enum eTextType
- Normal = 0
- AlphaNumeric = 1
- NumbersOnly = 2
- Currency = 3
- UCaseAlphabet = 4
- End Enum
คัดลอกไปที่คลิปบอร์ด การนำเอา Enum มาใช้กับบทความนี้ ก็เพื่อที่เราจะได้ไม่ต้องจดจำตัวเลขยังไงล่ะครับ เช่น eTextType.NumbersOnly เราก็รู้ความหมายเลยว่าเป็นการกดคีย์ตัวเลขเท่านั้น หากเราใช้ค่าคงที่ธรรมดา ก็คงต้องมาไล่เรียงว่า 0 หรือ 5 คืออะไร และสังเกตว่ามันจะแตกต่างไปจากการประกาศค่าคงที่ด้วยตัวแปรแบบเดี่ยวๆ เช่น Const A = 0 หากมีแบบนี้สัก 10 ตัว เราก็ต้องจำชื่อตัวแปรอีก นี่แหละคือวิธีคิดนำเอา Enum มาใช้แก้ปัญหา
โค้ดแบบเต็มในส่วนของฟังค์ชั่น ... อันดับแรกต้องให้เข้าใจด้วยว่า e.Handled มีค่าเริ่มต้น (Default) เป็นเท็จ (False) หากมีการรีเทิร์นค่ากลับเป็นจริง (True) นั่นแสดงว่ากดคีย์นั้นๆใน TextBox ไม่ได้ (ค่า True หากแปลตามคู่มือใน MSDN ก็คือ CPU ไม่สนใจการกดคีย์)
- ' / ----------------------------------------------------------------
- ' / การคืนค่ากลับของฟังค์ชั่นนี้จะเป็นแบบ Boolean คือ True/False เพื่อระบุค่าให้กับ e.Handled
- ' / e.Handled = True หมายความว่า CPU ไม่สนใจการกดคีย์ ก็คือไม่รับค่าที่กดนั่นเอง
- Public Function ValidKey(sender As System.Object, KeyCh As Char, ByVal Col As String) As Boolean
- '/ หากเราต้องการตรวจสอบค่าที่มีอยู่ทั้งหมด
- Dim tb As TextBox = sender
- Select Case Col
- '/ การใช้ Enum
- '/ รับค่าตัวอักษรและตัวเลขเท่านั้น
- Case eTextType.AlphaNumeric
- ValidKey = Not (IsNumeric(KeyCh) Or (KeyCh Like "[A-Z]" Or KeyCh Like "[a-z]") Or (KeyCh = Chr(8)))
- '/ รับค่าแบบตัวเลขเท่านั้น
- Case eTextType.NumbersOnly
- '/ Chr(Keys.Back) คือการกด Backspace
- ValidKey = Not (IsNumeric(KeyCh) Or (KeyCh = Chr(Keys.Back)))
- '/ รับค่าแบบเลขทศนิยม สามารถมีจุดทศนิยมได้เพียงตัวเดียว
- Case eTextType.Currency
- ValidKey = Not (IsNumeric(KeyCh) Or (KeyCh = "." And Not CBool(InStr(tb.Text, "."))) Or (KeyCh = Chr(8)))
- '/ รับค่าแบบตัวอักษรตัวใหญ่เท่านั้น
- '/ Chr(8) คือ การกด Backspace จะใช้ได้กับภาษาโปรแกรมอื่นๆ เพราะอาศัยค่า ASCII Code
- Case eTextType.UCaseAlphabet
- ValidKey = Not (KeyCh Like "[A-Z]" Or (KeyCh = Chr(8)))
- '/ อย่างอื่นให้คืนค่ากลับเป็นเท็จ
- Case Else : ValidKey = False
- End Select
- End Function
คัดลอกไปที่คลิปบอร์ด เหตุผลที่แอดมินใช้ Select Case แทนที่จะเป็น IF-Else ก็เพราะว่าดูจากเงื่อนไขที่เป็นค่าคงที่ หรือช่วงของค่า ทำให้อ่านโค้ดได้ง่าย เมื่ออ่านได้ง่าย โอกาสเกิดความผิดพลาด (Bug) ก็จะมีน้อยลงไปนั่นเอง
วิธีการนำไปใช้
- ' / ----------------------------------------------------------------
- Private Sub TextBox1_KeyPress(sender As Object, e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress
- '/ การเรียกใช้ก็ส่งชื่อ Control, ค่าคีย์ที่กด และรูปแบบที่ต้องการใน Enum
- e.Handled = ValidKey(TextBox1, e.KeyChar, eTextType.Normal)
- End Sub
- Private Sub TextBox2_KeyPress(sender As Object, e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox2.KeyPress
- e.Handled = ValidKey(TextBox2, e.KeyChar, eTextType.AlphaNumeric)
- End Sub
- Private Sub TextBox3_KeyPress(sender As Object, e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox3.KeyPress
- e.Handled = ValidKey(TextBox3, e.KeyChar, eTextType.NumbersOnly)
- End Sub
- Private Sub TextBox4_KeyPress(sender As Object, e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox4.KeyPress
- e.Handled = ValidKey(TextBox4, e.KeyChar, eTextType.Currency)
- End Sub
- Private Sub TextBox5_KeyPress(sender As Object, e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox5.KeyPress
- e.Handled = ValidKey(TextBox4, e.KeyChar, eTextType.UCaseAlphabet)
- End Sub
คัดลอกไปที่คลิปบอร์ด |
|