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

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

[VB6] การตรวจสอบข้อมูล (Validate Data) สำหรับ TextBox Control

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

311

กระทู้

502

โพสต์

6066

เครดิต

ผู้ดูแลระบบ

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

Rank: 9Rank: 9Rank: 9

เครดิต
6066

การตรวจสอบข้อมูล หรือ Validate Data เป็นส่วนสำคัญอย่างมาก ในการดัก Error โดยเฉพาะค่าทางตัวเลข เพราะเราจะดักค่า หรือเช็คความถูกต้องก่อนที่จะนำค่าไปคำนวณผล โดยที่ไม่ต้องมาใช้คำสั่ง IF ซ้อนๆกัน และเหตุการณ์ที่ต้องทำซ้ำๆ ด้งนั้นเราควรจะนำโค้ดไปเก็บไว้ในลักษณะของ Public Function (รับค่าและคืนค่าได้) เพื่อให้ฟอร์มทุกฟอร์มมองเห็นได้ และลดจำนวนโค้ดลงไป ในโค้ดชุดนี้แอดมินได้เพิ่มเรื่องของการทำไฮไลท์เพื่อแสดงตำแหน่งโฟกัสการป้อนข้อมูล และที่สำคัญคือการแก้ปัญหาในเรื่องการกด Enter ในการเลื่อนตำแหน่งโฟกัส ซึ่งจะมีปัญหามาตั้งแต่ Windows 8+ ทำให้เกิด Error หรือที่เรียกว่า Permission Denied (Run Time Error 70)


การทำไฮไลท์ให้กับตำแหน่งโฟกัส


เทคนิคการเรียงลำดับ TabIndex


ควรย้ายฟังค์ชั่นเหล่านี้ให้ไปอยู่ในโมดูล และประกาศเป็นแบบ Public

มาดูโค้ดฉบับเต็มกันเถอะ ...
  1. Option Explicit

  2. ' / ---------------------------------------------------------------------------
  3. Private Sub Form_Load()
  4. ' / ---------------------------------------------------------------------------
  5.     '/ เคลียร์ค่าใน TextBox ทั้งหมด
  6.     txtAlphabet.Text = ""
  7.     txtAlphabetUCase.Text = ""
  8.     txtInteger.Text = "0"
  9.     txtDouble.Text = "0.00"
  10.     '/ จัดเรียงลำดับของการโฟกัส หรือ TabIndex (ไปทำในตอน Designer จะง่ายกว่า)
  11.     txtAlphabet.TabIndex = 0
  12.     txtAlphabetUCase.TabIndex = 1
  13.     txtInteger.TabIndex = 2
  14.     txtDouble.TabIndex = 3
  15. End Sub

  16. ' / ---------------------------------------------------------------------------
  17. ' / เหตุการณ์ในการที่ TextBox ได้รับโฟกัส
  18. Private Sub txtAlphabet_GotFocus()
  19. ' / ---------------------------------------------------------------------------
  20.     '/ ทำไฮไลท์แถบแสง โดยเรียกไปยังฟังค์ชั่น HLText และส่งชื่อ Control ไปด้วย
  21.     Call HLText(txtAlphabet)
  22. End Sub

  23. ' / ---------------------------------------------------------------------------
  24. Private Sub txtAlphabet_KeyPress(KeyAscii As Integer)
  25. ' / ---------------------------------------------------------------------------
  26.     ' / หากเกิดการกด Enter ให้ส่งคีย์ TAB เพื่อเลื่อนตำแหน่งโฟกัสไปยัง Control ถัดไป
  27.     ' / VB6 ไม่มีเหตุการณ์กด Enter แล้วเลื่อนโฟกัส ต้องใช้การส่งคีย์ (SendKeys) การกด TAB แทน
  28.     If KeyAscii = 13 Then
  29.         Sendkeys "{TAB}"
  30.         KeyAscii = 0    '/ ปิดเสียง
  31.     Else
  32.         '/ ส่งค่า KeyAscii ที่กดลงไปบนคีย์แต่ละตัว ไปให้กับฟังค์ชั่น CheckAlphabet และส่งค่ากลับคืนมา
  33.         '/ หากเป็นตัวอักษรภาษาอังกฤษก็จะคืนค่า Ascii Code A - Z (65 - 90), a - z (97 - 122)
  34.         '/ หากไม่ใช่ ก็จะคืนค่า 0 กลับมา เสมือนว่าไม่มีการกดคีย์ใดๆเลย
  35.         KeyAscii = CheckAlphabet(KeyAscii)
  36.     End If
  37. End Sub

  38. ' / ---------------------------------------------------------------------------
  39. ' / เหตุการณ์ในการที่ TextBox ได้รับโฟกัส
  40. Private Sub txtAlphabetUCase_GotFocus()
  41. ' / ---------------------------------------------------------------------------
  42.     '/ ทำไฮไลท์แถบแสง โดยเรียกไปยังฟังค์ชั่น HLText และส่งชื่อ Control ไปด้วย
  43.     Call HLText(txtAlphabetUCase)
  44. End Sub

  45. ' / ---------------------------------------------------------------------------
  46. Private Sub txtAlphabetUCase_KeyPress(KeyAscii As Integer)
  47. ' / ---------------------------------------------------------------------------
  48.     ' / หากเกิดการกด Enter ให้ส่งคีย์ TAB เพื่อเลื่อนตำแหน่งโฟกัสไปยัง Control ถัดไป
  49.     If KeyAscii = 13 Then
  50.         Sendkeys "{TAB}"
  51.         KeyAscii = 0    '/ ปิดเสียง
  52.     Else
  53.         '/ รับค่าตัวอักษรภาษาอังกฤษทั้งตัวใหญตัวเล็ก แต่กดตัวอักษรตัวเล็ก a - z จะแปลงเป็นตัวอักษรตัวใหญ่ A - Z ให้อัตโนมัติ
  54.         KeyAscii = Asc(UCase(Chr(CheckAlphabet(KeyAscii))))
  55.     End If
  56. End Sub

  57. ' / ---------------------------------------------------------------------------
  58. ' / เหตุการณ์ในการที่ TextBox ได้รับโฟกัส
  59. Private Sub txtDouble_GotFocus()
  60. ' / ---------------------------------------------------------------------------
  61.     '/ ทำไฮไลท์แถบแสง โดยเรียกไปยังฟังค์ชั่น HLText และส่งชื่อ Control ไปด้วย
  62.     Call HLText(txtDouble)
  63. End Sub

  64. ' / ---------------------------------------------------------------------------
  65. Private Sub txtDouble_KeyPress(KeyAscii As Integer)
  66. ' / ---------------------------------------------------------------------------
  67.     ' / หากเกิดการกด Enter ให้ส่งคีย์ TAB เพื่อเลื่อนตำแหน่งโฟกัสไปยัง Control ถัดไป
  68.     If KeyAscii = 13 Then
  69.         Sendkeys "{TAB}"
  70.         KeyAscii = 0    '/ ปิดเสียง
  71.     Else
  72.         '/ ส่งค่า KeyAscii ที่กดลงไปบนคีย์แต่ละตัว ไปให้กับฟังค์ชั่น CheckAlphabet และส่งค่ากลับคืนมา
  73.         '/ หากเป็นตัวอักษรภาษาอังกฤษก็จะคืนค่า Ascii Code A - Z (65 - 90), a - z (97 - 122)
  74.         '/ หากไม่ใช่ ก็จะคืนค่า 0 กลับมา เสมือนว่าไม่มีการกดคีย์ใดๆเลย
  75.         KeyAscii = CheckCurrency(KeyAscii, txtDouble)
  76.     End If
  77. End Sub

  78. ' / ---------------------------------------------------------------------------
  79. ' / เหตุการณ์ที่ TextBox หลุดโฟกัสไป
  80. Private Sub txtDouble_LostFocus()
  81. ' / ---------------------------------------------------------------------------
  82.     '/ ป้องกันค่าว่าง ก่อนที่จะนำค่าไปเก็บหรือคำนวณ
  83.     If Trim(txtDouble.Text) = "" Then
  84.         txtDouble.Text = "0.00"
  85.     Else
  86.         '/ จัดรูปแบบให้กับค่าตัวเลขแบบทศนิยม
  87.         txtDouble.Text = Format(CDbl(txtDouble.Text), "0.00")
  88.     End If
  89. End Sub

  90. ' / ---------------------------------------------------------------------------
  91. ' / เหตุการณ์ในการที่ TextBox ได้รับโฟกัส
  92. Private Sub txtInteger_GotFocus()
  93. ' / ---------------------------------------------------------------------------
  94.     '/ ทำไฮไลท์
  95.     Call HLText(txtInteger)
  96. End Sub

  97. ' / ---------------------------------------------------------------------------
  98. ' / เหตุการณ์ที่ TextBox หลุดโฟกัสไป
  99. Private Sub txtInteger_LostFocus()
  100. ' / ---------------------------------------------------------------------------
  101.     '/ ป้องกันค่าว่าง ก่อนที่จะนำค่าไปเก็บหรือคำนวณ
  102.     If Trim(txtInteger.Text) = "" Then
  103.         txtInteger.Text = "0"
  104.     Else
  105.         '/ จัดรูปแบบให้กับค่าตัวเลขแบบจำนวนเต็ม
  106.         txtInteger.Text = Format(CInt(txtInteger.Text), "0")
  107.     End If
  108. End Sub

  109. ' / ---------------------------------------------------------------------------
  110. ' / โปรแกรมย่อยเหตุการณ์ (Event) ในการรับค่าการกดคีย์บนแป้นคีย์บอร์ดทีละตัว
  111. Private Sub txtInteger_KeyPress(KeyAscii As Integer)
  112. '/ ---------------------------------------------------------------------------
  113.     ' / หากเกิดการกด Enter ให้ส่งคีย์ TAB เพื่อเลื่อนตำแหน่งโฟกัสไปยัง Control ถัดไป
  114.     If KeyAscii = 13 Then
  115.         Sendkeys "{TAB}"
  116.         KeyAscii = 0    '/ ปิดเสียง
  117.     Else
  118.         '/ ส่งค่า KeyAscii ที่กดลงไปบนคีย์แต่ละตัว ไปให้กับฟังค์ชั่น CheckDigitOnly และส่งค่ากลับมา
  119.         '/ หากเป็นตัวเลขก็จะคืนค่า Ascii Code 48 - 57 (หรือคีย์ 0 - 9) กลับคืนมา
  120.         '/ หากไม่ใช่ ก็จะคืนค่า 0 กลับมา เสมือนว่าไม่มีการกดคีย์ใดๆเลย
  121.         KeyAscii = CheckDigitOnly(KeyAscii)
  122.     End If
  123. End Sub

  124. ' / ---------------------------------------------------------------------------
  125. ' / ฟังค์ชั่นในการทำไฮไลท์เมื่อ TextBox ถูก Focus
  126. ' / ---------------------------------------------------------------------------
  127. Public Sub HLText(ByRef sText)
  128.     On Error Resume Next
  129.     With sText
  130.         .SelStart = 0
  131.         .SelLength = Len(sText.Text)
  132.     End With
  133. End Sub

  134. ' / ---------------------------------------------------------------------------
  135. ' / แก้ปัญหาเรื่อง SendKeys ตั้งแต่ Windows 8+
  136. Public Sub Sendkeys(Text As String, Optional Wait As Boolean = False)
  137. ' / ---------------------------------------------------------------------------
  138.     Dim WshShell As Object
  139.     Set WshShell = CreateObject("Wscript.shell")
  140.     WshShell.Sendkeys Text, Wait
  141.     Set WshShell = Nothing
  142. End Sub

  143. ' / ---------------------------------------------------------------------------
  144. ' / ฟังค์ชั่นในการตรวจสอบว่าคีย์ที่กดลงไปนั้นมันเป็น 0 - 9 หรือไม่
  145. ' / รับค่า KeyAscii จาก TextBox เข้ามาทีละตัว และเช็คค่า ASCII Code
  146. ' / หากเป็นตัวเลขก็คืนค่าตัวมันเองกลับ ก็คือยอมรับการกดคีย์นั่นเอง
  147. ' / หากไม่ใช่ก็คืนค่ากลับเป็น 0 เสมือนไม่มีการกดคีย์ใดๆนั่นเอง
  148. Public Function CheckDigitOnly(ByVal Index As Integer) As Integer
  149. '/ ---------------------------------------------------------------------------
  150.         Select Case Index
  151.             '/ ASCII Code หากมีค่า 48 - 57 ก็คือเลข 0 - 9 ก็คืนค่าตัวมันเองกลับไป
  152.             Case 48 To 57
  153.             Case 8, 13 ' Backspace = 8, Enter = 13
  154.             '/ หากไม่ใช่คีย์ที่กดใน 2 Case ด้านบน ก็คืนค่า 0 กลับไป เสมือนว่าไม่มีการกดคีย์ใดๆ
  155.             Case Else
  156.                 Index = 0
  157.         End Select
  158.         CheckDigitOnly = Index
  159. End Function

  160. '/ ---------------------------------------------------------------------------
  161. ' / ฟังค์ชั่นในการตรวจสอบว่าคีย์ที่กดลงไปนั้นมันเป็น 0 - 9 และ . หรือไม่
  162. ' / และเครื่องหมายจุด (.) จะรับได้เพียงค่าเดียวเท่านั้น
  163. Public Function CheckCurrency(Index As Integer, Ctrl As TextBox) As Integer
  164. '/ ---------------------------------------------------------------------------
  165.     Select Case Index
  166.             ' 0 - 9 and Return index = KeyAscii
  167.         Case 48 To 57
  168.             ' Back Space and Return index = KeyAscii
  169.         Case 8
  170.             ' Enter and Return index = KeyAscii
  171.         Case 13
  172.         Case 46 ' รหัส Ascii Code  ของเครื่องหมายจุด
  173.             If InStr(Ctrl, ".") Then Index = 0 '/ ใช้ฟังค์ชั่น InStr (In String) เพื่อหาเครื่องหมายจุดใน TextBox
  174.         Case Else
  175.             Index = 0
  176.     End Select
  177.     CheckCurrency = Index ' Return ค่ากลับตามที่ได้ตรวจสอบ
  178. End Function

  179. '/ ---------------------------------------------------------------------------
  180. ' / ฟังค์ชั่นในการรับค่าตัวอักษรภาษาอังกฤษเท่านั้น
  181. '/ ---------------------------------------------------------------------------
  182. Public Function CheckAlphabet(Index As Integer) As Integer
  183.     Select Case Index
  184.         '/ ASCII Code A - Z (65 - 90), a - z (97 - 122)
  185.         Case 65 To 90, 97 To 122 '/ หรือค่าอื่นๆที่เราต้องการ , Asc(" "), Asc("-"), Asc("&"), Asc("."), Asc("*"), Asc("[        DISCUZ_CODE_0        ]quot;), Asc("/"), Asc("+"), Asc("%")
  186.             CheckAlphabet = Index
  187.         '/ Back Space
  188.         Case 8
  189.         '/ Enter
  190.         Case 13
  191.         'Case 42 ' *
  192.         'Case 43 ' +
  193.         'Case 45 ' -
  194.         'Case 46 ' .
  195.         'Case 47 ' /
  196.         Case Else
  197.             Index = 0
  198.     End Select
  199.     '/ Return ค่ากลับ
  200.     CheckAlphabet = Index
  201. End Function
คัดลอกไปที่คลิปบอร์ด

ดาวน์โหลดโค้ด VB6 (SP1) ฉบับเต็มได้จากที่นี่ ...

ขออภัย! โพสต์นี้มีไฟล์แนบหรือรูปภาพที่ไม่ได้รับอนุญาตให้คุณเข้าถึง

คุณจำเป็นต้อง ลงชื่อเข้าใช้ เพื่อดาวน์โหลดหรือดูไฟล์แนบนี้ คุณยังไม่มีบัญชีใช่ไหม? ลงทะเบียน

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

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

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

GMT+7, 2024-5-2 18:38 , Processed in 0.131273 second(s), 4 queries , File On.

Powered by Discuz! X3.4, Rev.62

Copyright © 2001-2020 Tencent Cloud.

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