thongkorn โพสต์ 2017-11-7 13:32:52

[VB6] การค้นหาคำ และการจำกัดความยาว (MaxLength) ใน ComboBox Control

http://www.g2gnet.com/webboard/images/vb6/ComboBoxSearch.png
ลองกด s
http://www.g2gnet.com/webboard/images/vb6/ComboBoxMaxLength.png
ทดสอบเรียกใช้ฟังค์ชั่น Call MaxComboBox(Combo1, 10, KeyAscii)

โดยธรรมชาติของ Visual Basic 6 หรือ VB6 จะไม่คุณสมบัติ (Properties) หรือ Method โดยตรงใดๆในการค้นหาคำ หรือจำกัดความยาว (MaxLength) ในการป้อนข้อมูลลงไปใน ComboBox แต่ทว่าด้วยขีดความสามารถของ VB6 ที่มันถูกซ่อนเร้นเอาไว้ ด้วยการดึงพลังออกมาจาก Windows API (Application Programming Interface) ก็จะช่วยทำให้งานที่เป็นไปไม่ได้ ให้เป็นไปได้ ...'// หากไปประกาศใน Module ต้องแก้ไขให้เป็นตัวแปรแบบ Public
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" ( _
    ByVal hwnd As Long, _
    ByVal wMsg As Long, _
    ByVal wParam As Long, _
    lParam As Any _
    ) As Long
   
Private Const CB_FINDSTRING = &H14C
Private Const CB_ERR = (-1)การประกาศใช้ฟังค์ชั่น SendMessage ที่อยู่ใน Library และการประกาศตัวแปรแบบคงที่ (Constant)

มาดูโค้ดฉบับเต็ม ... อย่าลืมกำหนดตอน Design Time ให้ ComboBox มีคุณสมบัติ Style = 0 - DropDown Combo
' / -----------------------------------------------------------------------------------------------
' / Developer : Mr.Surapon Yodsanga (Thongkorn Tubtimkrob)
' / eMail : thongkorn@hotmail.com
' / URL: http://www.g2gnet.com (Khon Kaen - Thailand)
' / Facebook: https://www.facebook.com/g2gnet (For Thailand)
' / Facebook: https://www.facebook.com/commonindy (Worldwide)
' /
' / Purpose: Search data and limit length input on ComboBox.
' / Microsoft Visual Basic 6.0 Service Pack 6
' /
' / This is open source code under @CopyLeft by Thongkorn Tubtimkrob.
' / You can modify and/or distribute without to inform the developer.
' / -----------------------------------------------------------------------------------------------
Option Explicit

'// หากไปประกาศใน Module ต้องแก้ไขให้เป็นตัวแปรแบบ Public
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" ( _
    ByVal hwnd As Long, _
    ByVal wMsg As Long, _
    ByVal wParam As Long, _
    lParam As Any _
    ) As Long
   
Private Const CB_FINDSTRING = &H14C
Private Const CB_ERR = (-1)

Private Sub Combo1_KeyPress(KeyAscii As Integer)
      '/ ไปโปรแกรมย่อยในการค้นหาคำใน ComboBox โดยส่งค่าไป 2 ตัว
      '/ ชื่อของ ComboBox และ KeyAscii ที่กดลงไป
      Call SearchComboBox(Combo1, KeyAscii)
      
      '/ จำกัดความยาวของการพิมพ์คำใน ComboBox
      Call MaxComboBox(Combo1, 10, KeyAscii)
End Sub

Private Sub Form_Load()
    With Combo1
      .AddItem "Fruit"
      .AddItem "Vetgetable"
      .AddItem "Soft Drink"
      .AddItem "Meat"
      .AddItem "Water"
      .AddItem "Snacks"
    End With
    Me.Combo1.ListIndex = 0
End Sub

' / -----------------------------------------------------------------------------------------------
' / โปรแกรมย่อยที่ช่วยจำกัดความยาวข้อมูลสำหรับ ComboBox
Private Sub MaxComboBox(cmb As ComboBox, MaxChar As Integer, KeyAscii As Integer)
   If Len(cmb.Text) >= MaxChar Then '// ถ้าหากมีความยาวมากกว่า หรือ เท่ากับที่ได้ตั้งไว้
         If KeyAscii <> vbKeyBack Then '// เป็นการกดคีย์ Back Space หรือไม่
            KeyAscii = 0 '// ไม่ใช่ให้ถือว่าไม่ได้กดคีย์ใดๆเลย
         End If
    End If
End Sub

' / -----------------------------------------------------------------------------------------------
' / โปรแกรมย่อยในการค้นหาคำในรายการของ ComboBox
Private Sub SearchComboBox(cmb As ComboBox, KeyAscii As Integer)
    Dim strKey As String, iRet As Long, LenKey As Long
    cmb.SelText = ""
    strKey = cmb.Text & Chr$(KeyAscii)
    iRet = SendMessage(cmb.hwnd, CB_FINDSTRING, -1, ByVal strKey)
    If iRet <> CB_ERR Then
      LenKey = Len(strKey)
      cmb.Text = cmb.List(iRet)
      cmb.ListIndex = iRet
      KeyAscii = 0
      cmb.SelStart = LenKey
      cmb.SelLength = Len(cmb.Text) - LenKey
    End If

End Sub
หน้า: [1]
ดูในรูปแบบกติ: [VB6] การค้นหาคำ และการจำกัดความยาว (MaxLength) ใน ComboBox Control