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

หรือติดต่อเข้ามาทาง 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 2 6 1 0 3 4

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

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

การพิมพ์อักษรตัวใหญ่ทั้งหมดใน TextBox ภาคเสริมการทำ Log in

Category »  VB 6/VB.Net
โดย : Webmaster เมื่อ 20/11/2552   เวลา: 13:13
(อ่าน : 15973) 
การบังคับโปรแกรมเพื่อให้ผู้ใช้งานพิมพ์ได้เฉพาะอักษรตัวใหญ่ลงในช่อง TextBox ก็นำไปใช้ประโยชน์หลักๆคือ ป้อนรหัสนักศึกษา รหัสพนักงาน หรือ รหัสสินค้า เพื่อนำไปพิมพ์ออกเป็นรหัสบาร์โค้ด ซึ่งเนื่องจากว่ารหัสบาร์โค้ด Code39 Code128A และ Code128B มันรับเฉพาะตัวอักษรภาษาอังกฤษตัวใหญ่เท่านั้น (ยกเว้น 128B/C) ตัวเล็กมันไม่รับ (ปกติก็ไม่มีใครเขาใช้หรอกครับ) เช่น ACC52-0001 แต่ลำพังแค่คำสั่ง (หรือฟังค์ชั่น) UCase มันยังไม่เพียงพอต่อการกรอกข้อมูลลงไป เพราะคำสั่งนี้จะต้องเปลี่ยนทั้งชุดข้อความ (String) ... การแก้ปัญหาแบบง่ายๆลวกๆ ...
  • Private Sub Text1_Change()
        Text1.Text = UCase$(Text1.Text)
        SendKeys "{END}"
    End Sub

แน่นอนว่าปัญหาที่เกิดขึ้นตามมาอีกก็คือ ไม่สามารถบังคับให้เลือกตัวอักษรที่ต้องการได้ (ถึงทำได้ก็เขียนโค้ดยากแหละ) เพราะการทำรหัสต่างๆที่ว่า มักจะใช้ตัวอักษรภาษาอังกฤษตัวใหญ่ กับเครื่องหมาย _ (Underscore) และ - (Minus) เท่านั้น เพราะคงจะไม่มีใครไปอุตริ สร้างรหัส ACC#52*0001 แบบนี้หรอกครับ ... 55555+ ...

    ทำความเข้าใจกับ ASCII Code (กันอีกรอบ)
    ASCII = American Standard Code for Information Interchange
    เวลาที่คุณกดแป้นคีย์บอร์ดตัวอักษร "a" เครื่องคอมพิวเตอร์มันไม่รู้จักหรอกครับ มันรู้จักแต่ความแตกต่างทางศักย์ไฟฟ้า เช่น + กับ Ground หรือ + กับ - หรือ สถานะ High Voltage กับ Low Voltage ... แต่ในภาษามนุษย์เราจะนำมันมาเปรียบเทียบและกล่าวถึงเพียงแค่ "0" กับ "1" (ตัวเลขระบบ Binary หรือ ฐาน 2) ดังนั้นอักขระ "a" เมื่อแทนค่าเป็นเลขฐาน 2 (Binary) เราจะได้ค่าเป็น 0 1 1 0 0 0 0 1 หรือ 97 ในฐาน 10 (มาจาก 0+64+32+0+0+0+0+1 = 97 หรือ ที่เราจะเรียกมันว่า ASCII Code ไงล่ะครับพี่น้อง) ... เอาล่ะครับติ๊ต่างว่าเรารู้ที่มาของ ASCII (อ่านว่า แอสกี้) กันเป็นที่เรียบร้อยแล้ว ซึ่งขนาดของ ASCII Code จะมีความยาวขนาด 8 บิท หรือ 1 ไบท์ ... สำหรับตัวอักขระ a - z คือ
    • "a" = 0 1 1 0 0 0 0 1 หรือ 97 (ฐาน 10)
    • "b" = 0 1 1 0 0 0 1 0 หรือ 98 (ฐาน 10)
    • "c" = 0 1 1 0 0 0 1 1 หรือ 99 (ฐาน 10)
    • ..... ไปเรื่อยๆ ....
    • "z" = 0 1 1 1 1 0 1 0 หรือ 122 (ฐาน 10)
    ดังนั้นมองกลับมาที่ VB เหตุการณ์ที่จะทำให้สามารถอ่านรหัส ASCII นี้ได้ จะอยู่ที่ KeyPress Events ดังนี้
  • Private Sub Text1_KeyPress(KeyAscii As Integer)
        MsgBox KeyAscii
    End Sub

    ดังนั้นเวลาเรากดตัวอักขระ "a" ปั๊บ ... KeyAscii ก็จะอ่านค่าได้เป็น 97 (ฐาน 10) แต่เวลาแสดงผลใน TextBox มันก็จะเป็นตัว "a" เพราะว่านี่คือโปรแกรมภาษาระดับสูงยังไงล่ะครับ (Interface กับผู้ใช้งาน) ... เมื่อเข้าใจกันตามนี้แล้ว ขั้นตอนต่อไปคือกำหนดการรับค่าตัวอักขระที่พิมพ์ลงมาในช่อง TextBox ให้รับเฉพาะ 0 - 9, a - z, A - Z และ _ กับ - ดังนั้นต้องเขียนโค้ดแบบฟังค์ชั่นขึ้นมา เพื่อทำการตรวจสอบคีย์ที่ต้องการให้กดได้ ดังนี้ คือ

    Private Sub Text1_KeyPress(KeyAscii As Integer)
        ' ส่งค่า KeyAscii ไปยังฟังค์ชั่น และต้องส่งกลับมาหาตัวมันเองด้วย
        ' และการกดคีย์ในแต่ละัครั้ง ก็คือเหตุการณ์ที่คอยดักไว้ (Event)
        ' การดักไว้ในแต่ละครั้ง ก็คือ สั่งให้มันไปทำอะไร (Driven)
        KeyAscii = CheckAlphaNumericUCaseID(KeyAscii)
    End Sub
    
    ' =================================================
    ' ตรวจสอบค่าเฉพาะ 0 - 9, a - z  และ A - Z และเครื่องหมาย _ กับ -
    ' เมื่อ KeyAscii ก็คือค่า KeyAscii ที่ส่งมายังฟังค์ชั่น
    Function CheckAlphaNumericUCaseID(Index As Integer) As Integer
    ' =================================================
        Select Case Index
            ' เมื่อ ASCII Code 48 - 57 คือตัวอักขระ 0 - 9
            ' เมื่อ ASCII Code 65 - 90 คือตัวอักขระ A - Z
            ' เมื่อ ASCII Code 97 - 122 คือตัวอักขระ a - z
            ' รวมทั้งแปลงตัวอักขระ _ (Underscore) กับ - (Minus)
            ' ด้วยคำสั่ง Asc เพื่อไม่ต้องจำ ASCII Code
            ' ในแต่ละ Case ก็คือ หาก KeyAscii (Index เป็นตัวแปรรับค่า) ที่ส่งมานี้
            ' มีค่าตรงกับแต่ละ Case ก็จะส่งค่า KeyAscii เดิมนั้นกลับไป
            ' แต่หากไม่ตรงสักตัว ก็คือ Case Else ให้ส่งค่า KeyAscii = 0 กลับ
            ' เมื่อ KeyAscii = 0 หมายถึงไม่มีการกดคีย์ใดๆ ... ว่าง่ายๆก็ไม่ยอมให้กดคีย์อื่นนอกเหนือจากที่ต้องการ
            Case 48 To 57, 65 To 90, 97 To 122, Asc("-"), Asc("_")
            Case 8           ' Back Space
            Case 13         ' Enter
            Case Else       ' นอกเหนือจากที่กำหนดมาตาม Case ด้านบน ให้ส่งค่ากลับเป็น 0
                Index = 0
        End Select
        
        ' Return ค่ากลับ KeyAscii
        CheckAlphaNumericUCaseID = Index
    
    End Function
    
พอเราได้คีย์ หรือ ตัวอักขระ ตามที่ต้องการแล้ว เรายังไม่สามารถเปลี่ยนเป็นตัวอักขระตัวใหญ่ได้ด้วยคำสั่ง UCase(String) เพราะว่าค่าใน UCase มันต้องใช้ตัวอักขระ (String) ... ซึ่ง KeyAscii ที่ส่งมามันเป็นตัวเลขจำนวนเต็มอยู่ (Integer) ดังนั้นต้องการเปลี่ยน ASCII Code (KeyAscii) ให้กลายเป็นตัวอักขระด้วยฟังค์ชั่น Chr(CharCode As Long) ...
    สมมุติกดคีย์ "a" หรือ KeyAscii = 97 น่ะครับ
  • Chr(CheckAlphaNumericUCaseID(KeyAscii)) = a
  • จากนั้นต้องแปลงเป็นอักขระตัวใหญ่อีกที ... ด้วยฟังค์ชั่น UCase (Upper Case) - ก็เพราะเราต้องการรับเฉพาะตัวอักขระตัวใหญ่นี่ครับ ...
  • UCase(Chr(CheckAlphaNumericUCaseID(KeyAscii))) = A
  • แปลงตัวอักขระให้เป็น Ascii Code กลับคืนด้วยฟังค์ชั่น Asc(String As String) As Integer อีกรอบ ... เพราะต้องหาค่าของ KeyAscii กลับคืนไป ถึงจะจบกระบวนการได้
  • Asc(UCase(Chr(CheckAlphaNumericUCaseID(KeyAscii)))) = 65 เพื่อส่งค่าให้กับ KeyAscii นั่นคือ โค้ดเต็มๆก็จะได้แบบนี้ ...
    Private Sub Text1_KeyPress(KeyAscii As Integer)
        ' ส่งค่า KeyAscii ไปยังฟังค์ชั่น และต้องส่งกลับมาหาตัวมันเองด้วย
        KeyAscii = Asc(UCase(Chr(CheckAlphaNumericUCaseID(KeyAscii))))
    End Sub
เพราะว่า KeyAscii เป็นตัวแปรชนิดเลขจำนวนเต็ม (Integer) เมื่อ KeyAscii = 65 ซึ่งก็คือตัวอักขระ "A" นั่นเอง... ชัดเจนมั้ยครับ ...
    แม้ว่าจะดูยืดยาวกันไปสักหน่อย แต่มันไม่ทางเลือกเป็นอื่นที่ดีกว่านี้ ... หรือท่านใดมี Good Idea ก็นำเสนอมาได้เลยน่ะครับ ... 55555+ ... แน่นอนครับหลายคนได้โค้ดของผมไปแล้ว แทบจะไม่คิดอะไรตามไปด้วยเลย สังเกตว่า Asc(UCase(Chr(CheckAlphaNumericUCaseID(KeyAscii)))) ... มันยาวมากเกินไปครับ เวลานำไปใช้งานมันค่อนข้างจะจดจำยากลำบากมาก ... เรามีวิธีการลดรูปแบบลงดังนี้ คือ
    
    ' ตอนเรียกใช้งานฟังค์ชั่น CheckAlphaNumericUCaseID
    KeyAscii = CheckAlphaNumericUCaseID(KeyAscii)
    
    ' =================================================
    ' ตรวจสอบค่าเฉพาะ 0 - 9, a - z  และ A - Z และเครื่องหมาย _ กับ -
    ' เมื่อ KeyAscii ก็คือค่า KeyAscii ที่ส่งมายังฟังค์ชั่น
    Function CheckAlphaNumericUCaseID(Index As Integer) As Integer
    ' =================================================
        Select Case Index
            ' เมื่อ ASCII Code 48 - 57 คือตัวอักขระ 0 - 9
            ' เมื่อ ASCII Code 65 - 90 คือตัวอักขระ A - Z
            ' เมื่อ ASCII Code 97 - 122 คือตัวอักขระ a - z
            ' รวมทั้งแปลงตัวอักขระ _ (Underscore) กับ - (Minus) ด้วยคำสั่ง Asc เพื่อไม่ต้องจำ ASCII Code
            ' ในแต่ละ Case ก็คือ หาก KeyAscii (Index เป็นตัวแปรรับค่า) ที่ส่งมานี้
            ' มีค่าตรงกับแต่ละ Case ก็จะส่งค่า KeyAscii เดิมนั้นกลับไป
            ' แต่หากไม่ตรงสักตัว ก็คือ Case Else ให้ส่งค่า KeyAscii = 0 กลับ
            ' เมื่อ KeyAscii = 0 หมายถึงไม่มีการกดคีย์ใดๆ ... ว่าง่ายๆก็ไม่ยอมให้กดคีย์อื่นนอกเหนือจากที่ต้องการ
            Case 48 To 57, 65 To 90, 97 To 122, Asc("-"), Asc("_")
            Case 8           ' Back Space
            Case 13         ' Enter
            Case Else       ' นอกเหนือจากที่กำหนดมาตาม Case ด้านบน ให้ส่งค่ากลับเป็น 0
                Index = 0
        End Select
        
        ' ก่อน Return ค่ากลับ ก็จัดองค์ทรงเครื่องกันซ่ะที่นี่เลย ... 55555+
        CheckAlphaNumericUCaseID = Asc(UCase(Chr(Index)))
    
    
    End Function
    
Conclusion:
สาเหตุที่อธิบายกันมาแบบละเอียดยิบ ท้ายสุดจนผมมาเฉลยให้รับชมกันเนี่ย จุดประสงค์ก็เพื่อให้พี่น้อง ได้ลองคิดๆตามไปด้วย นอกจากนี้ผมอยากให้สังเกตเห็นลักษณะแนวทางที่ผมเลือกใช้ Select Case แทนที่จะใช้ If ... Then ... Else เอาไว้ด้วยครับ ... พี่น้องจะเห็นตามเว็บไซต์ต่างๆทั่วไป รวมไปถึงท่านที่โพสต์เข้ามาในเว็บผม ก็มักจะใช้ IF มากกว่า ... Select Case จะเหมาะสมอย่างยิ่งต่อการใช้ช่วงของข้อมูล (Range) ในการทำเป็นเงื่อนไข ดูได้จาก Case 48 To 57, 65 To 90, 97 To 122, Asc("-"), Asc("_") ทำให้อ่านโค้ดง่าย ลด Bug ลง ... ลองเป็น If ... Then ... Else ซิครับ มันจะใช้กี่ IF และ กี่ OR 55555+ ... ดังนั้นก็ลองเปรียบเทียบดูเอาว่าอย่างไหนมันดีกว่ากันเอาเองน่ะครับ ... หุหุหุหุหุ
ข้อมูลเพิ่มเติม
วิธีการคิดกับตัวเลขจำนวนเต็ม
ตรวจสอบการกดแป้นคีย์บอร์ดเพื่อให้รับค่าเฉพาะตัวเลข และ จุดทศนิยมเท่านั้น (VB6)
ตรวจสอบการกดแป้นคีย์บอร์ดเพื่อให้รับค่าเฉพาะตัวเลข (VB.Net)
การพิมพ์บาร์โค้ดด้วย Active Report 2.0 ออกกระดาษ A4
การเข้ารหัส และ ถอดรหัส ด้วยตรรกศาสตร์ XOR (eXclusive OR) - ภาค 1
การเข้ารหัส และ ถอดรหัส ด้วยตรรกศาสตร์ XOR (eXclusive OR) - ภาค 2

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