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

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

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

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

การใช้งาน ComboBox ด้วย Method อนุบาลแมวเหมียว กับ การใช้ Win32 API ว่าใครมันจะเร็วกว่ากัน

Category »  VB 6/VB.Net
โดย : Webmaster เมื่อ 22/3/2550 1:59:00
(อ่าน : 19666) 
พูดถึงเรื่องของ Win32 API (Application Programming Interface) ขึ้นมาทีไร เหล่าโปรแกรมเมอร์หลายคนก็แทบจะส่ายหน้าแล้วครับ ... พี่น้อง แต่คุณลองอ่านบทความนี้ก่อนครับ ผมว่าคุณอาจจะเปลี่ยนใจมาชอบมันก็เป็นไปได้ (อย่างแน่นอน) ส่วนพื้นฐาน หรือ รายละเอียดของ API มันคืออะไรผมคงไม่ขอกล่าวถึงล่ะกัน ก็มีหลายเว็บที่เขาบอกไปแล้วแหละ เอาเป็นว่าหลังจากที่ได้อ่านไปแล้ว คุณจะจินตนาการเพื่อนำมันไปใช้ให้เกิดประโยชน์ได้อย่างไรล่ะครับ ... พี่น้อง
ดาวน์โหลด Source Code สำหรับ MS Visual Basic 6.0 - Service Pack 6

Design Time
Design Time

Execute
Execute



' ==========================================================
' การทดสอบและเปรียบเทียบการเพิ่มไอเท็ม (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

Conclusion:
มันไม่ได้หมายความว่าการใช้ API จะดีเสมอไปหรอกน่ะครับ เพราะมันดูยุ่งยากมากกว่าวิธีการปกติซ่ะอีก API ในลักษณะนี้จึงเหมาะกับปริมาณข้อมูลที่นำมาใส่ ComboBox เป็นจำนวนมากๆ ซึ่งโอกาสในการนำมาใช้มันค่อนข้างจะน้อย (จริงๆ) ประเด็นสำคัญมัีนไม่ได้อยู่ ณ จุดนี้ แต่มันสำคัญที่เราได้ศึกษา ได้ลองเล่นกับ API แบบพื้นฐาน เช่น SendMessage นี่แหละให้กระจ่างขึ้นมา (อีกโข) จากนั้นก็นำไปพัฒนาใช้งานกับ Object ตัวอื่นๆ หรือ สถานะการณ์อื่นๆ ที่เราอาจไม่เคยล่วงรู้มาก่อน แต่สามารถนำแนวทางที่ได้ศึกษานี้ไปใช้เพื่อประกอบในการตัดสินใจอีกครั้งหนึ่งไงเล่าครับ

พักหลังๆเห็นเหล่าน้องๆนักศึกษาหิ้วตำราที่แจกเป็น CD ตัวอย่างมาให้ด้วย รวมไปถึงพวกรับจ้างทำโปรเจคนักศึกษา ก็ยังเอามาหลอกขาย ทำมาหากินกับน้องๆนักศึกษา (ที่ขี้เกียจ) เหล่านี้แหละ ... เอาไว้ว่างๆจะมาเล่าพฤติกรรมทุเรศๆของกลุ่มคนเหล่านี้ ที่อยู่ในจังหวัดขอนแก่นให้ได้รับรู้กัน บางคนยังมีคำว่าอาจารย์นำหน้าเลย ... มันก็ทำไปได้ คิดดูครับพี่น้อง เจอหน้าอยากด่าเป็นภาษาแอสเซมบลี้สักที
mov AX, The Dog ก็แปลเป็นภาษาคนได้ว่า โหลดข้อมูลเข้ารีจีสเตอร์ AX ด้วยสุนัข ครับท่าน ... 55555

เอ้า เดี๋ยวจะไปกันใหญ่ คือ คนที่แต่งตำราออกมาขาย (โทษน่ะครับ จำชื่อไม่ได้) เขาก็มีเจตนาที่ดีอยู่แล้ว ทีนี้เมื่อเราศึกษาดูแล้ว หากอยากพัฒนาตัวเองให้มากขึ้น ก็ลองใส่ไอเดียตัวเองเข้าไปซิครับ เอาเป็นว่าผมลองนำทางไปให้สักเรื่องแล้วกัน เช่น


แบบเดิมน่ะ เวลาคุณจะเข้าไปแก้ไขก็ต้องดับเบิ้ลคลิ๊กจากแถวที่ต้องการขึ้นมา คุณก็ลองเปลี่ยน (ฝึกฝนวิทยายุทธนั่นแหละ) โดยใช้ ComboBox เข้ามาช่วย โดยให้แสดงในตำแหน่ง Cell ของรหัสสินค้า หรือ ชื่อสินค้า หรือ ... แทน (ให้อ่านบทความ ตารางกริดธรรมดา ที่ไม่ธรรมดา ของผมประกอบไปด้วยครับ ... ลองดู ลองทำไปก่อนรอบหน้าผมจะมีเฉลยให้) ซึ่งกรณีนี้ปริมาณสินค้ามันอาจจะมีเป็นจำนวนมาก ดังนั้นต้องอาศัย Win32 API เข้ามาช่วยไงล่ะครับ เพื่อให้เกิดการแสดงผลข้อมูลที่รวดเร็ว ... เป็นไงล่ะครับ ... บทสรุปของผม.

 


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