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

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

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

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

VB6 กับการค้นหาข้อความอยู่ใน ComboBox ด้วยฟังค์ชั่น SendMessage (API)

Category »  VB 6/VB.Net
โดย : Webmaster เมื่อ 30/1/2554   เวลา: 14:56
(อ่าน : 32748) 
เรื่องของการใช้งาน API (Application Programming Interface) ก็ต้องยอมรับล่ะครับว่ามันก็อาจจะเป็นเรื่องค่อนข้างยาก เพราะหาข้อมูล หรือ คำอธิบายในภาคภาษาไทยได้น้อยมาก ... สำหรับหลักการเบื้องต้นผมจะไม่ขออธิบาย เพราะเขียนไว้นานหลายปีแล้วครับ (หรือสามารถคลิ๊กอ่านได้ที่นี่) ... บทความนี้ผมจะอธิบายรายละเอียดของการประยุกต์เรื่องของการเรียกฐานข้อมูลเข้ามาใช้งาน และใช้ฟังค์ชั่น SendMessage เพื่ออำนวยความสะดวกต่อผู้ใช้งาน ในการค้นหา หรือ เลือกรายการจาก ComboBox ซึ่งคงพอที่จะเข้าใจได้อย่างไม่ยากเย็นเกินไปหรอกน่ะครับ (ดูคำอธิบายที่โค้ดเลย) ... คิดว่าน่าจะมีประโยชน์ต่อพี่น้องผองเพื่อนร่วมอาชีพกันได้พอสมควรแหละครับ ... หรือหากจะเอาแบบขั้นใช้งานได้จริงๆก็คลิ๊กเข้าไปดูที่นี่ครับ ...
ดาวน์โหลด Source Code สำหรับผู้ใช้งาน Visual Basic 6
ดาวน์โหลด Source Code สำหรับ MS Visual Basic 6.0 - Service Pack 6
 ดาวน์โหลด Visual Basic 6.0 SP5: Run-Time Redistribution Pack
 ดาวน์โหลด Microsoft Data Access Object (MDAC) และ Jet 4.0 Update
 ดาวน์โหลด Microsoft Visual Basic Service Pack 6
ข้อมูลเพิ่มเติม
เล่น Application Programming Interface (API) - SendMessage
การค้นหาข้อความที่มีอยู่ใน ListBox อย่างรวดเร็ว (API)
การใช้งาน ComboBox ด้วย Method อนุบาลแมวเหมียว กับ การใช้ Win32 API ว่าใครมันจะเร็วกว่ากัน
แจกฟรี Source Code VB6+Access โปรแกรมระบบฐานข้อมูลครุภัณฑ์ ภาคเขียนโปรแกรม (ใช้งานจริง)

ตัวอย่างหน้าจอการใช้งาน
มาดูโค้ดกันเถอะ ...

Option Explicit

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
' อธิบายฟังค์ชั่น SendMessage
' hWnd คือ วัตถุ (Object) หรือ Control ที่เราต้องการติดต่อกับมัน ในที่นี้คือ ComboBox
' wMsg คือ สิ่งที่ส่งไปบอกวัตถุว่าจะให้มันทำอะไร ในที่นี้คือการค้นหา โดยการกำหนดค่าคงที่ให้คือ 14C (ฐาน 16)
' wParam และ lParam คือ พารามิเตอร์เสริมเข้าไป ซึ่งมีหน้าที่ และ ความหมายแตกต่างกันไปใน Message แต่ละชนิด
' พารามิเตอร์ทั้งสองตัวนี้หากไม่ได้ใช้งาน ต้องกำหนดค่า 0 ไว้ด้วย
' กรณีการค้นหา lParam คือ ค่าที่ส่งไปให้กับ ComboBox ในที่นี้คือ ค่าจาก StrKey

' ตัวอย่างการใช้งาน SendMessage(Combo1.hWnd, CB_FINDSTRING, -1, ByVal StrKey)
' hWnd ก็คือติดต่อกับ ComboBox Control (Combo1.hWnd)
' wMsg ก็คือการค้นหาคีย์ที่กดใน ComboBox (CB_FINDSTRING)
' wParam กำหนดค่า (-1) คือการค้นหาคีย์ที่พบจากบนสุด
' lParam คือคีย์ที่ต้องการค้นหานั่นเอง (StrKey)

' ประกาศตัวแปรค่าคงที่ (Constants) ... ตัดมาจาก Win32 API ได้เลย
' CB คือ ComboBox หรือหากเป็น ListBox ชื่อตัวแปรก็จะขึ้นต้นด้วย LB หรือ TextBox ก็จะใช้ TB เป็นต้น
Private Const CB_FINDSTRING = &H14C
Private Const CB_ERR = (-1)

' ประกาศตัวแปรสำหรับการเชื่อมต่อไฟล์ฐานข้อมูล และ ตารางข้อมูล
Dim ConnDB As ADODB.Connection
Dim RS As ADODB.Recordset

Private Sub Form_Load()

' ติดต่อกับไฟล์ฐานข้อมูล - MS Access
Set ConnDB = CreateObject("ADODB.Connection")
ConnDB.Provider = "Microsoft.Jet.OLEDB.4.0"
ConnDB.Open App.Path & "\MyDB.mdb"
Set RS = New ADODB.Recordset
RS.Open "Select ProvinceName FROM tblProvince ORDER BY ProvinceName ", _
            ConnDB, adOpenForwardOnly, adLockReadOnly, adCmdText

Combo1.Clear

' ตัวอย่างการนำข้อมูลจากตารางรายชื่อจังหวัดมาแสดงผลใน ComboBox
Do Until RS.EOF
    Combo1.AddItem RS("ProvinceName")
    RS.MoveNext
Loop
RS.Close: Set RS = Nothing

' ตั้งค่าแสดงผลข้อมูลที่รายการแรกของ ComboBox
If Combo1.ListCount > 0 Then Combo1.ListIndex = 0

End Sub

' #########################################################
' เหตุการณ์รับค่าการกดคีย์ใดๆเข้ามาที่ ComboBox
' #########################################################
Private Sub Combo1_KeyPress(KeyAscii As Integer)
    Dim StrKey As String
    Dim LenKey As Long
    
    ' ตัวแปรนี้จะรับค่าการทดสอบจากฟังค์ชั่น SendMessage
    Dim lRet As Long
    
    Combo1.SelText = ""
    
    ' รับคีย์ที่กดเข้ามา
    StrKey = Combo1.Text & Chr$(KeyAscii)
    
    ' หากค้นหาคีย์ที่กดใน ComboBox ไม่พบจะทำให้ค่า lRet = (-1)
    ' หากค้นหาคีย์ที่กดพบ lRet จะรับค่า Index จาก ComboBox เข้ามาแทน เช่น
    ' กด "ก" ทำให้ lRet  = 1 (กระบี่ ซึ่งจะมีค่า Index = 1)
    ' กด "ข" ทำให้ lRet  = 6 (ขอนแก่น ซึ่งจะมีค่า Index = 6)
    ' กด "อ" ทำให้ lRet  = 70 (อยุธยา ซึ่งจะมีค่า Index = 70)
    lRet = SendMessage(Combo1.hWnd, CB_FINDSTRINGG, -1, ByVal StrKey)
    
    ' หากพบคีย์ที่กดจะทำให้ lRet <> (-1)
    If lRet <> CB_ERR Then
        ' นับความยาวของคีย์ที่กดเข้ามา
        LenKey = Len(StrKey)
        
        ' แสดงผลตัวอักษรตัวแรก (หรือตัวต่อไป) ที่กดคีย์แล้วพบ
        Combo1.Text = Combo1.List(lRet)
        ' ให้ชี้ Index ที่ได้
        Combo1.ListIndex = lRet
        
        ' ลบการกดคีย์เดิมออกไป (เหมือนไม่มีการกดคีย์ใดๆเลย)
        KeyAscii = 0
        
        ' ทำ HightLight ข้อมูลที่อยู่ใน ComboBox
        Combo1.SelStart = LenKey
        Combo1.SelLength = Len(Combo1.Text) - LenKey
        
    End If
    
End Sub

' #########################################################
' เหตุการณ์ที่ไม่ได้มีการ Focus อยู่ที่ Combobox แล้ว
' ตรงนี้นำไปประยุกต์ใช้งานเองด้วยครับ เพราะตัวอย่างนี้ผมมี Control แค่ตัวเดียว
' #########################################################
Private Sub Combo1_LostFocus()
    Dim StrKey As String
    Dim lRet As Long
    
    ' รับค่าข้อมูลที่อยู่ตัวล่าสุดเอาไว้
    StrKey = Combo1.Text
    ' ทดสอบก่อน (CB_FINDSTRING) เพื่อรับค่า Index ของ ComboBox
    lRet = SendMessage(Combo1.hWnd, CB_FINDSTRING, -1, ByVal StrKey)
    
End Sub

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
    ' ตรวจสอบว่ามีการเชื่อมโยง - Connect ข้อมูลหรือไม่
    If ConnDB.State = adStateOpen Then
        ConnDB.Close
        Set ConnDB = Nothing
    End If
    
    Set frmSearchComboBox = Nothing
    End
End Sub
Conclusion:
ฟังค์ชั่น SendMessage ค่อนข้างจะเป็น API พื้นฐาน ที่จะต้องเรียกมาใช้งานค่อนข้างจะบ่อยครั้งมากสำหรับ MS Visual Basic 6 ... การนำเอา API มาใช้งานให้ได้นั้น ผมเองขอบอกได้เลยว่า บ่อยครั้งที่ต้องอาศัยหลักการ "ดู เดา ดำน้ำ" แล้วก็นำมาประยุกต์ต่อเอาเองแหละครับ แต่หากจะมาทำแบบมั่วๆเหมือนผมได้ (55555+) ก็ต้องพยายามหมั่นฝึกอ่านภาษาอังกฤษให้คล่องด้วยล่ะกันครับพี่น้อง ...

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