' ==========================================================
' การทดสอบและเปรียบเทียบการเพิ่มไอเท็ม (Add Item) ใน ComboBox ด้วย
' 1. การเพิ่มไอเท็มด้วยการใช้ Method AddItem ตามปกติ
' 2. การเพิ่มไอเท็มด้วยการใช้ Win32 API (Application Programming Interface)
' URL: http://www.g2gnet.com
' eMail: [email protected] หรือ [email protected]
' ==========================================================
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 คือ สิ่งที่ส่งไปบอกวัตถุว่าจะให้มันทำอะไร ในที่นี้คือการเพิ่มไอเท็ม โดยการกำหนดค่าคงที่ให้คือ 143 ฐาน 16
' wParam และ Param คือ พารามิเตอร์เสริมเข้าไป ซึ่งมีหน้าที่ และ ความหมายแตกต่างกันไปใน Message แต่ละชนิด
' พารามิเตอร์ทั้งสองตัวนี้หากไม่ได้ใช้งาน ต้องกำหนดค่า 0 ไว้ด้วย ส่วนในกรณีนี้
' wParam = 0 หมายความว่า ไม่ได้ใช้งาน
' lParam คือ ค่าที่ส่งไปให้กับ ComboBox ในที่นี้คือ ค่าจาก strItemText
' กำหนดค่าคงที่เพื่อระบุว่าเป็นการเพิ่มไอเท็ม โดยกำหนดค่าคงที่เป็น 143 เลขฐาน 16
Private Const CB_ADDSTRING = &H143
' หรือ กำหนดให้ลบไอเท็มออกก็ใช้
Private Const CB_DELETESTRING = &H144
' หรือ กำหนดให้ล้างไอเท็มทั้งหมดออกก็ใช้
Private Const CB_RESETCONTENT = &H14B
' ================================================================
' หมายเหตุ: หากคุณย้ายค่าคงที่เหล่านี้ไปไว้ใน Module (นามสกุล .BAS)
' คุณต้องเปลี่ยนจาก Private ให้เป็น Public เพื่อให้ทุกๆฟอร์มสามารถมองเห็นด้วยเด้อ ... พี่น้อง
' ไฟล์ดาวน์โหลดที่ผมให้มาจะมีค่าคงที่ (Constant) สำหรับการใช้ SendMessage มาด้วยครับ
' ให้ดูตัวอักษรตัวหน้าสำหรับ Control แต่ละตัวด้วย เช่น
' CB หมายถึง ComboxBox หรือ
' LB หมายถึง ListBox หรือ
' TB หมายถึง TextBox นี่เป็นตัวอย่าง ไม่ใช่เป็นต้น (ไม้) ... 55555 ... โปรแกรมเมอร์อารมณ์สุนทรีย์
' ================================================================
' ทดสอบด้วยการใช้ Win32 API
Private Sub cmdComboAPI_Click()
Dim strItemText As String
Dim CountIndex As Integer
Dim StartTimer As Double
cmbTest.Clear
' เริ่มจับเวลา
StartTimer = Timer
' วิธีการเพิ่มไอเท็มด้วยการใช้งาน Win32 API
' ทำรายการขึ้นมาเพิ่มเข้าไปสัก 5000 รายการ จะได้เห็นกันชัดๆว่าของใครน่ะมันแน่กว่ากัน
For CountIndex = 1 To 5000
strItemText = "ลำดับที่: " & CStr(CountIndex)
' ส่ง Message ไปบอก
' ComboxBox (ชื่อ cmbTest), ด้วยวิธีการเพิ่มค่าเข้าไป (กำหนดค่า 143 เลขฐาน 16), 0 = ไม่ได้ใช้, ระบุเป็นค่า (ByVal) ของ strItemText
SendMessage cmbTest.hWnd, CB_ADDSTRING, 0, ByVal strItemText
Next
' StartTimer คือ เวลาที่เรากำหนดค่ามาก่อน ซึ่งก็คือเวลาเริ่มต้นล่ะครับ
' Timer คือ เวลาปัจจุบัน ณ ขณะนี้ ซึ่งก็คือเวลาที่สิ้นสุดของการทำงาน
MsgBox "ใช้เวลา: " & Format(Timer - StartTimer, "0.000") & " วินาที", vbOKOnly + vbInformation, "การใช้ Win32 API"
' หากคุณอยากลองเล่นกับมันด้วยการสั่งให้ Clear ค่าใน ComboBox
' ในการ Clear ปกติเราสั่งดังนี้ ... cmbTest.Clear
' สำหรับ Win32 API
' SendMessage cmbTest.hWnd, CB_RESETCONTENT, 0, 0
' 0 กับ 0 ที่เห็นคือ เราไม่ได้ใช้งาน wParam, lParam แต่เราต้องระบุค่า 0 ไว้ให้รู้ว่าเราไม่มีการใช้งานพารามิเตอร์นี้ครับผม
' หรืออยากลองลบไอเท็มตาม Index ที่ชี้ออกไป ก็ใช้ดังนี้
' เช่น การใช้ Method ในการ Remove ปกติเราสั่งดังนี้ ... cmbTest.RemoveItem 2
' หมายความว่าต้องการลบไอเท็มที่มี Index = 2 ออกไป (การเริ่มต้นนับ Index ใน ComboBox จะเริ่มจาก 0 น่ะครับ)
' สำหรับ Win32 API
' โดยปกติเมื่อเราเล่น API อย่างนี้ หากมีข้อผิดพลาดเกิดขึ้น เช่น คุณมี Index ทั้งหมดจาก 0 - 9 แต่คุณสั่งไปลบ Index ที่ 10
' เราก็ต้องตามไปตรวจสอบเอาเอง ไม่งั้นมันไม่บอกคุณหรอก ... เอ๊ะ แล้วมันง่ายกว่าหรือเปล่าล่ะเนี่ย
' การตรวจสอบแบบง่ายๆว่ามี Error หรือไม่ ด้วยการทดสอบค่าที่ Return กลับมา
' Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (
' .................
' ) As Long ก็คือเจ้าตัวนี้แหละเป็นค่าที่ต้อง Return กลับมา
' Dim Result As Long
' Result = SendMessage(cmbTest.hWnd, CB_DELETESTRING, 2, 0)
' MsgBox Result
' กรณีนี้ Result = 4999
' Result = SendMessage(cmbTest.hWnd, CB_DELETESTRING, 20000, 0)
' MsgBox Result
' กรณีนี้ Result = -1 นั่นคือ เกิดความผิดพลาดขึ้นมาน่ะครับ ... พี่น้อง ... ปาทังก้า เอ๊ย ยูเรก้า
' ลองเล่นดูเถอะครับพี่น้อง ... Learning By Doing มันคือ เรียนไป ก็ทำไป แต่ต้องใช้สมองคิด+จินตนาการตามไปด้วย
End Sub
' ทดสอบด้วย Method AddItem ตามปกติ
Private Sub cmdComboVB_Click()
Dim strItemText As String
Dim CountIndex As Integer
Dim StartTimer As Double
cmbTest.Clear
StartTimer = Timer
' วิธีการเพิ่มไอเท็มเข้าสู่ ComboBox ด้วยการใช้งาน Method AddItem ตามปกติ
' ทำรายการขึ้นมาเพิ่มเข้าไปสัก 5000 รายการ
For CountIndex = 1 To 5000
strItemText = "ลำดับที่: " & CStr(CountIndex)
cmbTest.AddItem strItemText
Next
MsgBox "ใช้เวลา: " & Format(Timer - StartTimer, "0.000") & " วินาที", vbOKOnly + vbInformation, "การใช้ Method AddItem ตามปกติ"
End Sub
Private Sub Form_Load()
cmbTest.Clear
End Sub
|