[VB6] การนำ ComboBox Control ไปใส่ไว้ในตารางกริด MSFlexGrid แบบ Run Time
http://www.g2gnet.com/webboard/images/vb6/flexgridcombovb6.pngการทำงานกับบริษัทฯข้ามชาติ เขาค่อนข้างที่จะเข้มงวดมากกับเรื่องซอฟท์แวร์ลิขสิทธิ์ เวลาพัฒนาโปรแกรมต่างๆที่ใช้งานในหน่วยงานขององค์กร จึงต้องใช้ทรัพยากรระบบที่มีอยู่อย่างเต็มที่ จะไปคาดหวังขอจัดซื้อจัดหาคอมโพเนนท์สุดหรูดูเริ่ดมาใช้งาน มันไม่ใช่เรื่องง่ายๆเลย หากพาวเวอร์แรงเจอร์ไม่เพียงพอ 5555+ ... นี่แหละคือที่มาของบทความในเรื่องนี้ครับผม ...
ตาราง MSFlexGrid เป็น Component ที่ติดมากับ Visual Basic 6 มีความเร็วในการอ่านข้อมูลได้ดี แต่มันมีคุณสมบัติเป็นแบบ Read Only คือแสดงผลข้อมูลได้อย่างเดียว ไม่สามารถคีย์ข้อมูลอะไรเข้าไปได้ แล้วเราจะนำเอา ComboBox เข้าไปใส่ไว้ในแต่ละเซลล์ที่เราต้องการได้อย่างไร???
หลักการคิด แบบเรียงลำดับขั้นตอนก็ไม่ได้ยุ่งยาก ...
- เมื่อเปิดฟอร์มขึ้นมา ต้องซ่อน ComboBox มันเอาไว้ก่อน (Visible = False)
- เมื่อเมาส์เคลื่อนไปจิ้มเลือกในเซลล์ที่เราต้องการ เราก็ย้าย ComboBox มันเคลื่อนที่ไปทับเซลล์นั้นๆ และเปิดให้มันแสดงผล (Visible = True)
- เมื่อผู้ใช้งานเลือก Item ที่มีอยู่ใน ComboBox เราก็ทำการคัดลอกข้อมูลนั้นไปเก็บเอาไว้ในเซลล์ที่ ComboBox มันทับเอาไว้
- เมื่อเกิดการเคลื่อนที่ออกจากเซลล์ไปโฟกัสยัง Control ตัวอื่นๆ เราก็ปิดการแสดงผลของ ComboBox (Visible = False) ก็เป็นอันจบพิธี' / -----------------------------------------------------------------------------------------------
Private Sub Form_Load()
'// Center form @Run time
Me.Move (Screen.Width - Width) \ 2, (Screen.Height - Height) \ 2
'// Initialize MSFlexGrid Control
Call SetupGrid
'
With Combo1
.ZOrder (0)
'// Load the ComboBox's list.
.AddItem "M100"
.AddItem "M150"
.AddItem "M16"
'// Adjust column width
.Width = fg.ColWidth(2)
.ListIndex = 0
'// Hidden Control
.Visible = False
End With
End Subเมื่อเริ่มต้นการทำงาน
' / -----------------------------------------------------------------------------------------------
' / Initialize FlexGrid
Private Sub SetupGrid()
' / -----------------------------------------------------------------------------------------------
With fg
.Clear
.Cols = 3
.TextMatrix(0, 0) = "Column 1"
.TextMatrix(0, 1) = "Column 2"
.TextMatrix(0, 2) = "Combo Box"
'//
.ColWidth(0) = 1200
.ColWidth(1) = 2600
.ColWidth(2) = Combo1.Width
'
.RowHeightMin = Combo1.Height
End With
'// เพิ่มรายการข้อมูลทดสอบเข้าไปใน MSFlexGrid
With fg
.AddItem "1" & vbTab & "Product 1" & vbTab & "M16"
.AddItem "2" & vbTab & "Product 2" & vbTab & "M150"
.AddItem "3" & vbTab & "Product 3" & vbTab & "M100"
.AddItem "4" & vbTab & "Product 4" & vbTab & "M16"
End With
End Subเริ่มต้นค่า (Initialize) ให้กับ MSFlexGrid และใส่ข้อมูลตัวอย่าง
' / -----------------------------------------------------------------------------------------------
' / เกิดเหตุการณ์นำเมาส์ไปคลิ๊กที่ Cell ใดๆใน MSFlexGrid
Private Sub fg_Click()
' / -----------------------------------------------------------------------------------------------
If fg.Row = 0 Then Exit Sub
'// เลือกหลักที่ต้องการ
Select Case fg.Col
'// ไม่ใช่หลักที่ต้องการให้ ComboBox ปรากฏ ก็ปิดการแสดงผลของ ComboBox
Case 0 To 1:
Combo1.Visible = False
'// หลักที่ 3 (Index = 2) คือหลักที่ต้องการ และทำการเคลื่อนย้ายตำแหน่ง ComboBox เข้าสู่ FlexGrid ได้
Case 2:
Combo1.Visible = True '// เปิดการแสดงผล ComboBox
Combo1.Text = fg.Text '// นำค่าจาก FlexGrid มาเทียบค่าใน ComboBox
'// เคลื่อนย้ายตำแหน่ง ComboxBox ไปในเซลล์ต่างๆของหลักที่ 3
'// Move ซ้าย, บน, กว้าง, สูง
Combo1.Move fg.CellLeft + fg.Left, fg.CellTop + fg.Top, fg.CellWidth
End Select
End Subเหตุการณ์นำเมาส์ไปคลิ๊กที่ Cell ใดๆใน MSFlexGrid โดยให้สังเกตหลักที่ 3 (โดยมี Index = 2 เพราะเรานับค่าเริ่มต้นจาก 0) ตรงนี้นี่เองที่เรานำเอา ComboBox เคลื่อนที่ไปปิดทับเซลล์นั้นๆ
' / -----------------------------------------------------------------------------------------------
Private Sub Combo1_Click()
' / -----------------------------------------------------------------------------------------------
'// กรณีโฟกัสหลัก 3 (Index = 2) หากเกิดการเปลี่ยนค่าในการเลือก ComboBox ก็นำค่านั้นไปใส่ไว้ในเซลล์ของ MSFlexGrid
If fg.Col = 2 Then fg.Text = Combo1.Text
End Subเมื่อคลิ๊กเลือกไอเทม ก็ทำการคัดลอก (Copy) ค่าในไอเทมไปใส่ไว้ในเซลล์ที่ถูกเลือก
http://www.g2gnet.com/webboard/images/vb6/flexgridcomponent.png
Project --> Components ...
มาดูโค้ดฉบับเต็ม
' / -----------------------------------------------------------------------------------------------
' / Developer : Mr.Surapon Yodsanga (Thongkorn Tubtimkrob)
' / eMail : thongkorn@hotmail.com
' / URL: http://www.g2gnet.com (Khon Kaen - Thailand)
' / Facebook: https://www.facebook.com/g2gnet (For Thailand)
' / Facebook: https://www.facebook.com/commonindy (Worldwide)
' /
' / Purpose: Adding ComboBox control into DataGridView @Runtime.
' / Microsoft Visual Basic 6.0 Service Pack 6
' /
' / This is open source code under @CopyLeft by Thongkorn Tubtimkrob.
' / You can modify and/or distribute without to inform the developer.
' / -----------------------------------------------------------------------------------------------
Option Explicit
' / -----------------------------------------------------------------------------------------------
Private Sub Form_Load()
'// Center form @Run time
Me.Move (Screen.Width - Width) \ 2, (Screen.Height - Height) \ 2
'// Initialize MSFlexGrid Control
Call SetupGrid
'
With Combo1
.ZOrder (0)
'// Load the ComboBox's list.
.AddItem "M100"
.AddItem "M150"
.AddItem "M16"
'// Adjust column width
.Width = fg.ColWidth(2)
.ListIndex = 0
'// Hidden Control
.Visible = False
End With
End Sub
' / -----------------------------------------------------------------------------------------------
' / Initialize FlexGrid
Private Sub SetupGrid()
' / -----------------------------------------------------------------------------------------------
With fg
.Clear
.Cols = 3
.TextMatrix(0, 0) = "Column 1"
.TextMatrix(0, 1) = "Column 2"
.TextMatrix(0, 2) = "Combo Box"
'//
.ColWidth(0) = 1200
.ColWidth(1) = 2600
.ColWidth(2) = Combo1.Width
'
.RowHeightMin = Combo1.Height
End With
'// เพิ่มรายการข้อมูลทดสอบเข้าไปใน MSFlexGrid
With fg
.AddItem "1" & vbTab & "Product 1" & vbTab & "M16"
.AddItem "2" & vbTab & "Product 2" & vbTab & "M150"
.AddItem "3" & vbTab & "Product 3" & vbTab & "M100"
.AddItem "4" & vbTab & "Product 4" & vbTab & "M16"
End With
End Sub
' / -----------------------------------------------------------------------------------------------
' / เกิดเหตุการณ์นำเมาส์ไปคลิ๊กที่ Cell ใดๆใน MSFlexGrid
Private Sub fg_Click()
' / -----------------------------------------------------------------------------------------------
If fg.Row = 0 Then Exit Sub
'// เลือกหลักที่ต้องการ
Select Case fg.Col
'// ไม่ใช่หลักที่ต้องการให้ ComboBox ปรากฏ ก็ปิดการแสดงผลของ ComboBox
Case 0 To 1:
Combo1.Visible = False
'// หลักที่ 3 (Index = 2) คือหลักที่ต้องการ และทำการเคลื่อนย้ายตำแหน่ง ComboBox เข้าสู่ FlexGrid ได้
Case 2:
Combo1.Visible = True '// เปิดการแสดงผล ComboBox
Combo1.Text = fg.Text '// นำค่าจาก FlexGrid มาเทียบค่าใน ComboBox
'// เคลื่อนย้ายตำแหน่ง ComboxBox ไปในเซลล์ต่างๆของหลักที่ 3
'// Move ซ้าย, บน, กว้าง, สูง
Combo1.Move fg.CellLeft + fg.Left, fg.CellTop + fg.Top, fg.CellWidth
End Select
End Sub
' / -----------------------------------------------------------------------------------------------
Private Sub Combo1_Click()
' / -----------------------------------------------------------------------------------------------
'// กรณีโฟกัสหลัก 3 (Index = 2) หากเกิดการเปลี่ยนค่าในการเลือก ComboBox ก็นำค่านั้นไปใส่ไว้ในเซลล์ของ MSFlexGrid
If fg.Col = 2 Then fg.Text = Combo1.Text
End SubConclusion: จะเห็นได้เลยว่าวิธีการขั้นตอนต่างๆนั้น มันไม่ได้มีอะไรที่ยุ่งยากซับซ้อนเลย นอกจากจะนำไปใช้งานจริงได้แล้ว ยังเป็นการฝึกคิดแก้ปัญหา นั่นก็หมายความว่ายิ่งได้รับประสบการณ์มากขึ้นจากการพัฒนาตนเอง ...
ดาวน์โหลดโค้ดต้นฉบับ VB6 ได้ที่นี่
หน้า:
[1]