การค้นหาข้อความที่มีอยู่ใน ListBox อย่างรวดเร็ว (API)

Posted by Unknown Friday, September 7, 2012 0 comments

ตอนนี้ก็จะขอกล่าวถึง Control พื้นฐานที่ยอดนิยมอีกตัวหนึ่งใน Visual Basic นั่นก็คือ List Box โดยจะแสดงตัวอย่างในการที่ผู้ใช้งานพิมพ์ข้อความใดๆ ลงไปใน TextBox เพื่อค้นหาคำที่ตรงกันกับที่อยู่ใน ListBox หากข้อความตรงกัน ที่ Control ListBox ก็จะแสดงแถบแสงออกมาให้เห็น แต่ทางตรงกันข้าม หากไม่มีข้อความใดตรงกัน ก็จะไม่แสดงผลออกมา

แน่นอนครับว่า ในงานลักษณะแบบนี้ ก็คงหนีไม่พ้นต้องนำเอา Windows API (Application Programming Interface) ที่ถูกบรรจุเอาไว้ใน Visual Basic มาช่วยด้วยอยู่แล้ว โดยอาศัยเทคนิคของฟังค์ชั่น SendMessage (ปกติแล้ว Control หรือ Object แต่ละตัวนั้นมีการพูดคุยหรือติดต่อสื่อสารกันได้ ก็เพราะ SendMessage นี่แหละครับ) ด้วย LB_FINDSTRING (ListBox Find String - &H18F) สำหรับ ListBox เพื่อระบุตำแหน่งในส่วนที่ตรงกันกับตัวอักษรที่เราคีย์เข้าไป ดังนั้น Message ที่เราส่งไปยัง List Box มันก็คือ ค่าเลขจำนวนเต็มคงที่แบบ Global ในที่นี้ก็คือ 18F ฐานสิบหกนั่นเอง โดยที่ฟังค์ชั่น:

SendMessage(hWnd, LB_FINDSTRING, wParam, lParam)

เื่มื่อ

hWnd - กำหนด Handle Windows ให้ไปอยู่ที่ List box
wParam - ระบุตำแหน่งในการค้นหา ถ้ากำหนดให้มีค่าเป็น -1 แล้วก็จะเป็นการค้นหาำทั้งหมดที่มีอยู่ใน Control

lParam - ข้อความที่ต้องการค้นหา


เอา ล่ะครับ เรามาเริ่มต้นทำงานกันเลยดีกว่า อันดับแรกก็คือ สร้างฟอร์ม Standard EXE ขึ้นมาใหม่ 1 ฟอร์ม (ชื่อ Form1) จากนั้นให้เลือก Control ใน ToolBox มา 2 ตัว ตัวแรกก็คือ
ListBox (ชื่อ List1) และ อีกตัวก็คือ TextBox (ชื่อ Text1) แล้วนำมาวางไว้บน Form1


ต่อไปให้ประกาศโค้ดดังข้างล่างนี้
ใต้ Option Explicit หรือ ส่วนของการประกาศทั่วไป (General
Declarations) ของ Form1:








Option Explicit
Const LB_FINDSTRING = &H18F

Private Declare Function SendMessage Lib "User32" _
Alias "SendMessageA" _
(ByVal hWnd As Long, _
ByVal wMsg As Integer, _
ByVal wParam As Integer, _
lParam As Any) As Long

ส่วนของโค้ดที่จะอยู่ในฟอร์ม - Form1

Private Sub Form_Load()
List1.Clear
' เพิ่มรายการ (Item) เข้าไปไว้ใน ListBox

List1.AddItem "Apples"
List1.AddItem "Banana"
List1.AddItem "Bread"
List1.AddItem "Break"
Text1.Text = ""
End Sub

' เกิดเหตุการณ์เปลี่ยนแปลงใน TextBox

Private Sub Text1_Change()
List1.ListIndex = SendMessage(List1.hWnd, LB_FINDSTRING, -1, ByVal Text1.Text)
End Sub



ก็ จบกระบวนการแล้ว เริ่มกด F5 เพื่อรันโปรแกรมได้เลยทันที จากนั้นให้คีย์ข้อความลงไปใน TextBox จะเห็นได้ว่าหากว่าเราป้อนข้อความลงไปใน TextBox แล้วไปตรงกับข้อความใดๆ ที่แสดงอยู่ใน ListBox ก็จะเกิดแถบแสง (Focus) แสดงให้เห็นบน ListBox

0 comments:

Post a Comment