การค้นหาข้อความที่มีอยู่ใน ListBox อย่างรวดเร็ว (API)
Friday, September 7, 2012
0
comments
แน่นอนครับว่า ในงานลักษณะแบบนี้ ก็คงหนีไม่พ้นต้องนำเอา 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