ชุมชนคนรักภาษาเบสิค - Visual Basic Community

 ลืมรหัสผ่าน
 ลงทะเบียน
ค้นหา
ดู: 4456|ตอบกลับ: 1

[VB.NET] ฟังค์ชั่นดักการกดคีย์ที่ต้องการใน TextBox Control ด้วยการใช้ Enum

[คัดลอกลิงก์]

309

กระทู้

500

โพสต์

6030

เครดิต

ผู้ดูแลระบบ

ทองก้อน ทับทิมกรอบ

Rank: 9Rank: 9Rank: 9

เครดิต
6030


เรื่องของการดักเช็คค่าการกดคีย์ใน TextBox
เรียกได้ว่าเป็นคีย์เวิร์ดยอดฮิตที่ใช้ค้นหาใน Google รวมไปถึงคนที่เข้ามาอ่านในส่วนของบทความของแอดมินเพียบเลย ซึ่งแอดมินได้นำเสนอไปในรูปแบบของฟังค์ชั่น แต่แยกแต่ละแบบออกจากกัน เช่น ฟังค์ชั่นนี้เฉพาะการกดคีย์ตัวเลข หรือฟังค์ชั่นนั้นเฉพาะตัวอักษรเท่านั้น มาวันนี้แอดมินจะขอนำเสนอแบบเหมาหมด โดยรวบยอดเอามาไว้ในฟังค์ชั่นตัวเดียวกัน และอาศัยหลักการผสมผสาน VB6 กับ VB.NET เข้าด้วยกัน


Enum เป็นประเภทข้อมูลที่เป็นชุดของตัวเลขจำนวนเต็ม มันใช้กำหนดกลุ่มของค่าคงที่ ที่ทำให้มีความหมายและเข้าใจได้ง่ายขึ้นในการเขียนโปรแกรม
การประกาศตัวแปรแบบ Enum
  1.     Private Enum eTextType
  2.         Normal = 0
  3.         AlphaNumeric = 1
  4.         NumbersOnly = 2
  5.         Currency = 3
  6.         UCaseAlphabet = 4
  7.     End Enum
คัดลอกไปที่คลิปบอร์ด
การนำเอา Enum มาใช้กับบทความนี้ ก็เพื่อที่เราจะได้ไม่ต้องจดจำตัวเลขยังไงล่ะครับ เช่น eTextType.NumbersOnly เราก็รู้ความหมายเลยว่าเป็นการกดคีย์ตัวเลขเท่านั้น หากเราใช้ค่าคงที่ธรรมดา ก็คงต้องมาไล่เรียงว่า 0 หรือ 5 คืออะไร และสังเกตว่ามันจะแตกต่างไปจากการประกาศค่าคงที่ด้วยตัวแปรแบบเดี่ยวๆ เช่น Const A = 0 หากมีแบบนี้สัก 10 ตัว เราก็ต้องจำชื่อตัวแปรอีก นี่แหละคือวิธีคิดนำเอา Enum มาใช้แก้ปัญหา

โค้ดแบบเต็มในส่วนของฟังค์ชั่น ... อันดับแรกต้องให้เข้าใจด้วยว่า e.Handled มีค่าเริ่มต้น (Default) เป็นเท็จ (False) หากมีการรีเทิร์นค่ากลับเป็นจริง (True) นั่นแสดงว่ากดคีย์นั้นๆใน TextBox ไม่ได้ (ค่า True หากแปลตามคู่มือใน MSDN ก็คือ CPU ไม่สนใจการกดคีย์)
  1.     ' / ----------------------------------------------------------------
  2.     ' / การคืนค่ากลับของฟังค์ชั่นนี้จะเป็นแบบ Boolean คือ True/False เพื่อระบุค่าให้กับ e.Handled
  3.     ' / e.Handled = True หมายความว่า CPU ไม่สนใจการกดคีย์ ก็คือไม่รับค่าที่กดนั่นเอง
  4.     Public Function ValidKey(sender As System.Object, KeyCh As Char, ByVal Col As String) As Boolean
  5.         '/ หากเราต้องการตรวจสอบค่าที่มีอยู่ทั้งหมด
  6.         Dim tb As TextBox = sender
  7.         Select Case Col
  8.             '/ การใช้ Enum
  9.             '/ รับค่าตัวอักษรและตัวเลขเท่านั้น
  10.             Case eTextType.AlphaNumeric
  11.                 ValidKey = Not (IsNumeric(KeyCh) Or (KeyCh Like "[A-Z]" Or KeyCh Like "[a-z]") Or (KeyCh = Chr(8)))

  12.                 '/ รับค่าแบบตัวเลขเท่านั้น
  13.             Case eTextType.NumbersOnly
  14.                 '/ Chr(Keys.Back) คือการกด Backspace
  15.                 ValidKey = Not (IsNumeric(KeyCh) Or (KeyCh = Chr(Keys.Back)))

  16.                 '/ รับค่าแบบเลขทศนิยม สามารถมีจุดทศนิยมได้เพียงตัวเดียว
  17.             Case eTextType.Currency
  18.                 ValidKey = Not (IsNumeric(KeyCh) Or (KeyCh = "." And Not CBool(InStr(tb.Text, "."))) Or (KeyCh = Chr(8)))

  19.                 '/ รับค่าแบบตัวอักษรตัวใหญ่เท่านั้น
  20.                 '/ Chr(8) คือ การกด Backspace จะใช้ได้กับภาษาโปรแกรมอื่นๆ เพราะอาศัยค่า ASCII Code
  21.             Case eTextType.UCaseAlphabet
  22.                 ValidKey = Not (KeyCh Like "[A-Z]" Or (KeyCh = Chr(8)))

  23.                 '/ อย่างอื่นให้คืนค่ากลับเป็นเท็จ
  24.             Case Else : ValidKey = False
  25.         End Select
  26.     End Function
คัดลอกไปที่คลิปบอร์ด
เหตุผลที่แอดมินใช้ Select Case แทนที่จะเป็น IF-Else ก็เพราะว่าดูจากเงื่อนไขที่เป็นค่าคงที่ หรือช่วงของค่า ทำให้อ่านโค้ดได้ง่าย เมื่ออ่านได้ง่าย โอกาสเกิดความผิดพลาด (Bug) ก็จะมีน้อยลงไปนั่นเอง

วิธีการนำไปใช้
  1.     ' / ----------------------------------------------------------------
  2.     Private Sub TextBox1_KeyPress(sender As Object, e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress
  3.         '/ การเรียกใช้ก็ส่งชื่อ Control, ค่าคีย์ที่กด และรูปแบบที่ต้องการใน Enum
  4.         e.Handled = ValidKey(TextBox1, e.KeyChar, eTextType.Normal)
  5.     End Sub

  6.     Private Sub TextBox2_KeyPress(sender As Object, e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox2.KeyPress
  7.         e.Handled = ValidKey(TextBox2, e.KeyChar, eTextType.AlphaNumeric)
  8.     End Sub

  9.     Private Sub TextBox3_KeyPress(sender As Object, e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox3.KeyPress
  10.         e.Handled = ValidKey(TextBox3, e.KeyChar, eTextType.NumbersOnly)
  11.     End Sub

  12.     Private Sub TextBox4_KeyPress(sender As Object, e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox4.KeyPress
  13.         e.Handled = ValidKey(TextBox4, e.KeyChar, eTextType.Currency)
  14.     End Sub

  15.     Private Sub TextBox5_KeyPress(sender As Object, e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox5.KeyPress
  16.         e.Handled = ValidKey(TextBox4, e.KeyChar, eTextType.UCaseAlphabet)
  17.     End Sub
คัดลอกไปที่คลิปบอร์ด
สิ่งที่ดีกว่าการให้ คือการให้แบบไม่มีที่สิ้นสุด

0

กระทู้

58

โพสต์

10

เครดิต

Member

Rank: 2

เครดิต
10
โพสต์ 2022-10-25 17:29:26 | ดูโพสต์ทั้งหมด

ขอบคุณครับ
ขออภัย! คุณไม่ได้รับสิทธิ์ในการดำเนินการในส่วนนี้ กรุณาเลือกอย่างใดอย่างหนึ่ง ลงชื่อเข้าใช้ | ลงทะเบียน

รายละเอียดเครดิต

ข้อความล้วน|อุปกรณ์พกพา|ประวัติการแบน|G2GNet.com  

GMT+7, 2024-4-19 15:33 , Processed in 0.206641 second(s), 4 queries , File On.

Powered by Discuz! X3.4, Rev.62

Copyright © 2001-2020 Tencent Cloud.

ตอบกระทู้ ขึ้นไปด้านบน ไปที่หน้ารายการกระทู้