thongkorn โพสต์ 2017-10-22 22:21:46

[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]
ดูในรูปแบบกติ: [VB6] การนำ ComboBox Control ไปใส่ไว้ในตารางกริด MSFlexGrid แบบ Run Time