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

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

7 ธันวาคม พ.ศ.2549
1878 Users On-Line.
Visitors - Page views
 8 5 8 8 2 8 3
1 กุมภาพันธ์ พ.ศ.2551

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

เรียนรู้การใช้งาน FarPoint Spread ActiveX 8 COM - ภาค 1 (ปฐมบท)

Category »  VB 6/VB.Net
โดย : Webmaster เมื่อ 20/12/2552   เวลา: 15:45
(อ่าน : 16447) 
การเขียนบทความชิ้นนี้ หลังจากที่ได้ทดสอบ FarPoint Spread ไปเพียงแค่ 3 วัน เพื่อต้องการออกมาตอกย้ำความสำคัญของ MS Visual Basic 6 ว่ามันจ๊าบสุดๆเพียงไร ... ไม่งั้นทำไมเหล่าบรรดา Third Party ทั้งหลาย ยังคงให้การสนับสนุนตัวแปลภาษาตัวนี้กันอยู่เลย นั่นก็แสดงให้เห็นอย่างชัดเจนเลยว่า ยังคงมีนักพัฒนาซอฟท์แวร์ทั่วโลกใช้งาน VB6 อยู่กันอย่างล้นหลาม ... เอิ๊กๆๆๆๆ ... สำหรับผมแล้วเจ้า ActiveX ตัวนี้ ทำไมมันหลุดรอดสายตาของผมออกไปได้น่ะ เพราะหลายปีที่ผ่านมา ผมพยายามมองหาพวกตารางกริด เพื่อเข้ามาชดเชย Sharp Grid ที่มันค่อนข้างจะไร้อนาคต หากวันหนึ่งข้างหน้าเมื่อผมต้องการย้ายขึ้นสู่ DOT NET อย่างเต็มรูปแบบ และวันศุกร์ที่ 18 ธ.ค. 52 ที่ผ่านมา ผมก็มาเจอ FarPoint เนื่องมาจากทาง Grape City (เมืององุ่น) เขาส่งเมล์มาถึงผม ... หลังจากที่ได้ทำการทดสอบลูบๆคลำๆ เพียงในเวลาไม่ถึงชั่วโมง ทำเอาผมตื่นเต้นดีใจมาก ... อันดับแรกที่เจอ หน้าตามันสวยมาก แบบไม่ต้องใส่ Theme จาก CodeJock เลย ต่อมาก็คือทดสอบการอ่านข้อมูลทั้ง Bound และ UnBound Control ผลปรากฏว่ามันทำงานได้เร็วกว่า Sharp Grid มาก (ข้อมูลเกือบสีหมื่นรายการ) ... แม้ว่าในเวลานี้ ผมอาจจะยังไม่คล่องนักต่อการใช้งาน แต่เรามา ก้าวต่อไป (พร้อมกัน) ... Keep Walking

  • มารู้จักกับคำว่า Bound และ UnBound Control
      หลายคนคงอาจจะจะรู้จัก หรือ เคยได้เห็นกันบ้างล่ะ แต่เข้าใจกันบ้างหรือไม่ครับ ... ไม่ใช่บ่าววี (ทางใต้) หรือ ผู้บ่าวทองก้อน (อีสาน) น่ะครับ ... คนละเรื่อง 55555+ ... Bound อ่านว่า บาวด์
    • Bound Control คือ การผูก (Bound) ตารางข้อมูล (RecordSet) เข้ากับพวก Component หรือ Control ต่างๆ ... กรณีที่นำมาใช้แสดงผลลงในตารางกริด มันจะอ่านค่าฟิลด์ต่างๆ เพื่อแสดงผลในแต่ละหลัก เรียงตามลำดับจาก Query ที่เราเขียนไว้ และ ต้องแสดงทุกๆฟิลด์ออกมาทั้งหมด ... มีข้อดี คือ ทำงานได้เร็ว มักนำไปแสดงผลข้อมูลอย่างเดียว
    • UnBound Control ก็จะไม่มีการผูก (Unbound) ตารางข้อมูลใดๆเข้ากับ Component หรือ Control ... การนำไปใช้ในตารางกริด ไม่จำเป็นต้องแสดงผลออกมาทุกฟิลด์ และ จะเอาตัวไหนมาแสดงในหลักใดๆก่อนหลังก็ได้ ... มีข้อดี คือ ยืดหยุ่นมากกว่า และ มักใช้กับการเข้าไปแก้ไขข้อมูลตารางกริด ในแต่ละ Cell
      ดูโค้ดตัวอย่างข้างล่าง แล้วพี่น้องจะเห็นภาพอย่างชัดเจนครับ

    ดาวน์โหลดชุดติดตั้งจากเว็บไซต์ผู้ผลิต
    ดาวน์โหลดอัลบั้มชุดเต็มของ FarPoint Spread COM - 8.0.7 (ลาบเป็ดแชร์) (ต้องสมัครสมาชิกก่อนน่ะครับ)

    ดาวน์โหลด
    ดาวน์โหลด 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

    Projects --> Components


    การออกแบบ - Design Time


    คลิ๊ก Column Header เพื่อจัดเรียงข้อมูลได้ (fpSpread1.UserColAction = UserColActionSort)


    ทางลัดในการเขียนคำสั่ง SQL - Query
    โดยการเลือกแบบสอบถาม --> สร้างแบบสอบถามในมุมมองออกแบบ
    เลือกตารางที่ต้องการเข้ามา และ ลากแต่ละฟิลด์ที่มีความสัมพันธ์เข้าไปหากัน

    แน่นอน ... ต้องมีหลายคนสงสัยว่า ทำไมผมเขียนโค้ดแบบ Run Time (สั่งรันโปรแกรม ถึงจะมองเห็นผลลัพธ์ได้) แล้วทำไมผมจึงไม่ยอมใช้ ADODC (เราเรียกว่า Data Bound Control) ซึ่งมันน่าจะง่ายกว่าด้วยซ้ำ ... หากมันดีจริง ผมก็ใช้ไปนานแล้วแหละครับ ผมเองก็เสียเวลา หลงทางไปซ่ะตั้งนาน กว่าจะคิดวิธีการเขียนในรูปแบบที่พี่น้องได้เห็นกันอยู่ในปัจจุบันนี้ ... วันนี้พี่น้องก็ได้รับข้อมูล (ที่หายาก) ในอีกแนวคิดหนึ่ง ก็ต้องลองเปรียบเทียบดูกันเอาเองครับ ... เราเรียนก็เพื่อรู้ รู้ว่าจะต้องนำไปประยุกต์ใช้งานต่อกันยังไง ... ไม่ใช่เรียนเพื่อรู้ รู้ว่าเราก็เคยเรียนมา (นี่หว่า) ... 55555+

    มาดูโค้ดแบบ Bound Control กันดีกว่า
    
    Option Explicit
    
    Private Sub Form_Load()
        Me.Move (Screen.Width - Width) \ 2, (Screen.Height - Height) \ 2
        
        txtSearch.Text = ""
        
        ' ตั้งค่าเริ่มต้นให้กับ Spread
        Call SetupSpread()
        ' เริ่มต้นการแสดงผล
        Call RecordToSpread(False)
        
    End Sub
    
    ' ==========================================================
    ' โปรแกรมย่อยที่กำหนดค่าคุณสมบัติ (Properties) ต่างๆ ให้กับ Spread
    Sub SetupSpread()
    ' ==========================================================
        ' แสดงแถบแสงหรือไม่แสดง
        fpSpread1.OperationMode = OperationModeSingle  ' แถบ Selection
        'fpSpread.OperationMode = OperationModeRead     ' ไม่มีแถบ
        'fpSpread.OperationMode = OperationModeRow
        
        ' สามารถจัดเรียง หรือ Sort Order บนหัวคอลัมภ์ได้
        fpSpread1.UserColAction = UserColActionSort
    
        ' ปรับหน่วยวัด
        'fpSpread1.UnitType = UnitTypeNormal
        'fpSpread1.UnitType = UnitTypeTwips
        'fpSpread1.UnitType = UnitTypeVGABase ' ค่าตั้งต้น (Default) วัดหน่วย Pixel แบบใน .NET ใช้
    
        ' ส่วนตัวอื่นๆก็คงจะนำมาเพิ่มเติมให้ในภายหลังน่ะครับ
    
    End Sub
    
    ' =============================================================
    ' โปรแกรมย่อยที่ทั้งแสดงผลทั้งหมด หรือ ค้นหาข้อมูลด้วย เพื่อลดปริมาณโค้ดลง
    ' หาก blnSearch เป็น จริง (True) คือ การค้นหาข้อมูลก่อนที่จะแสดงผล
    ' หาก blnSearch เป็น เท็จ (False) คือ การแสดงผลข้อมูลทั้งหมด
    ' Optional คือ หากไม่มีการส่งค่า blnSearch มา ก็ให้กำหนดเป็น False โดยอัตโนมัติ เพื่อทำการแสดงผล
    Sub RecordToSpread(Optional blnSearch As Boolean = False)
    ' =============================================================
    
    ' เตรียมนำข้อมูลเข้าสู่ Spread Set RS = New ADODB.Recordset RS.CursorLocation = adUseClient ' หาก blnSearch เป็นจริง ... คือการค้นหาข้อมูล If blnSearch Then Statement = "SELECT tblAsset.AssetPK, tblAsset.AssetID, tblAssetName.AssetName, " & _ " tblAsset.SerialNumber, tblGroup.GroupName, tblAsset.UnitPrice " & _ " FROM ((tblAsset INNER JOIN tblAssetName ON tblAsset.AssetNameFK = " & _ " tblAssetName.AssetNamePK) INNER JOIN tblGroup ON tblAsset.GroupNameFK = " & _ " tblGroup.GroupNamePK) INNER JOIN tblStatus ON tblAsset.StatusFK = " & _ " tblStatus.StatusPK " & _ " WHERE " & _ " [AssetID] " & " Like '%" & Trim(txtSearch.Text) & "%'" & " OR " & _ " [SerialNumber] " & " Like '%" & Trim(txtSearch.Text) & "%'" & " OR " & _ " [GroupName] " & " Like '%" & Trim(txtSearch.Text) & "%'" & " OR " & _ " [AssetName] " & " Like '%" & Trim(txtSearch.Text) & "%'" & _ " ORDER BY AssetPK " ' เป็นการแสดงข้อมูลเท่านั้น Else Statement = "SELECT tblAsset.AssetPK, tblAsset.AssetID, tblAssetName.AssetName, " & _ " tblAsset.SerialNumber, tblGroup.GroupName, tblAsset.UnitPrice " & _ " FROM ((tblAsset INNER JOIN tblAssetName ON tblAsset.AssetNameFK = " & _ " tblAssetName.AssetNamePK) INNER JOIN tblGroup ON tblAsset.GroupNameFK = " & _ " tblGroup.GroupNamePK) INNER JOIN tblStatus ON tblAsset.StatusFK = " & _ " tblStatus.StatusPK " & _ " ORDER BY AssetPK " End If RS.Open Statement, ConnDB, adOpenForwardOnly, adLockReadOnly, adCmdText ' จำกัดจำนวนแถวสูงสุดตามข้อมูล fpSpread1.MaxRows = RS.RecordCount ' ================================== ' นี่แหละที่เรียกว่า Bound Control ... Set fpSpread1.DataSource = RS ' ================================== ' แสดงจำนวนข้อมูลให้ผู้ใช้งานทราบ lblCount.Caption = "จำนวน : " & RS.RecordCount & " รายการ." Set fpSpread1.DataSource = Nothing RS.Close: Set RS = Nothing ' กรณีของการ Bound Control ต้องมาปรับรูปแบบทีหลัง With fpSpread1 ' ปรับความกว้างของแต่ละหลักโดยอัตโนมัติ ... แล้วค่อยปรับทีละหลักอีกก็ได้ .DAutoSizeCols = DAutoSizeColsBest ' หลักแรก คือ หลักที่ 0 ... จะเป็นการแสดงหมายเลขแถว เพื่ออ้างอิงในลักษณะ Excel เช่น ' A10 ก็คือหลัก A แถวที่ 10 ... ในกรณีที่เรามองแบบ Excel .ColWidth(0) = 5 ' อย่าลืมเอา Primary Key ไปซ่อนไว้ไม่ให้ผู้ใช้งานเห็นด้วย ... ผู้ใช้งานจะได้ไม่สับสน '.ColWidth(1) = 0 .SetText 1, 0, "AssetPK" .SetText 2, 0, "รหัสครุภัณฑ์" .SetText 3, 0, "ชื่อครุภัณฑ์" .SetText 4, 0, "Serial Number" .SetText 5, 0, "กลุ่ม" .SetText 6, 0, "ราคาซื้อมา" .Col = 6 ' การจัดตำแหน่ง .TypeHAlign = TypeHAlignRight End With End Sub ' ============================================================ ' เหตุการณ์ในการดับเบิ้ลคลิ๊กในแต่ละแถวของ FarPoint Spread ' ActiveX ตัวนี้ มันชี้ไปที่หลัก ที่แถว ให้อัตโนมัติ ... จ๊าบจริงๆ Private Sub fpSpread1_DblClick(ByVal Col As Long, ByVal Row As Long) ' ============================================================ ' กำหนดการอ่านตำแหน่งของ Primary Key (หลักที่ 1) fpSpread1.Col = 1 fpSpread1.Row = Row ' ดัก Error ด้วย หากไม่มีข้อมูลใน Spread เลยสักแถว หรือ ไปดับเบิ้ลคลิ๊กที่ Column Header ' สังเกตครับ ... fpSpread1.Value กับ fpSpread1.Text ... มันต่างหรือเหมือนกันหรือเปล่าน่ะ คิกๆๆๆๆ If Not IsNumeric(fpSpread1.Value) Then MsgBox "ขออภัยไม่พบข้อมูลที่ต้องการ.", vbOKOnly + vbExclamation, "รายงานสถานะ" Else MsgBox "Primary Key : " & fpSpread1.Text, vbOKOnly + vbInformation, "รายงานสถานะ" End If ' ========================================================== ' แสดงผลข้อมูลออกมาเฉพาะ Cell ที่เลือก 'Dim fpvalue As Variant ' อ่านข้อมูลในตำแหน่งที่ Col และ Row ถูก Focus ไปหา 'fpSpread1.GetText fpSpread1.ActiveCol, fpSpread1.ActiveRow, fpvalue ' แสดงผล 'MsgBox fpvalue ' ========================================================== End Sub Private Sub cmdRefresh_Click() Call RecordToSpread(False) txtSearch.Text = "" End Sub Private Sub cmdSearch_Click() If Trim(txtSearch.Text) = "" Or Len(Trim(txtSearch.Text)) = 0 Then txtSearch.SetFocus Exit Sub End If ' ทำการค้นหาข้อมูล Call RecordToSpread(True) txtSearch.Text = "" End Sub
    มาดูโค้ดแบบ UnBound Control กันบ้าง
    
    ' =============================================================
    ' โปรแกรมย่อยที่ทั้งแสดงผลทั้งหมด หรือ ค้นหาข้อมูลด้วย เพื่อลดปริมาณโค้ดลง
    ' หาก blnSearch เป็น จริง (True) คือ การค้นหาข้อมูลก่อนที่จะแสดงผล
    ' หาก blnSearch เป็น เท็จ (False) คือ การแสดงผลข้อมูลทั้งหมด
    ' Optional คือ หากไม่มีการส่งค่า blnSearch มา ก็ให้กำหนดเป็น False โดยอัตโนมัติ เพื่อทำการแสดงผล
    Sub RecordToSpread(Optional blnSearch As Boolean = False)
    ' =============================================================
    
    ' กรณีของการ UnBound Control ต้องมาปรับรูปแบบก่อนครับ With fpSpread1 ' ปรับความกว้างของแต่ละหลักโดยอัตโนมัติ ... แล้วค่อยปรับทีละหลักอีกก็ได้ .DAutoSizeCols = DAutoSizeColsBest ' หลักแรก คือ หลักที่ 0 ... จะเป็นการแสดงหมายเลขแถว เพื่ออ้างอิงในลักษณะ Excel เช่น ' A10 ก็คือหลัก A แถวที่ 10 ... ในกรณีที่เรามองแบบ Excel .ColWidth(0) = 5 ' อย่าลืมเอา Primary Key ไปซ่อนไว้ไม่ให้ผู้ใช้งานเห็นด้วย ... ผู้ใช้งานจะได้ไม่สับสน '.ColWidth(1) = 0 .SetText 1, 0, "AssetPK" .SetText 2, 0, "รหัสครุภัณฑ์" .SetText 3, 0, "Serial Number" .SetText 4, 0, "ราคาซื้อมา" .ColWidth(1) = 15 .ColWidth(2) = 15 .ColWidth(3) = 15 .ColWidth(4) = 20 .Col = 4 ' การจัดตำแหน่ง .TypeHAlign = TypeHAlignRight End With ' เตรียมนำข้อมูลเข้าสู่ Spread Set RS = New ADODB.Recordset RS.CursorLocation = adUseClient ' หาก blnSearch เป็นจริง ... คือการค้นหาข้อมูล If blnSearch Then Statement = "SELECT tblAsset.AssetPK, tblAsset.AssetID, tblAssetName.AssetName, " & _ " tblAsset.SerialNumber, tblGroup.GroupName, tblAsset.UnitPrice " & _ " FROM ((tblAsset INNER JOIN tblAssetName ON tblAsset.AssetNameFK = " & _ " tblAssetName.AssetNamePK) INNER JOIN tblGroup ON tblAsset.GroupNameFK = " & _ " tblGroup.GroupNamePK) INNER JOIN tblStatus ON tblAsset.StatusFK = " & _ " tblStatus.StatusPK " & _ " WHERE " & _ " [AssetID] " & " Like '%" & Trim(txtSearch.Text) & "%'" & " OR " & _ " [SerialNumber] " & " Like '%" & Trim(txtSearch.Text) & "%'" & " OR " & _ " [GroupName] " & " Like '%" & Trim(txtSearch.Text) & "%'" & " OR " & _ " [AssetName] " & " Like '%" & Trim(txtSearch.Text) & "%'" & _ " ORDER BY AssetPK " ' เป็นการแสดงข้อมูลเท่านั้น Else Statement = "SELECT tblAsset.AssetPK, tblAsset.AssetID, tblAssetName.AssetName, " & _ " tblAsset.SerialNumber, tblGroup.GroupName, tblAsset.UnitPrice " & _ " FROM ((tblAsset INNER JOIN tblAssetName ON tblAsset.AssetNameFK = " & _ " tblAssetName.AssetNamePK) INNER JOIN tblGroup ON tblAsset.GroupNameFK = " & _ " tblGroup.GroupNamePK) INNER JOIN tblStatus ON tblAsset.StatusFK = " & _ " tblStatus.StatusPK " & _ " ORDER BY AssetPK " End If RS.Open Statement, ConnDB, adOpenForwardOnly, adLockReadOnly, adCmdText ' จำกัดจำนวนแถวสูงสุดตามข้อมูล fpSpread1.MaxRows = RS.RecordCount ' ======================================================================= ' นี่แหละที่เรียกว่า UnBound Control ... ' ไม่จำเป็นต้องจัดเรียงตาม Field และ เลือกมาแสดงผลบางตัวได้ (ฟิลด์ที่เหลือก็สามารถทำการค้นหาข้อมูลได้ด้วย) ' fpSpread1.DataSource = RS ===> Bound Control ' กำหนดให้หลักสุงสุดจำนวน 4 หลัก fpSpread1.MaxCols = 4 ' ให้เริ่มต้นแสดงผลข้อมูลตั้งแต่แถวที่ 1 เพราะแถว 0 เป็น Column Header fpSpread1.Row = 1 ' เราใช้การวนรอบ (Loop) เอาครับ Do Until RS.EOF ' แสดงผลในแต่ละหลัก With fpSpread1 .Col = 1 .Text = RS("AssetPK") .Col = 2 .Text = "" & RS("AssetID") .Col = 3 .Text = "" & RS("SerialNumber") .Col = 4 ' ปรับรูปแบบการแสดงผลข้อมูล .Text = Format(RS("UnitPrice"), "#,##0.00") End With RS.MoveNext ' เพิ่มแถวที่ใช้แสดงผลขึ้นอีก 1 fpSpread1.Row = fpSpread1.Row + 1 Loop ' ================================== ' แสดงจำนวนข้อมูลให้ผู้ใช้งานทราบ lblCount.Caption = "จำนวน : " & RS.RecordCount & " รายการ." RS.Close: Set RS = Nothing End Sub
    Conclusion:
    สำหรับปฐมบทของเรื่อง FarPoint Spread พี่น้องก็คงได้ประจักษ์ชัดแจ้งไปแล้ว ว่ามันง่ายขนาดไหน รวมไปถึงได้รู้ลึก รู้จริง ถึงแก่นแท้ ของคำว่า Bound และ UnBound Control ซึ่งทุกท่านก็คงจะสามารถเลือกนำไปใช้งานให้ได้ถูกต้องเหมาะสมกันต่อไป ... FarPoint Spread นั้นมันสามารถทำงานได้เหมือนกับ Excel เช่น สามารถนำสูตร (Formular) ในแบบ Excel มาใช้งานในตารางของมันได้ เช่น SUM(A1:A10) ผมเห็นแล้วก็อยากจะขยี้ขยำมันให้หนำใจไปมากกว่านี้ แต่ช่วงนี้ต้องหยุดการเรียนรู้เอาไว้ก่อน เนื่องจากติดภาระงานอื่น ซึ่งต้องเร่งปั่นออกไปให้หมดก่อนสิ้นปี มิเช่นนั้นจะทำให้ผมรับประทานเหล้าไม่อร่อย ... 55555+ ...

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