Data Report

หัวข้อพิเศษไอที, VB 6.0 No Comments »

Visual Basic 6 เป็นเวอร์ชันแรกที่เพิ่ม report writer ภายใน IDE เมื่อเปรียบเทียบกับ Crystal report แล้ว DataReport designer ใช้ได้ง่ายกว่า แต่ส่วนประกอบหลายอย่างและไม่สามารถทำงานหนักได้ดีเท่ากับ Crystal report
การใช้ DataReport designer ต้องทำการเพิ่มเข้าไปใน IDE ด้วยการไปที่เมนู Project แล้วเลือกคำสั่ง Component เมื่อไดอะล๊อกบ๊อกซ์ Component เปิดขึ้นมา ให้คลิกแท็บ Designer แล้วเลือก check box ของ DataReport แล้วคลิกที่ ok เพื่อปิดไดอะล๊อกบ๊อกซ์ หรือสร้าง data project ใหม่ และให้ Visual Basic สร้าง instance ของ DataReport designer
DataReport designer ทำงานในโหมด bound อย่างเดียว ทำให้สามารถดึงข้อมูล และส่งไปยังเครื่องพิมพ์หรือแสดงรายการใน Preview window โดยอัตโนมัติ DataReport designer สามารถส่งออกรายงานเป็นไฟล์ข้อความ หรือไฟล์ HTML และสนับสนุนรูปแบบกำหนดเอง DataReport designer มากับกลุ่มของตัว Control ที่ใช้ได้รูปถึง Lines, Shapes, Images และฟังก์ชันที่นำมาใช้การสร้างฟิลด์ผลรวมในรายงาน การส่งพิมพ์ไปเครื่องพิมพ์เป็นการส่งในโหมด Asynchronous ที่ทำให้ผู้ใช้สามารถพิมพ์งานขณะที่กำลังพิมพ์งาน

ไอคอน ชื่อ Class ชื่อ Class คำอธิบาย
RptLabel RptLabel สร้างป้าย ข้อความ เหมือน Label
RptTextBox RptTextBox ข้อความ หรือข้อมูลของฟิลด์ เหมือน Text box
RptPicture RptPicture แสดงภาพ เหมือน Image
RptLine RptLine เส้น
RptShape RptShape รูปทรง เช่น สี่เหลี่ยม วงกลม
RptFunction RptFunction ประยุกต์ฟังก์ชัน

การทำงานเมื่อออกแบบ

วิธีง่ายที่สุดในการสร้างรายงานด้วย DataReport คือ ทำงานร่วมกับ DataEnvironment designer ซึ่ง DataReport designer สนับสนุนการ drag-and-drop ของอ๊อบเจค command ใน DataEnvironment designer รวมถึงอ๊อบเจค Hierarchical command ข้อจำกัดคือรายงานสามารถมี Recordset ลูกได้เพียง 1 ระดับ ในแต่ละระดับ nesting ตัวอย่างที่จะกล่าวถึงเป็นการใช้อ๊อบเจค Hierarchical command ที่มาจาก table “Orders” และ “Order Details” ในฐานข้อมูล NWind.mdb

การรวมกับอ๊อบเจค Command

การสร้างรายงานที่มาจากอ๊อบเจค Hierarchical command มีวิธีการดังนี้
1. สร้าง Hierarchical command “Orders” มี Command ลูก คือ “Order Details” และตรวจสอบค่าได้ถึงสารสนเทศที่สนใจ เช่น โดยการรวมกับ Hierarchical Flexgrid บนฟอร์มและเรียกใช้คำสั่งประยุกต์
2. สร้าง instance ของ DataReport designer หรือใช้ provider ที่เป็น provider เริ่มต้น ใน Data project ของ Visual Basic Project
3. เรียกตารางคุณสมบัติ ของ DataReport แล้วกำหนดให้คุณสมบัติ DataSource ชี้ที่ DataEnvironment1 (หรือชื่อที่ตั้งไว้) และตั้งค่าคุณสมบัติ DataMember เป็น Orders
4. คลิกเมาส์ปุ่มขวาบนส่วนหัวรายงาน(Report header) ของ DataReport designer และเลือกคำสั่ง Retrieve Structure เพื่อสร้างส่วนกลุ่มหัวและส่วนกลุ่มล่าง ซึ่งมีชื่อ Orders_header และ Orders_footer สำหรับส่วนรายละเอียด มีชื่อ Order_Details_detail
ส่วนที่เป็นบล็อกของข้อมูล ที่จะทำสำหรับแต่ละเรคคอร์ดในอ๊อบเจค Command แม่ ส่วนเรคคอร์ดตรงกับอ๊อบเจค Command แม่ ส่วนที่สองเป็น Command ลูก และมาถึงส่วนรายละเอียดซึ่งตรงกับอ๊อบเจค Command ชั้นในที่สุด ส่วนทั้งหมดยกเว้นส่วนรายละเอียดจะแบ่งเป็นส่วนหัวและส่วนล่าง ซึ่งจะพิมพ์ก่อนและหลังสารสนเทศที่สัมพันธ์กับส่วนของอ๊อบเจคที่ระดับชั้นใน DataReport designer มีส่วนรายงาน (ซึ่งพิมพ์สารสนเทศที่ตอนต้นและท้ายของรายงาน) และส่วนหน้า (ซึ่งพิมพ์สารสนเทศที่ตอนต้นและตอนท้ายของแต่ละหน้า) ถ้าไม่เห็นสองส่วนนี้ให้เมาส์มุ่มขวา บน DataReport designer และเลือกคำสั่งที่ต้องการ
5. drag ฟิลด์ ที่ต้องการจากอ๊อบเจค Command “Orders” ใน DataEnvironment มายังส่วน Orders_header ของ DataReport เมื่อปล่อยปุ่มของเมาส์ ชุดของตัว control คือ RptLabel และ RptTextbox จะปรากฏใน DataReport ซึ่งภายใน RptLabel จะสร้างข้อความด้วยชื่อของฟิลด์ และ Rpttexbox จะถูกแทนที่โดยข้อความจาก ฟิลด์ฐานข้อมูล แล้วจัดตำแหน่งฟิลด์ให้เหมาะสม
6. คลิกบนอ๊อบเจค Command “Order Details” และ drag ไปที่ DataReport จากนั้น Visual Basic จะสร้างชุดตัว control คือ RptLabel และ RptTextbox สำหรับแต่ละฟิลด์ ใน Recordset สามารถลบฟิลด์ OrderID และจัดตำแหน่งตัว control ในแถว
7. จัดส่วนสูงเพื่อไม่ให้มีที่ว่างมากเกินไป ซึ่งมีความสำคัญมาก สำหรับส่วนรายละเอียดเพราะส่วนนี้จะแสดงเรคคอร์ดแต่ละเรดคอร์ดซ้ำ และสามารถลดส่วนทั้งหมดที่ไม่มีฟิลด์เป็นค่าว่าง
8. ถ้าสารสนเทศใน DataReport เพียงพอ ให้นำไดอะล๊อกบ๊อกซ์ของ Project properties pages เลือก Datareport1 เป็น Startup object และเรียกใช้โปรแกรม
Note: การวางตัว control ในส่วน สามารถวางให้ตรงกับอ๊อบเจค command และส่วนที่อยู่ระดับต่ำกว่า เช่น สามารถวางฟิลด์ OrderID จากอ๊อบเจค Command “Orders” ในส่วน Orders และ Order_Details แต่ไม่สามารถวางฟิลด์ UnitPrice จากส่วนชั้นใน Order_Details มายังส่วน Orders

การตั้งค่าคุณสมบัติ

การรวมตัว control ลงบน DataReport เหมือนกับตัว control มาตรฐานที่วางบนฟอร์ม แต่มีไลบรารีต่างกัน และไม่สามารถนำ intrinsic control มาวางบน DataReport หรือตัว control จากไลบรารี DataReport ไปตามวางบนฟอร์ม รวมถึงไม่สามารถใช้คำสั่งในเมนู Format ต้องใช้การคลิกเมาส์ปุ่มขวาบนตัว control และใช้คำสั่งจากเมนู popup
สำหรับคุณสมบัติเฉพาะ คือ คุณสมบัติ Control ถ้าตั้งค่าเป็น True ตัว control ยอมให้ขยายตามแนวตั้งเมื่อข้อมูล มากกว่าความกว้าง ค่าเริ่มต้นของคุณสมบัตินี้ คือ False ซึ่งจะตัดข้อความที่ยาวกว่าความกว้าง

การแสดงฟิลด์คำนวณ

วิธีการแสดงฟิลด์คำนวณมี 2 วิธีคือ
1. ใช้คำสั่ง SELECT คำนวณค่าของฟิลด์ต่าง ๆ ในเรคคอร์ดเดียวกัน เช่น
SELECT OrderID, ProductID, UnitPrice, Quantity, Discount,
((UnitPrice * Quantity) * (1 - Discount)) As Total FROM [Order Details]
แล้วเพิ่มฟิลด์ Total ในส่วนรายละเอียดเพื่อแสดงราคารวมของแต่เรคคอร์ด จาก Order Details แล้วจัดรูปแบบและตำแหน่งของฟิลด์ให้เหมาะสม
นอกจากนี้สามารถใช้คำสั่ง SQL ระดับสูง คือ การเชื่อม table ด้วย JOIN Clause เป็นประโยคคำสั่ง SELECT เพื่อดึงข้อมูลจาก table อื่น
SELECT [Order Details].OrderID, [Order Details].ProductID, [Order Details].UnitPrice,
[Order Details].Quantity, [Order Details].Discount, (([Order Details].UnitPrice *
[Order Details].Quantity) * (1 - [Order Details].Discount)) As Total,
Products.ProductName FROM [Order Details] INNER JOIN Products
ON [Order Details].ProductID = Products.ProduvtID
2. ใช้ RptFunction ในการหาผลรวมของเรคคอร์ด เช่น หาผลรวมฟิลด์ Total ของอ๊อบเจค Command “Order Details” ให้วาง RptFunction ลงในส่วน Order_Footer แล้วกำหนดค่าคุณสมบัติในตัว control ใหม่ ตั้งค่าคุณสมบัติ DataMember เป็น Order_Details คุณสมบัติ DataField เป็น Total คุณสมบัติ FunctioType เป็น 0-rptFuncSum และคุณสมบัติ DataFormat เป็น Currency ค่าที่หาได้เป็นผลรวมของแต่ละ OrderID
ถ้าต้องการหาผลรวมของรายงานทั้งหมด ให้วาง RptFunction ที่ส่วนรายงาน เช่น การหาผลรวมของค่าขนส่งทั้งหมด ให้วาง RptFunction ที่ส่วนรายงาน แล้วตั้งคุณสมบัติ DataMember เป็น Orders คุณสมบัติ DataField เป็น Freight คุณสมบัติ FunctioType เป็น 0-rptFuncSum และคุณสมบัติ DataFormat เป็น Currency เมื่อเรียกใช้โปรแกรม จะได้ผลรวมของทุก OrderID ที่หน้าสุดท้ายของรายงาน

การจัดการส่วนล่างของหน้าและตัวแบ่งหน้า

หน้าส่วนหัวและหน้าส่วนล่าง ใช้แสดงสารสนเทศเกี่ยวกับหมายเลขหน้า ,จำนวนหน้ารวม, วันที่และเวลาที่พิมพ์ เป็นต้น การกำหนดรายละเอียดเหล่านี้ที่ให้คลิกเมาส์ปุ่มขวาในส่วนที่สนใจ เลือกคำสั่ง Insert Control จากนั้นเลือกสารสนเทศที่ต้องการแสดง
ตัว control ที่ใช้คือ RptLabel แล้วกำหนดตัวอักษรตามตาราง 15.1 ในคุณสมบัติ Caption เช่น หน้า %p ของ %P
ในทุกส่วนของอ๊อบเจคมีคุณสมบัติ 2 อย่างที่มีผลต่อการแบ่งหน้า คือ คุณสมบัติ ForePageBreak เพื่อหากำหนดขึ้นหน้าใหม่
คุณสมบัติ KeepTogether เป็นค่า Boolean ถ้ากำหนดเป็น True การพิมพ์รายงาน DataReport จะเพิ่มตัวแบ่งหน้าหรือขึ้นหน้าใหม่โดยอัตโนมัติ ถ้าข้อมูลในหน้าต่อไปยาวกว่า 1 หน้ากระดาษ

คุณสมบัติอื่นของรายงาน

DataReport designer มีคุณสมบัติหลายอย่างที่สามารถปรับปรุงได้ในตารางคุณสมบัติ เหมือนกับ Designer อื่น เช่น Caption, Font, WindowState เป็นต้น
คุณสมบัติเฉพาะของ DataReport designer คือคุณสมบัติ LeftMargin, RightMargin, TopMargin และ ButtomMargin สำหรับการหาขนาดของระยะจากขอบกระดาษในการพิมพ์รายงาน ในขณะที่คุณสมบัติ ReportWidth หาความกว้างของหน้ารายงาน ส่วน GridX และ GridY เป็นระยะห่างของตารางตัว control ในเวลาออกแบบ

การทำงานเมื่อเรียกใช้

การเตรียมรายงาน อาจมีการเพิ่มตัว control บางตัวบน DataReport designer เพื่อใช้คุณสมบัติ เมธอด และ event ในการควบคุมผ่านคำสั่งเมื่อเรียกใช้ เพื่อทำให้สามารถสร้างรายงานที่ซับซ้อนได้

การพิมพ์รายงาน

การพิมพ์รายงานปกติทำได้ง่ายโดยการส่งพิมพ์ที่ปุ่มเครื่องพิมพ์บนแถบเครื่องมือใน Preview Window ของ DataReport ในการแสดง DataReport window ทำได้ด้วยเมธอด Show
DataReport1.WindowState = VbMaximzed
DataReport1.Show vbModal
ควบคุมการพิมพ์ด้วยคำสั่ง ต้องใช้เมธอด PrintReport ของ DataReport designer ตามไวยากรณ์นี้
Cookie = PrintReport [Show Dialog], [Range], [Page From], [Page To]
Show Dialog เป็นค่า Boolean สำหรับการแสดง Print dialog box
Range เป็นการกำหนดช่วงของการพิมพ์ ด้วยค่า 0-rptRangeAllPages (พิมพ์ทุกหน้า) หรือ 1-rptRangeFromTo (กำหนดช่วงพิมพ์)
Page Form และ Page To ระบุหลักแรกและหน้าสุดท้าย ของการพิมพ์
Dim Cookie As Long
Cookie = DataReport1. PrintReport (False, rptRangeFromTo,1,10)

การใช้ประโยชน์การประมวลผลแบบ Asynchronous

การสร้างรายงาน แบ่งเป็น 3 ขั้นตอนย่อย คือ การ query, การสร้างไฟล์ชั่วคราว และการพิมพ์ (รวมถึง Preview และการส่งออก) โดยการ query และการพิมพ์ไฟล์ชั่วคราว เป็น synchronous ส่วนการพิมพ์เป็น asynchronous เมื่อ DataReport designer กำลังทำงานแบบ asynchronous จะเกิด ProcessingTimeout เป็นระยะประมาณทุกวินาทีสามารถจับ event เพื่อให้ผู้ใช้ควบคุมการพิมพ์ได้ เช่น การยกเลิกการพิมพ์
Private Sub DataReport_ProcessingTimeout(ByVal Seconds As Long, Cancel As Boolean, ByVal JobType As MSDataReportLib.AsyncTypeConstants, ByVal Cookie As Long)
   ’ แสดงข้อความทุกๆ 20 วินาที
   Const TIMEOUT = 20
   ’ ค่าของวินาทีเมื่อแสดงข้อความ
   Static LastMessageSecs As Long
   ’ ตั้งค่า LastMessage ใหม่ ถ้า มีการสั่งพิมพ์ใหม่
   If Seconds การส่งออกรายงาน

ผู้ใช้สามารถส่งออกรายงานด้วยการคลิกปุ่ม Export บน Preview window ของ DataReport ในไดอะล๊อกบ๊อกซ์ Export ให้เลือกชื่อไฟล์ ประเภทไฟล์ (เป็น html, htmltext , Unicode และ Unicode text) และช่วงของหน้า ซึ่งหน้าของการ Export มักจะไม่ตรงกับหน้าของการ Preview และไม่สามารถส่งออกกราฟฟิก โดย RptImage และ RptShape
การส่งออกด้วยคำสั่ง ใช้เมธอด ExportReport ตามไวยากรณ์นี้
Cookie = ExportReport ([Format Or Indexkey], [File Name], [Overwrite], [Show Dialog],
[Range], [PageFrom], [PageTo])
Format หรือ Indexkey เป็นดัชนีตัวเลข หรือ string key ที่ระบุรูปแบบการส่งออก
Overwrite เป็นค่า Boolean ในการหาว่าถ้ามีไฟล์อยู่แล้วจะทำการเขียนทับ (ค่าเริ่มต้นเป็น True)
Show Dialog เป็นค่า Boolean เพื่อระบุการแสดงไดอะล๊อกบ๊อกซ์มาตรฐานของการส่งออก
อากิวเมนต์อื่นมีความหมายเหมือนเมธอด PrintReport
เมธอด ExpoitReport ส่งออกค่า Long กำหนดได้เฉพาะใน ProcessingTimeout, AsyncProgress หรือ Error Event
ตัวอย่างคำสั่งการส่งออกไฟล์ html
cookie = DataReport1.ExportReport rptKeyHtml, App.Path & “\Orders”, True

การเปลี่ยนผังรายงานเมื่อเรียกใช้

ในกรณีที่สร้างรายงาน หลายรายงานที่คล้ายกัน เช่น รายงานพนักงานที่แสดงสารสนเทศทั้งหมดและรายงานที่ซ่อนข้อมูลบางส่วน การสร้างรายงานประเภทคำได้สะดวกเนื่องจาก DataReport เป็นอ๊อบเจคแบบ programmable
การอ้างถึง อ๊อบเจค Section หรือส่วน ใช้ Sections collection และอ้างถึงตัว control ภายในส่วน
‘ ซ่อนส่วนล่าง (footer) ตามคำสั่ง
DataReport1.Sections (”Orders_Footer”).Visible = False
‘ เปลี่ยน caption ของ lblTitle
DataReport1.Sections (”Section1″).Controls (”lblTitle”) .Caption = “May 99″
การอ้างถึงส่วนสามารถใช้ดัชนีตัวเลข หรือชื่อ
ในเวลาเรียกใช้ การเพิ่มตัว control ในรายงานไม่สามารถทำได้ เนื่องจาก DataReport ไม่สนับสนุนเมธอด Add การทำงานลักษณะที่ให้เตรียมรายงานที่มีฟิลด์ทั้งหมด แล้วซ่อนฟิลด์ที่ไม่ต้องการในแต่ละเวอร์ชัน
‘ ตัวแปร member สำหรับคุณสมบัติ ShowDetails
Private m_ShowDetails As Boolean
Public Property Get ShowDetails() As Boolean
   ShowDetails = m_ShowDetails
End Property
Public Property Let ShowDetails(ByVal newValue As Boolean)
Dim newTop As Single
   m_ShowDetails = newValue
   ’ สร้างหัวรายงาน
   If m_ShowDetails Then
      Sections(”Section1″).Controls(”lblTitle”).Caption = “รายละเอียดใบสั่งซื้อ”
   Else
      Sections(”Section1″).Controls(”lblTitle”).Caption = “สรุปใบสั่งซื้อ”
   End If
   ’ คุณสมบัติมีผลต่อการมองเห็นของส่วนในที่สุด
   Sections(”Order_Details_Detail”).Visible = m_ShowDetails
   ’ มีผลกระทบต่อการมองเห็นในส่วน Orders ถ้าต้องการลดความสูงของส่วน
   ’ ที่ต้องสร้างทั้งหมดตัว control ที่ไม่จำเป็นมองไม่เห็น และย้ายขึ้น อื่นๆ กำหนดให้
   ’ ค่าเล็กกว่าของความสูงของส่วนที่ไม่ต้องการทำงาน
   newTop = IIf(m_ShowDetails, 2500, 0)
   With Sections(”Orders_Header”)
      .Controls(”lblProduct”).Visible = m_ShowDetails
      .Controls(”lblProduct”).Top = newTop
      .Controls(”lblUnitPrice”).Visible = m_ShowDetails
      .Controls(”lblUnitPrice”).Top = newTop
      .Controls(”lblQty”).Visible = m_ShowDetails
      .Controls(”lblQty”).Top = newTop
      .Controls(”lblDiscount”).Visible = m_ShowDetails
      .Controls(”lblDiscount”).Top = newTop
      .Controls(”lblTotal”).Visible = m_ShowDetails
      .Controls(”lblTotal”).Top = newTop
      .Controls(”shaDetailHeader”).Visible = m_ShowDetails
      .Controls(”shaDetailHeader”).Top = newTop
      ’ ตั้งค่าความสูงส่วนเป็น 0 เพื่อบีบให้มากที่สุดเท่าที่จะทำได้
      .Height = IIf(m_ShowDetails, 2200, 0)
   End With
End Property

การเพิ่มรูปแบบ dynamic และ ฟิลด์ lookup

เมื่อมีการรวม DataReport ด้วยกลไกการรวม ADO มาตรฐาน ทำให้ศักยภาพสูงขึ้น เช่น การจัดรูปแบบของฟิลด์ที่รวมข้อมูลแล้วสามารถควบคุมผ่าน Format event ของอ๊อบเจค StdDataFormat
Dim WithEvents DiscountFormat As StdDataFormat
Private Sub DataReport_Initialize()
   ’ สร้างรูปแบบ DataFormat อื่น สำหรับฟิลด์ Discount
   Set DiscountFormat = New StdDataFormat
   Set Sections(”Order_Details_Detail”).Controls(”txtDiscount”).DataFormat = DiscountFormat
End Sub
Private Sub DiscountFormat_Format(ByVal DataValue As StdFormat.StdDataValue)
   If CDbl(DataValue.Value) = 0 Then
      DataValue.Value = Null
   End If
End Sub

Hierachical FlexGrid

หัวข้อพิเศษไอที, VB 6.0 No Comments »

Hierarchical Flexgrid เป็นตัว control แบบตารางอีกตัว ที่อยู่ใน Visual Basic 6 มีแตกต่างจาก DataGrid คือ Hierarchical Flexgrid สามารถรวมคอนฟิกเซลล์ที่อยู่ต่างแถวกัน ถ้ามีค่าเดียวกัน ตัว control มีความสามารถนี้ เมื่อกำหนด Hierarchical ADO Recordset ให้กับคุณสมบัติ DataSource เพราะสามารถแสดงเป็นหลายแถบ โดยแต่ละแถบเป็นกลุ่มคอลัมน์ขอ้มูลที่มาจาก Recordset ลูกที่ต่างกันในโครงสร้างสำคัญขั้นของข้อมูล แต่เป็นตัว control แบบอ่านอย่างเดียว 

Note: Hierarchical Flexgrid มีคำสั่งมีสอดคล้องกับ Flexgrid ซึ่งไม่สนับสนุน ADO Data control และ data source แต่ Hierarchical Flexgrid นำมาใช้แทน Flexgrid 

Hierarchical Flexgrid รวมอยู่ ในไฟล์ MSHFLXGD.OCX ซึ่งต้องการกระจายไปกับโปรแกรมประยุกต์ ที่ใช้ตัว control นี้ 

การตั้งค่าคุณสมบัติเมื่อออกแบบ 

เพื่อสร้าง Hierarchical Flexgrid และรวมข้อมูลแล้ว จะสามารถคลิกเมาส์มุ่มขวาบนตัว control เละเลือก คำสั่ง Retrieve Structure ซึ่งเติมตารางด้วยส่วนหัวคอลัมน์อ้างถึงฟิลด์ที่ต่างในแหล่งข้อมูล แต่ไม่มีคำสั่ง Edit ทำให้ไม่สามารถใช้เมาส์ปรับปรุงและความกว้างคอลัมน์ เมื่อออกแบบ 

แท็บ General 

ในแท็บ General ให้กำหนดค่าของคุณสมบัติ Rows และ Cols เพื่อหาจำนวนคอลัมน์ และแถวบนตาราง เมื่อ DataSource ยังไม่ที่แหล่งข้อมูล ADO โดยทั่วไปมิติของตาราง ขึ้นกับจำนวนเรคคอร์ดและฟิลด์ในแหล่งข้อมูล คุณสมบัติ FixedRow และ FixedCol แสดง จำนวน แถวและคอลัมน์ที่ต้องไว้ ที่ด้านซ้ายและด้านขวาของตารางถ้าคุณสมบัติ AllowBigSection เป็น True การคลิกส่วนหัวของแถวหรือคอลัมน์จะเป็นการเลือกทั้งแถวหรือคอลัมน์
คุณสมบัติ Highlight มีผลต่อลักษณะภายนอกของเซลล์ที่เลือก ที่ค่าใช้ คือ 0-flexHighlightNever (ไม่มีไฮไลต์) 1-flexHighlightAlways (ไฮไลต์เซลล์ที่เลือกตลอดเวลา) และ 2-flexHighlightWithFocus (ไฮไลต์เซลล์เมื่อได้รับโฟกัส) คุณสมบัติ FocusRect แสดงลักษณะของรอบเซลล์ปัจจุบัน 

คุณสมบัติ BandDisplay สามารถเปลี่ยน การแสดงลักษณะ band คุณสมบัติ FillStyle มีผลต่อวิธีการเปลี่ยนต่อคุณสมบัติ Text มีรูปแบบ คือ 0-flexFillSingle (เฉพาะเซลล์ปัจจุบัน) 1-flexFillRepeat (เซลล์ที่เลือกทั้งหมด) คุณสมบัติ SelectionMode สำหรับวิธีการเลือกเฉพาะเซลล์ บังคับเลือกทั้งแถวหรือคอลัมน์ 

คุณสมบัติ AllowUserResize กำหนดวิธีการที่ให้ผู้ใช้ปรับขนาดแถว หรือคอลัมน์ด้วยเมาส์ ตามค่าดังนี้ 0-flexResizeNone (ไม่ให้ปรับขนาด) 1-flexResizeColumn (ปรับได้เฉพาะคอลัมน์) 2-flexResizeRows (ปรับได้เฉพาะแถว) หรือ 3-flexResizeBoth (ปรับได้ทั้ง 2 แถว) การจำกัดผลการปรับขนาดแถวสามารถใช้คุณสมบัติ RowSizingMode สามารถเป็น 0-flexRowSizeIndividual (เฉพาะแถวที่ปรับขนาด และเป็นค่าเริ่มต้น) และ 1-flexRowSizeAll (แถวทั้งหมดได้รับการปรับขนาด) 

แท็บ Bands 

แท็บ Bands เป็นแท็บที่สำคัญซึ่งเกี่ยวข้องกับการเลือกฟิลด์ใน Recordset แม่และลูกให้มองเห็นได้ในตาราง ตามปกติมักจะมีการซ่อนที่ฟิลด์ numeric key ที่ไม่สื่อความหมายกับผู้ใช้ และการซ้ำ foreign key
แท็บ Bands ยอมให้ตั้งค่าคุณลักษณะของ band ในฟิลด์ GridLines สามารถเลือกประเภทเส้นที่ลากระหว่าง band ปัจจุบันกับ band ต่อไป ค่าที่ตรงกับคุณสมบัติ GridLinesBand สามารถเป็นค่า 0-flexGridNone, 1-flexGridFlat (ค่าเริ่มต้น) 2-flexGridInset, 3-flexGridRaised, 4-flexGridDashes หรือ 5-flexGridDots
รูปแบบข้อความสามารถเลือกรูปแบบเป็น 3 มิติ ในการแสดงข้อความบน band ตามค่าในคุณสมบัติ TextStyleBand คุณสมบัติ BandIndent ใช้ตั้งค่าจำนวนคอลัมน์ของ band ที่มีการย่อหน้า คุณสมบัติBandExpandable ระบุว่า band สามารถขยาย หรือรวม จากเครื่องหมายบวก หรือลบที่จะแสดงในคอลัมน์แรก คุณสมบัติ ColumnHeader สำหรับการแสดงชื่อคอลัมน์เหนือ band 

แท็บอื่น ๆ 

แท็บ Style ยินยอมให้ตั้งคุณสมบัติที่มีผลกับลักษณะภายนอกของตาราง คุณสมบัติ Gridlines fixed ตรงกับรูปแบบของเส้นตาราง คุณสมบัติ TextStyleFixed แสดงข้อความ 3 มิติ แถวและคอลัมน์ที่ตรึง
คุณสมบัติ RowHeightMin เป็นค่าความสูงน้อยที่สุดของแถว ใน twips คุณสมบัติ GridLinesUnpopulated มีผลกับรูปแบบของเซลล์ที่ไม่เก็บค่า 

การกำหนดเมื่อเรียกใช้ 

Hierarchical Flexgrid มีคุณสมบัติประมาณ 160 คุณสมบัติ ส่วนใหญ่เกี่ยวกับลักษณะภายนอก แต่มีคุณสมบัติ เมธอด และ event ที่สำคัญและใช้ประโยชน์ได้มาก 

การทำงานกับเซลล์ปัจจุบัน 

คุณสมบัติเรียกใช้ที่สำคัญ ของ Hierarchical Flexgrid คือ Row, Col และ Text ซึ่งตั้งค่าและส่งออกพิกัด และข้อมูลของเซลล์ปัจจุบัน คำสั่งในโปรแกรมที่ทำงานกับตัว control ทีสามารถเปลี่ยนข้อมูลของเซลล์ แต่ค่าใหม่จะไม่เก็บลงในฐานข้อมูล เนื่องจากเป็นตัว control แบบอ่านอย่างเดียว 

ตัว control มีคุณสมบัติแบบอย่างเดียว สำหรับการส่งออกสารสนเทศของเซลล์ปัจจุบัน เช่น การหาประเภทของเซลล์ปัจจุบันโดยการค้นหาคุณสมบัติ CellType
Hierarchical Flexgrid ต่างจาก DataGrid โดยยินยอมให้ทำงานกับลักษณะภายนอกของเซลล์ผ่านคุณสมบัติ เช่น CellBackColor, CellForeColor, CellFontName เป็นต้น 

Private Sub MSHFlexGrid1_DblClick()
   If MSHFlexGrid1.CellBackColor = vbWindowBackGround Then
      ’ ไฮไลต์เซลล์ ด้วยตัวอักษรขาวบนพื้นหลังสีน้ำเงิน
      MSHFlexGrid1.CellBackColor = vbBlue
      MSHFlexGrid1.CellForeColor = vbWhite
   Else
      ’ ฟื้นสีตามค่าเริ่มต้น
      MSHFlexGrid1.CellBackColor = vbWindowBackGround
      MSHFlexGrid1.CellForeColor = vbWindowText
   End If
End Sub 

การเข้าถึงเซลล์อื่น 

ถ้าคุณสมบัติ FillStyle ตั้งค่าเป็น 1-flexFillRepeat ซึ่งมีผลต่อคุณสมบัติอื่นในช่วงการเลือกเซลล์ รวมถึงคุณสมบัติ CellPicture, CellPictureAlignment และคุณสมบัติ CellFontXXXX ทำให้มีวิธีการเปลี่ยนรูปแบบของกลุ่มเซลล์ โดยการกำหนดค่าคุณสมบัติที่เหมือนกันจากการกำหนดในเซลล์เดียว
การใช้ความสามารถที่มีผลต่อหลายเซลล์ ด้วยการกำหนดในเซลล์เดียว ต้องใช้คุณสมบัติ RowSel และ ColSel เพื่อทราบถึงพิกัดของช่วงการเลือกปัจจุบัน คุณสมบัตินี้ส่งออกแถวและคอลัมน์ที่มุมหนึ่งของพื้นที่สี่เหลี่ยมที่เลือก เซลล์ที่อยู่มุมตรงข้ามจะเป็นเซลล์ที่แอ็คทีฟ และได้รับการชี้โดยคุณสมบัติ Row และ Col 

Dim total As Double, r As Long, c As Long
Dim rowMin As Long, rowMax As Long
Dim colMin As Long, colMax As Long 

If MSHFlexGrid1.Row

DataGrid

หัวข้อพิเศษไอที, VB 6.0 No Comments »

DataGrid เป็นตัว control ที่แสดงข้อมูลจาก table ของฐานข้อมูลในรูปตาราง และทำงานกับ ADO Data control โดย DataGrid รวมอยู่ในไฟล์ MSDATGRD.ocx ซึ่งต้องกระจายไปกับโปรแกรมประยุกต์ที่ใช้ 

การตั้งค่าคุณสมบัติ เมื่อออกแบบ 

DataGrid สามารถทำงานได้เฉพาะ การรวมกับ data source ในเวลาออกแบบได้แก่ ADO data control ส่วน data source ในเวลาเรียกใช้ ได้แก่ ADO Recordset หรือ instance ของ class ที่กำหนด การทำงานกับ data source ในเวลาออกแบบ มีความสะดวกเพราะสามารถดึงโครงสร้างฟิลด์และจัดความกว้างคอลัมน์ รวมถึงคุณลักษณะ ที่มองเห็นได้ โดยไม่ต้องใช้คำสั่ง 

Note: การรวมตัว Control ที่ซับซ้อน เช่น DataGrid และ Hierarchical FlexGrid สามารถรวมได้เฉพาะ Recordset ที่มาจาก cursor ชนิด static หรือ keyset 

การแก้ไขผังคอลัมน์ 

หลังจากที่รวม DataGrid กับ ADO data control หรือ อ๊อบเจค Command ของ DataEnvironment ผ่านคุณสมบัติ DataSource ของ DataGrid แล้วให้คลิกเมาส์มุ่มขวาบนตัว control แล้วเลือกคำสั่ง Retrieve Field เพื่อเตรียมปรับผังคอลัมน์ด้วยดึง caption และ ความกว้างของแต่ละคอลัมน์โดยตรงจากฐานข้อมูล และสามารถคลิกเมาส์บนตัว control อีกครั้งแล้วเลือกคำสั่ง Edit ซึ่งจะนำตารางเข้าสู่โหมด Edit ในโหมด Edit ให้ทำการปรับความกว้าง เลื่อนตารางตามแนวนอนด้วยแถบเลื่อนด้านล่าง และคลิกเมาส์มุ่มขวาบนตัว control เพื่อแสดงเมนู ของคำสั่ง ในคำสั่งนี้จะยอมให้เพิ่มหรือยกเลิกคอลัมน์ แบ่งตารางเป็นส่วนย่อย ๆ ติดหรือวางเพื่อจัดลำดับใหม่ เป็นต้น การปรับปรุงคุณสมบัติอื่น ให้คลิกเมาส์มุ่มขวาบนตัว control อีกครั้ง แล้วเลือกคำสั่ง Properties เพื่อเปิดไดอะล๊อกบ๊อกซ์ ของ Property Pages 

ในการจัดผังคอลัมน์ของ Split มีความยุ่งยาก เช่น การลบคอลัมน์ใน Split จะมีผลต่อคอลัมน์ภายใน Split การแก้ปัญหาให้ตั้งคุณสมบัติ Visible ของคอลัมน์เป็น False เพราะคุณลักษณะนี้ สามารถตั้งค่าแบบ split-by-split 

แท็บ General และ Keyboard 

ตามค่าเริ่มต้น ตารางจะไม่มี caption แต่สามารถป้อนข้อความที่ต้องการในแท็บ General ที่คุณสมบัติ Caption ซึ่งจะปรากฏในส่วนสีเทาเหนือชื่อคอลัมน์ คุณสมบัติ AllowAddNew, AllowDelete, และ AllowUpdate เป็นคุณสมบัติ Boolean ใช้หาการทำงานตามที่กำหนดบนตาราง คุณสมบัติ ColmnHeader สามารถตั้งเป็น False เพื่อซ่อนแถวของชื่อคอลัมน์ หมายเหตุในแท็บ Font สามารถตั้งค่าคุณสมบัติ HeadFont เพื่อคำนวณลักษณะฟอนต์ของคอลัมน์ 

คุณสมบัติ DefColWidth เป็นค่าเริ่มต้นความกว้างของคอลัมน์ ถ้าตั้งค่าเป็น 0 (ค่าเริ่มต้น) ความกว้างของแต่ละคอลัมน์เป็นค่ากว้างที่สุดฟิลด์ และความกว้างชื่อคอลัมน์ คุณสมบัติ HeadLines เป็นค่าจำนวนเต็มระหว่าง 0 ถึง 10 ตรงตามจำนวนแถวที่ใช้ของชื่อคอลัมน์ แต่ควรตั้งคุณสมบัติ ColmnHeader เป็น False คุณสมบัติ RowHeight เป็นความสูงของแถว เป็น twips 

ถ้าตั้งค่าคุณสมบัติ BorderStyle เป็น 0-dbgNoBorder จะไม่มีเส้นขอบ คุณสมบัติ RowDividerLine เป็นรูปแบบของเส้นแบ่งแถว 

แท็บ Keyboard สำหรับการตั้งค่าคุณสมบัติที่มีผลต่อพฤติกรรมคีย์บอร์ดเพื่อ DataGrid ได้รับโฟกัส ถ้าตั้งค่าคุณสมบัติ AllowArrows เป็น True ผู้ใช้สามารถเลื่อนไปตามเซลล์ด้วยปุ่มลูกศร ถ้า WrapCallPointer เป็น True ถ้ากดมุ่มลูกศรขวาที่ท้ายของแถว โฟกัสจะเลือนไปที่เซลล์ของแถวต่อไป และกดปุ่มลูกศรซ้าย ที่ตอนต้นของแถวโฟกัสจะเลื่อนไปเซลล์สุดท้าย ของแถวก่อนหน้า 

คุณสมบัติ TabAction เป็นการกำหนดพฤติกรรม เมื่อกดปุ่ม Tab หรือ Shift + Tab และ DataGrid บนตัว control ปัจจุบัน ซึ่งมีค่าเริ่มต้นเป็น 0-dbgControlNavigation จะทำให้ตัว control ต่อไปได้รับโฟกัส ถ้าตั้งแต่เป็น 1-dbgColumnNavigation เมื่อกดปุ่ม Tab โฟกัส จะเลื่อนไปยังคอลัมน์ต่อไป แต่เซลล์ปัจจุบันอยู่ที่เซลล์สุดท้ายของแถว โฟกัสจะเลื่อนไปยังตัว control ต่อไป สำหรับการตั้งค่า 2-dbgGridNavigation โฟกัสจะอยู่ภายในตัว control 

ตามที่ค่าเริ่มต้นปุ่ม Tab และ ปุ่มลูกศรจะไม่โฟกัสที่ Split แต่ค่าตั้งแต่คุณสมบัติ TabAcrossSplit เป็น True โฟกัสจะเข้าไปใน Split โดยใช้ ปุ่ม Tab 

แท็บ Column และ Format 

แท็บ Column ยินยอมให้ตั้งค่าคุณสมบัติ Caption ของแต่ละอ๊อบเจค Column เช่นเดียวกับคุณสมบัติ DataField ที่เก็บชื่อฟิลด์ในแหล่งข้อมูลของคอลัมน์ 

แท็บ Format ยินยอมให้ตั้งค่าคุณสมบัติ DataFormat ของแต่ละอ๊อบเจค Column 

แท็บ Splits 

ถ้าตารางมีการแบ่งส่วนเป็น 2 ส่วนขึ้นไป การตั้งค่าคุณลักษณะ ของพื้นที่ในแท็บ Split การปรับปรุงคุณลักษณะของ Split ให้เลือก Split จาก รายการ drop-down ด้านบน ถ้าตารางไม่มีการแบ่งการกำหนดคุณสมบัติ จะมีผลต่อตัว control คุณสมบัติ Locked ถ้าตั้งเป็น True จะทำการเปลี่ยนเป็นแบบอ่านอย่างเดียว คุณสมบัติ AllowFocus เป็นการให้ Split สามารถรับโฟกัส คุณสมบัติ AllowSizing เป็นกำหนดให้มีการปรับขนาดด้วยเมาส์ได้เมื่อเรียกใช้ คุณสมบัติ AllowRowResizing ถ้าเป็น True ผู้ใช้สามารถปรับความสูงแถวด้วยเมาส์ คุณสมบัติ RecordSelectors เป็นการแสดงคอลัมน์สีเถาสำหรับเลือกเรคคอร์ดด้านซ้ายสุดของ Split คุณสมบัติ MarqueeStyle สำหรับหาการไฮไลต์เซลล์ปัจจุบันที่เลือก 

คุณสมบัติ AllowRowResizing, RecordSelectors และ MarqueeStyle ถ้ากำหนดใน DataGrid จะมีผลต่อ Split 

แท็บ Layout 

แท็บ Layout ใช้ตั้งคุณลักษณะของคอลัมน์แบบ split-by-split โดย DataGrid ยินยอมให้แสดงคอลัมน์เดียวกันสามารถแสดงคุณลักษณะต่างกันในคนละ Split การตั้งค่าให้เป็นแบบอ่านอย่างให้กำหนดที่คุณสมบัติ Locked และการมองเห็น กำหนดที่คุณสมบัติ Visible คุณสมบัติ AllowSizing เป็นค่า Boolean สำหรับการหาค่าคอลัมน์สามารถปรับได้ คุณสมบัติ Button ค่าตั้งเป็น True จะมีปุ่ม drop-down ปรากฏขึ้นเพื่อ เซลล์ได้รับโฟกัสเมื่อมีการคลิกปุ่มนี้ จะเกิด ButtonClick event 

การทำงานเมื่อเรียกใช้ 

DataGrid มีความซับซ้อน ต้องใช้ในเวลาในการศึกษา 

การทำงานกับเซลล์ปัจจุบัน 

เมื่อมีการเรียกใช้ DataGrid จะใช้คุณสมบัติ Row และ Col ในการส่งออกหรือตั้งตำแหน่งของเซลล์ที่ได้รับโฟกัส แถวแรกและคอลัมน์ซ้ายจะส่งคืนค่าเป็น 0 เมื่อมีการให้เซลล์เป็นเซลล์ปัจจุบันจะสามารถดึงค่าหรือปรับปรุงด้วยคุณสมบัติ Text 

Private Sub cmdUpperCase_Click ()
   DataGrid1.Text = UCase$(DataGrid1.Text)
End sub 

คุณสมบัติ EditActive ส่งค่า True ถ้าเซลล์ปัจจุบันได้รับการแก้ไข และสามารถกำหนดค่าให้คุณสมบัตินี้เพื่อป้อนค่าหรืออกจากการแก้ไข เมื่ออยู่ในโหมด Edit จะเกิด ColEdit event 

Private Sub DataGrid1_ColEdit (ByVal Colindex As Integer)
   ’ Savetext เป็นตัวแปรระดับโมดูล
   Savetext = DataGrid1.Text
End sub 

การหาเซลล์ปัจจุบันที่ได้รับการแก้ไข สามารถค้นหาจากคุณสมบัติ CurrentCellModified และ สามารถตั้งค่าคุณสมบัติ เป็น False และตั้งค่าคุณสมบัติ EditActive เป็น False เพื่อยกเลิกการแก้ไข คุณสมบัติ CurrentCellVisible มีใน DataGrid และอ๊อบเจค Split จะส่งออกค่า True ถ้าเซลล์ที่สามารถมองเห็นในอ๊อบเจค เมื่อมีการแก้ไขเซลล์ จะสามารถอ่านและปรับปรุงตารางด้วยคุณสมบัติ SelStart, SelLength และ SelText
เนื่องจาก DataGrid ใช้รวมกับแหล่งข้อมูล ADO ถ้าให้สามารถใช้คุณสมบัติ Bookmark เพื่อตั้งค่าหรือส่งออก bookmark ไปที่เรคคอร์ด 

การเข้าถึงเซลล์ 

การเข้าถึงเซลล์ใด ๆ ในตารางสามารถใช้ bookmark โดยอ๊อบเจค Column มี เมธอด CellText และ CellValue ที่ส่งออกข้อมูลของไม่ยัง bookmark และการดึง bookmark ที่สัมพันธ์กับแถว ใช้เมธอด GetBookmark ซึ่งจะได้ค่าแถวที่สัมพันธ์กับแถวปัจจุบัน หรือเมธอด RowBookmark ที่ส่งออก bookmark ของแถวที่มองเห็น และ bookmark ของแถวแรกเป็นค่าที่ส่งออกโดยคุณสมบัติ FirstRow และมีคุณสมบัติ LeftCol รักษาดัชนีของคอลัมน์แรกที่มองเห็น 

DataGrid1.LeftCol = 0
Adodc1.Recordset.MoveFirst
DataGrid1.Current.CellVisible = True 

คุณสมบัติ VisibleRows และ VisibleCol เป็นคุณสมบัติอ่านอย่างเดียวที่ส่งออกจำนวนแถวและคอลัมน์ สามารถใช้คุณสมบัติ ApproxCount ส่งออกจำนวนแถวโดยประมาณ และจำนวนคอลัมน์หาได้จากคุณสมบัติ Count ใน Column collection 

การจัดการเซลล์ที่เลือก 

การเลือกคอลัมน์ของคอลัมน์ที่อยู่ติดต่อกัน ทำได้โดยการคลิกส่วนหัวคอลัมน์พร้อมกับกดปุ่ม Shift ค้างไว้ โดยคุณสมบัติ SelStartCol และ SelEndCol จะส่งออกดัชนีของคอลัมน์แรกและคอลัมน์สุด ส่วนการเลือกแถวสามารถเลือกแบบไม่อยู่ติดต่อกันได้
การยกเลิกการเลือกคอลัมน์ด้วยการตั้งค่าคุณสมบัติ เป็น -1 หรือการกระตุ้นเมธอด ClearSelCols คุณสมบัติและเมธอดเหล่านี้สามารถเกิดขึ้นโดยอ๊อบเจค Split
เนื่องจากผู้ใช้สามารถเลือกแถวแบบไม่เรียงลำดับ ระบบจะค้นหาแถวที่ได้รับการเลือกบน SelBookmarks collection ของ DataGrid ซึ่งเก็บ bookmark ของแถวที่เลือก ตัวอย่างการเลือกแถวปัจจุบัน
DataGrid1.SelBookmarks.Add DataGrid1.Bookmark 

การเลือกแถวสามารถใช้ For…Each…Next ตามตัวอย่างคำสั่งที่ใช้ประโยชน์ SelChange event ซึ่งเกิดขึ้น เมื่อมีการเลือกคอลัมน์หรือแถว 

Private Sub DataGrid1_SelChange(Cancel As Integer)
Dim total As Single, bmark As Variant
   For Each bmark In DataGrid1.SelBookmarks
      total = total - DataGrid1.Columns(”Total”).CellValue(bmark)
   Next
End Sub 

การติดตามการแก้ไข 

DataGrid มี event จำนวนมากที่ให้ใช้ในการทำงานอย่างของผู้ใช้ event ส่วนมากอยู่รูปของ BeforeXXXX และ AfterXXXX โดย BeforeXXXX จะรับพารามิเตอร์ Cancel ซึ่งสามารถตั้งค่าเป็น True เพื่อยกเลิกการทำงาน 

Private Sub DataGrid1_BeforeColUpdate(ByVal ColIndex As Integer, OldValue As Variant, Cancel As Integer)
   ’ จัดการค่าที่ไม่ถูกต้อง
End Sub 

เมื่อมีการปรับข้อมูล DataGrid จะได้รับ Change event 

Dim newCellText As String 

Private Sub DataGrid1_Change()
   NewCellText = DataGrid1.Text
End Sub 

การแทรกและลบ 

ผู้ใช้สามารถลบแถว 1 แถว หรือมากกว่า โดยเลือกแถวที่ต้องการแล้วกดปุ่ม Delete ซึ่งจะเกิด BeforeDelete event และ AfterDelete event จากนั้นจะเกิดคู่ของ BeforeUpdate event และ AfterUpdate event 

‘ dgdProduct As DataGrid
Private Sub dgdProduct_BeforeDelete(Cancel As Integer)
   ’ ปฏิเสธการลบ สินค้าถ้ามี เรคคอร์ดใน OrderDetail ชี้มาที่สินค้านั้น
   Dim rs As ADODB.Recordset, rsorderdetail As ADODB.Recordset, sql As String
   ’ ดึงเรคคอร์ดทั้งหมดใน OrderDetails ที่อ้างอิงสินค้านี้
   Set rs = adoProduct.Recordset
   sql = “Select * FROM [Order Details] WHERE [Order Details].ProductID = ” & rs(”ProductID”)
   Set rsorderdetail = rs.ActiveConnection.Execute(sql)
   ’ ถ้า recordset เก้นเรคคอร์ดใดๆ ปกิเสธการลบ
   If Not rsorderdetail.EOF Then Cancel = True
End Sub 

ถ้าคุณสมบัติ AllowAddNew เป็น True การมีแถวเปล่าเกิดขึ้นใน DataGrid และมีลักษณะดอกจันจากนั้นผู้ใช้สามารถป้อนข้อมูลเข้าสู่แถวใหม่ ตัว control จะเกิด BeforeInsert event แล้วตามด้วย AfterInsert event แล้วเกิด OnAddNew event 

การเรียงข้อมูล 

DataGrid ไม่มีฟังก์ชันการเรียงข้อมูล แต่สามารถใช้ HeadClick event และคุณสมบัติ Sort ของ Recordset 

Private Sub dgdProduct_HeadClick(ByVal ColIndex As Integer)
   ’ เรียงคอลัมน์ที่คลิก
   Dim rs As ADODB.Recordset
   Set rs = adoProduct.Recordset 

   If rs.Sort dgdProduct.Columns(ColIndex).DataField & ” ASC” Then
      ’ เรียงตามลำดับจากน้อยไปมาก - บล๊อกนี้ได้รับการประมวลผล
      ’ ถ้า grid ไม่มีการเรียงหรือเรียงด้วยฟิลด์อื่น หรือเรียงจากมากไปน้อย
      rs.Sort = dgdProduct.Columns(ColIndex).DataField & ” ASC”
   Else
   ’ เรียงจากมากไปน้อย
      rs.Sort = dgdProduct.Columns(ColIndex).DataField & ” DESC”
   End If
   ’ ไม่ต้อง refresh ข้อมูลของ Data grid
End Sub 

DataCombo และ Data List

หัวข้อพิเศษไอที, VB 6.0 No Comments »

Visual Basic 6 ได้เพิ่ม DataCombo และ DataList ซึ่งเป็น bound control (เป็นตัว control ที่ต้องรวมกับข้อมูล) ตัว control กลุ่มนี้แตกต่างจาก List box และ Combo box เพราะสามารถรวมกับ ADO Data control ที่ต่างกัน 2 ตัว control โดย Data control แรกหาค่าที่เลือกในตัว control (เช่นเดียวกับ List box และ Combo box) และ Data control ที่สองเป็นการเพิ่มข้อมูลเข้ามาเป็นรายการ
DataCombo และ DataList มี lookup ที่ใช้ในการแปลงคำสั่งให้เป็นฟอร์ม เช่น การเลือกข้อมูลจาก table “Products” ในฐานข้อมูล Nwind.mdb โดยให้ฟิลด์ CategoryID มีค่าตรงกับฟิลด์ CategoryID ของ table “Categories” เพื่อแสดงสารสนเทศของสินค้า ด้วยการใช้คำสั่ง INNER JOIN ในการดึงข้อมูลทั้งหมด  

SELECT ProductName,CategoryName FROM Products INNER JOIN Categories
ON Products.CategoryID = Categories.CategoryID 

คำสั่งข้างต้นสามารถใช้ได้กับการประมวลผลข้อมูลด้วยคำสั่ง แต่ไม่สามารถใช้ได้กับตัว control แบบ bound เช่น เมื่อมีการให้ผู้ใช้สามารถปรับปรุงค่าในฟิลด์ CategoryID ของสินค้าจะต้องมีการอินเตอร์เฟซให้มีการ โหลดข้อมูลจาก Table “Categories” ไปสู่ List box หรือ Combo box เพื่อทำให้ผู้ใช้ไม่สามารถป้อนชื่อ Category ที่ผิด ซึ่งจำเป็นต้องมีการเปิด Recordset อันดับสอง 

Dim rsCat As New ADODB.Recordset
rsCat.Open “SELECT ProductName,CategoryName FROM Categories”, cn
lstCategories.Clear
Do until rsCat.EOF
lstCategories.AddItem rsCat(”CategoryName”)
lstCategories.ItemData (lstCategories.NewIndex) = rsCat(”CategoryID”)
Loop
rsCat.Close 

การแสดงค่าลักษณะดังกล่าวทำได้สะดวกใน DataCombo และ DataList ด้วยการตั้งค่า คุณสมบัติจำนวนหนึ่งในเวลาออกแบบ
DataCombo และ DataList อยู่ในไฟล์ MSDATLST.ocx ซึ่งต้องกระจายไปกับโปรแกรมประยุกต์ที่ใช้ตัว control นี้ 

Note: DataCombo และ DataList มีการทำงานคล้ายกับ DbCombo และ DbList (แนะนำใน Visual Basic 5) แต่ต่างกันที่ DataCombo และ DataList ทำงานกับ ADO Data control ส่วน DbCombo และ DbList ทำงานกับ Data control และ Remote Data control 

การตั้งคุณสมบัติเมื่อออกแบบ 

การประยุกต์เครื่องมือ lookup table กับ DataCombo และ DataList จำเป็นต้องวาง ADO Data control 2 ตัวลงบนฟอร์ม ตัวหนึ่งสำหรับชี้ไปที่ table หลัก (ตามตัวอย่างคือ Products ) และอีกตัวชี้ไปที่ lookup table (ตามตัวอย่างคือ Categories ) แล้วตั้งค่าคุณสมบัติ ดังนี้ 

- DataSource อ้างถึง ADO Data control หลัก ที่ชี้ไปยัง table หลัก 

- DataField เป็นชื่อของฟิลด์ใน Table ที่อ้างถึงโดยคุณสมบัติ DataSource และเป็นข้อมูลที่รวมกับตัว control ฟิลด์ที่จะได้รับการปรับปรุงเพื่อค่าใหม่ ได้รับการเลือกในรายการ 

- RowSource เป็นการอ้างถึง ADO Data control ตัวที่สอง ที่ชี้ไปยัง lookup table แสดงรายการของตัว control ที่จะได้รับการเติมข้อมูลจาก lookup table 

- BoundColumn เป็นชื่อของฟิลด์ใน lookup table เพื่อผู้ใช้เลือกค่าในรายการฟิลด์ DataField ใน table หลักจะได้รับค่าจากคอลัมน์นี้ ถ้าไม่กำหนดค่าให้คุณสมบัตินี้ จะใช้ชื่อฟิลด์เดียวกับคุณสมบัติ ListField 

1. ให้สร้างADO Data control (adodc1) ตั้งค่าชี้ไปที่ table “Products” ของฐานข้อมูล NWind.mdb ในแท็บ RecordSource ของ Property Pages
แล้วเพิ่ม Text box จำนวนหนึ่งเพื่อแสดงข้อมูลของฟิลด์ จาก table โดย Text box ทุกตัวให้กำหนด DataSouce เป็น Adodc1 ส่วน DataField ขึ้นกับการแสดงข้อมูลของฟิลด์ เช่น ชื่อสินค้า ให้กำหนดด้วยฟิลด์ “ProductName” ราคาต่อหน่วยกำหนดด้วยฟิลด์ “UnitPrice” 

 

2. ADO Data control อีก 1 ตัว (Adodc2) และตั้งค่าให้ดึงข้อมูลจาก table “Categories” แล้วเพิ่ม DataList ตั้งชื่อว่า “dblCategory” และตั้งคุณสมบัติตามนี้ DataSource = adodc1, DataField = CategoryID, RowSource = adodc2, BoundColumn = CategoryID, ListField = CategoryName 

3. ใน table “Products” มี Foreign key คือ SupplierID ซึ่ง Suppliers สามารถสร้างกลไกการ lookup คือ 1 ชุดโดยการเพิ่ม ADO Data control (Adodc3) ตั้งค่าชี้ไปที่ table “Suppliers” และ DataCombo ตั้งชื่อว่า “dblSupplier” และกำหนดคุณสมบัติดังต่อไปที่ DataSource = adodc1, DataField = SupplierID, RowSource = adodc3, BoundColumn = SupplierID, ListField = CompanyName 

Note: DataCombo และ DataList มีคุณสมบัติอีก 2 อย่าง คือ DataMember และ RowNumber ซึ่งจะมีการกำหนดเมื่อใช้ อ๊อบเจค Command ของ DataEnvironment designer ในฐานะ data source หลักหรืออันดับที่สอง 

การทำงานเมื่อเรียกใช้ 

การทำงาน DataCombo และ DataList ในเวลาเรียกใช้คล้ายกับ Combo box และ List box แต่มีความแตกต่างเล็กน้อย เช่น ไม่มีคุณสมบัติ ListIndex และ ListCount หรือ เมรอด AddItem สำหรับการเพิ่มข้อมูลในรายการ เมื่อเรียกใช้ การเพิ่มรายการทำได้ด้วยการใช้ ADO Data control หรือ แหล่งข้อมูลอื่น ๆ เช่น Recordset หรือ instance ของ DataEnvironment
DataCombo และ DataList มีคุณสมบัติพิเศษ ได้แก่ คุณสมบัติ MatchWithList ซึ่งเป็นคุณสมบัติอ่านอย่างเดียว ส่งออกค่า True ถ้าค่าที่ป้อนใน DataCombo ตรงกับข้อมูลในรายการ คุณสมบัตินี้เป็น True เสมอ ถ้าคุณสมบัติ Style ของ DataCombo และ DataList เป็น 2-dbcDropDownList คุณสมบัติ BoundText ส่งออกหรือตั้งค่าของชื่อฟิลด์ตามคุณสมบัติ BoundColumn ซึ่งเป็นค่าที่จะกำหนดให้กับคอลัมน์ DataField ใน table หลัก 

‘ ในส่วนการประกาศของโมดูลฟอร์ม
Dim rsCategory As New ADODB.Recordset
Dim rsSupplier As New ADODB.Recordset 

‘ ใน sub procedure
rsCategory.Open “Categories”, adoProducts.Recordset.ActiveConnection, _
adOpenDynamic, adLockOptimistic
Set dblCategory.RowSource = rsCategory
rsSupplier.Open “Suppliers”, adoProducts.Recordset.ActiveConnection, _
adOpenDynamic, adLockOptimistic
Set dbcSupplier.RowSource = rsSupplier 

การแสดงสารสนเทศ lookup เบื้องต้น 

คุณสมบัติ SelectedItem ส่งออก bookmark ไปที่ lookup table ที่ตรงกับข้อมูลที่ไฮไลต์ในรายการ ตามปกติการใช้คุณสมบัติเพื่อแสดงสารสนเทศเพิ่มเติมเกี่ยวกับข้อมูลที่เรียก 

Private Sub dbcSupplier_Click(Area As Integer)
‘ ย้ายไปที่เรคคอร์ดที่ถูกต้องใน lookup table.
‘ หมายเหตุ: ฟิลด์ ContactName
‘ ต้องรวมอยู่ในรายการของฟิลด์ที่ส่งออกโดย adoProducts
   ShowSupplierInfo
End Sub 

Click และ Dblcick event ของ DataCombo รับพารามิเตอร์ Area เพื่อระบุตำแหน่งของตัว control ที่ได้รับการเลือก ค่าของพารามิเตอร์ได้แก่ 0-dbcAreaButton, 1-dbcAreaEdit และ 2-dbcAreaList 

กรณีที่ไม่เกิดขึ้น Click event ของ DataCombo เมื่อมีการแสดงเรคคอร์ดในฟอร์ม การแก้ไขต้องใช้การจับ MouseComplete event ของ ADO Data control อันดับแรก 

Private Sub adoProducts_MoveComplete(ByVal adReason As ADODB.EventReasonEnum, ByVal pError As ADODB.Error, adStatus As ADODB.EventStatusEnum, ByVal pRecordset As ADODB.Recordset)
‘ บังคับให้ปรับปรุง DataCombo
On Error Resume Next
   dbcSupplier.BoundText = adoProducts.Recordset(”SupplierID”)
   ShowSupplierInfo
End Sub 

การบันทึก Connection 

ADO Data control มีการใช้ทรัพยากร Connection น้อยกว่า Data control ซึ่งการติดต่อของ Data control ในกรณีที่เป็นหลาย Data control ไม่สามารถพื้นที่เดียวกับของทรานแซคชัน และแต่ละ Connection ต้องใช้ทรัพยากรของเครื่องแม่ข่าย ในขณะที่ ADO Data control ลดการใช้ทรัพยากรลง เช่น DataCombo และ DataList ไม่จำเป็นต้องมองเห็น Data control เพราะผู้ใช้ไม่เคยเลื่อนดู lookup table ดังนั้น สามารถให้ผลลัพธ์เดียวกันด้วยการใช้อ๊อบเจค ADO Recordset ตั้งค่าคุณสมบัติของ DataCombo และ DataList ให้รวม ADO Data control สำหรับ lookup table แต่ทำให้คุณสมบัติ RowSource ว่างโดยการกำหนดคุณสมบัตินี้ในเวลาเรียกใช้หลังจากการสร้าง
อ๊อบเจค Recordset ใช้ Connection ร่วมกับ ADO Data control หลัก 

‘ ในส่วนการประกาศของโมดูลฟอร์ม
Dim rsCategory As New ADODB.Recordset
Dim rsSupplier As New ADODB.Recordset 

Private Sub Form_Load()
   adoProducts.ConnectionString = “Provider=Microsoft.Jet.OLEDB.3.51; Persist Security Info=False;Data Source=” & DB_PATH
   adoProducts.Refresh 

   rsCategory.Open “Categories”, adoProducts.Recordset.ActiveConnection, adOpenDynamic, adLockOptimistic
   Set dblCategory.RowSource = rsCategory
   rsSupplier.Open “Suppliers”, adoProducts.Recordset.ActiveConnection, adOpenDynamic, adLockOptimistic
   Set dbcSupplier.RowSource = rsSupplier
   ShowSupplierInfo 

   ’ เริ่มต้นทรานแซคชัน
   adoProducts.Recordset.ActiveConnection.BeginTrans
   IsDirty = False
End Sub 

Data Environment

หัวข้อพิเศษไอที, VB 6.0 No Comments »

DataEnvironment designer เป็นส่วนการทำงานใหม่ใน Visual Basic 6 ที่น่าสนใจมาก โดยระหว่างเวลาออกแบบจะนำเสนออ๊อบเจค ADO ซึ่งมีอีกวิธีที่จะสร้างในขณะเรียกใช้ ความสามารถที่น่าสนใจ คือ สามารถนำแบบการเขียนโปรแกรมไปยังการพัฒนาฐานข้อมูล ทำให้การเขียนโปรแกรมง่ายและสะดวก 

การประยุกต์ DataEnvironment designer สามารถใช้กำหนดพฤติกรรมของ ADO Connection, Command และอ๊อบเจค Recordset การตั้งค่าคุณสมบัติและเมธอดในเวลาออกแบบให้กดปุ่ม F4 เพื่อเปิดตารางคุณสมบัติหรือใช้ property page ของอ๊อบเจค เช่นเดียวกับการทำงานกับฟอร์มและตัว control 

ข้อได้เปรียบอีกประการของอ๊อบเจค DataEnvironment ในเวลาออกแบบ แทนที่การสร้างอ๊อบเจค ADO คือ instance ของ Data Environment เป็น entity ที่เพียงพอในตัวเองที่สามารถเก็บอ๊อบเจคอื่นและคำสั่งที่ใช้จัดการ สามารถเพิ่มคุณสมบัติและเมธอด แบบ public ใน Data Environment designer ทำให้สามารถปรับปรุงการนำมาใช้ใหม่ เหมือนกับ class module เฉพาะที่ใช้ทำงานกับฐานข้อมูล 

การเพิ่ม Data Environment designer ให้กับ project ปัจจุบัน มีวิธีการดังนี้ 

วิธีที่ 1 - ที่เมนู Project เลือกคำสั่ง Add Data Environment (Project เ Add Data Environment)
ถ้าไม่พบคำสั่งนี้ให้เพิ่ม Reference ของ Microsoft Data Environment Instance 1.0 Library ที่เมนู Project เลือกคำสั่ง Reference 

วิธีที่ 2 - ที่ Window ของ Data View คลิกปุ่ม Add Data Environment designer 

วิธีที่ 3 - เมื่อสร้าง Project ใหม่ให้เลือก Data Project จากรายการของ New Project 

อ๊อบเจค Connection 

อ๊อบเจคหลักใน Data Environment designer คือ อ๊อบเจค Connection ซึ่งคล้ายกับอ๊อบเจคฟอร์มใน Form designer ในความหมายที่เป็นอ๊อบเจคระดับบน แต่ต่างกันที่ instance ของ Data Environment designer สามารถเก็บอ๊อบเจคแบบหลาย Connection 

การสร้าง Connection สามารถทำได้ดังนี้ 

วิธีที่ 1 - เมื่อมีการสร้าง DataEnvironment จะมีค่าเริ่มต้นของอ๊อบเจค Connection ให้กำหนดคุณสมบัตินี้ของอ๊อบเจค 

วิธีที่ 2 - กดปุ่ม F 4 เพื่อเปิดตารางคุณสมบัติมาตรฐาน 

วิธีที่ 3 - คลิกเมาส์ปุ่มขวาบนอ๊อบเจค แล้วเลือกคำสั่ง Properties เพื่อเปิด Property Page 

การกำหนด Connection มีวิธีการเดียวกับการตั้งค่าคุณสมบัติ Data Link ใน Window ของ Data View และการสร้างคุณสมบัติ ConnectionString ของ ADO data control
ตารางคุณสมบัติมาตรฐานมีคุณสมบัติจำนวนหนึ่งที่ไม่ปรากฏใน Property page ได้แก่คุณสมบัติ Designer UserName และ DesignPassword ที่ให้ผู้ใช้ตั้งค่าชื่อผู้ใช้และรหัสผ่าน เมื่อต้องการสร้างอ๊อบเจค Data Environment ในส่วน RunUserName และ RunPassword เป็นชื่อผู้ใช้และรหัสผ่านเมื่อประมวลผล คุณสมบัติ DesignPrompBehavior และ RunPrompBehavior สามารถกำหนดได้เป็น 1-adPromptAlways (แสดงไดอะล๊อกบ๊อกซ์ login เสมอสำหรับการแก้ไขข้อมูลการ login), 2-adPromptComplete (แสดงไดอะล๊อกบ๊อกซ์ login เมื่อพารามิเตอร์บางตัวหายไป), 3-adPrompt CompleteRequired (คล้ายกับ 2-ad Prompt Complete แต่ยินยอมให้ผู้ใช้ป้อนพารามิเตอร์ที่ต้องการ), 4-adPrompt Never (ไม่แสดงไดอะล๊อกบ๊อกซ์ login และส่งออกค่าผิดพลาดไปที่โปรแกรมประยุกต์ ถ้าพารามิเตอร์หายไป) ตามปกติ จะตั้งค่าคุณสมบัติ DesignPromptBehavior เป็น adPromptComplete และ RunPromptBehavior เป็น adPrompt Never สำหรับคุณสมบัติ DesignSaveAuthentication และ RunSaveAuthentication เป็นการหาสารสนเทศ login ที่บันทึกใน VBP และไฟล์ EXE 

อ๊อบเจค Command 

อ๊อบเจค Command ใน Data Environment designer เป็นการเสนอการทำงานของฐานข้อมูลอ๊อบเจค Command เป็นลูกของอ๊อบเจค Connection เสมอเช่นเดียวกับตัว control เป็นลูกของฟอร์ม 

การสร้างอ๊อบเจค Command 

การสร้างอ๊อบเจค Command ทำได้ โดยการ drag อ๊อบเจคได้แก่ table, view หรือ stored procedure จาก Window ของ Data View ไปที่ Window ของ Data Environment จากนั้น Visual Basic จะสร้างอ๊อบเจค Command ตรงตาม table, view หรือ stored procedure และสร้าง Connection ที่เป็นแม่ ถ้าจำเป็นอ๊อบเจค Command สามารถเป็นลูกเฉพาะ Connection ที่อ้างถึงฐานข้อมูลของตัวเอง ยังสมมารถสร้างอ๊อบเจค Command จับคู่กับ stored procedure ในฐานข้อมูลโดยการคลิกปุ่ม Insert Stored Procedure บนแถบเครื่องมือ Data Environment 

การอ๊อบเจค Command ภายใน DataEnvironment designer 

1. เลือกอ๊อบเจค Connection แล้วคลิกที่ปุ่ม Insert Command บนแถบเครื่องมือของ DataEnvironment designer 

2. จะมีไอคอนอ๊อบเจค Command ภายในอ๊อบเจค Connection ให้คลิกเมาส์ปุ่มขวา แล้วเลือก Properties จากเมนู popup 

3. จะปรากฏไดอะล๊อกบ๊อกซ์ Property page ของอ๊อบเจค Command ที่เลือก เพื่อกำหนดข้อมูลของ อ๊อบเจค Command ได้แก่ ชื่อ Connection และแหล่งข้อมูล จาก ฐานข้อมูล หรือการใช้คำสั่ง SQL เมื่อกำหนดเสร็จแล้ว ให้คลิก Apply หรือ OK จะปรากฏอ๊อบเจค Command ตามรายละเอียดบน DataEnvironment designer 

อ๊อบเจค Command มี 2 ชนิด คือ ชนิดหนึ่งส่งคืนเป็น Recordset อีกชนิดไม่ส่งคืนเป็น Recordset โดยชนิดแรก คือ คิวรี่ของ SQL, stored procedure, table หรือ view ที่ส่งค่าเป็น Recordset ชนิดที่สองคือคำสั่งของ SQL หรือ stored procedure ในการแทรก ลบ หรือปรับค่าในฐานข้อมูลแต่ไม่มีการส่งคืนค่าเป็นกลุ่มของเรคคอร์ด
คุณสมบัติทั้งหมดของอ๊อบเจค Command สามารถตั้งค่าได้ภายใน property page และไม่จำเป็นต้องเปิดตารางคุณสมบัติมาตรฐาน ที่แท็บ General ให้เลือกอ๊อบเจคฐานข้อมูล เช่น table, view stored procedure หรือ synonym ที่ตรงกับ Command หรือใช้คำสั่ง SQL
ถ้ามีคำสั่ง normal, nonparameterized และ nonhierarchical สามารถข้ามไปที่แท็บ Advanced สำหรับการเลือกประเภท cursor และที่ตั้ง, ประเภทการล๊อก, ขนาดของ cache, ค่า timeout ของคำสั่ง และจำนวนเรคคอร์ดมากที่สุด ที่คิวรี่สามารถส่งออกได้ ซึ่งค่านี้เป็นการป้องกันมาถึงจำนวนเรคคอร์ดมากเกิน ที่อาจจะนำมาสู่ปัญหาการติดต่อของเครือข่าย มีคุณลักษณะเดียวของหน้านี้ ที่ไม่สัมพันธ์กับคุณสมบัติ ADO คือ check box ของ Recordset Returning 

คำสั่ง Parameterized 

การใช้พารามิเตอร์ จะเพิ่มความยืดหยุ่นอย่างมากให้กับอ๊อบเจค Command การสร้างคำสั่ง Parameterized สามารถแบ่งออกเป็น 2 ประเภท คือ พารามิเตอร์แบบ SQL Query และ stored procedure
คำสั่งพารามิเตอร์แบบ SQL Query เป็นการใช้เครื่องหมายคำถามเป็นตำแหน่งของพารามิเตอร์ ในคำสั่ง SQL Query เช่น 

SELECT * FROM Products; 

หลังจากที่ป้อนคิวรี่ในแท็บ General ของไดอะล๊อกบ๊อกซ์ Properties เปลี่ยนไปที่แท็บ Parameter และตรวจ Data Environment ได้จัดการเพิ่มพารามิเตอร์ให้กับคิวรี่แล้ว ในแท็บนี้สามารถกำหนดชื่อให้แต่ละพารามิเตอร์, กำหนดประเภทข้อมูลและขนาดและอื่น ๆ พารามิเตอร์ทั้งหมดในคิวรี่ประเภทนี้เป็นพารามิเตอร์นำเข้า
คำสั่งพารามิเตอร์แบบ stored procedure สร้างโดยการคลิกปุ่ม insert stored procedure และเลือก stored procedure ที่ต้องการใช้งาน ตามปกติ Data Environment สามารถดึงไวยากรณ์ stored procedure และจัดกลุ่ม Collection ให้กับคำสั่งพารามิเตอร์ได้ แต่ต้องระวังเกี่ยวกับคุณลักษณะ Direction ซึ่งบางครั้งอาจผิดพลาดได้เนื่องจาก Data Environment อาจจะไม่ทราบพารามิเตอร์ส่งออก แต่แก้ไขได้ที่คุณลักษณะ Direction 

การรวมข้อมูลด้วย DataEnvironment Designer 

DataEnvironment designer สามารถทำงานในฐานะแหล่งข้อมูล ADO ที่ปรากฏใน Combo box ของคุณสมบัติ DataSource ในตารางคุณสมบัติขณะที่ออกแบบ เมื่อมีการรวมตัว control กับ DataEnvironment designer และต้องตั้งค่าคุณสมบัติ DataMember ของตัว control ชนิด Data-aware ด้วยชื่อของอ๊อบเจค Command ที่เจาะจง มีเฉพาะอ๊อบเจค Command แบบส่งออก Recordset สามารถทำงานในฐานะแหล่งข้อมูล 

ฟิลด์ และตาราง 

การสร้างตัว control บนฟอร์มและรวมเข้ากับอ๊อบเจค DataEnvironment ทำได้โดยการ drag-and-drop 

1. สร้าง Project ใหม่ จะปรากฏฟอร์มเปล่า 

2. ที่เมนู View เลือกคำสั่ง Data View เมื่อปรากฏ Window ของ Data View ให้คลิกที่ปุ่ม Add Data Environment 

3. เมื่อ Window ของ Data Environment เปิดขึ้นมาให้สร้างอ๊อบเจค Command ของ table ชื่อ Customers โดยการเลือก table นี้ใน Window ของ Data View แล้ว drag ไปวางไว้ใน Window ของ Data Environment ซึ่ง Visual Basic จะสร้างอ๊อบเจค Command ให้ชื่อ Customers แบบใช้ Data Source ให้พร้อมสร้างอ๊อบเจค Connection ให้ใหม่ 

4. เลือกอ๊อบเจค Command ใน Window ของ Data Environment มาวางบนฟอร์ม เมื่อวางลงจะปรากฏ Text Box ของแต่ละฟิลด์ในอ๊อบเจค Command บนฟอร์ม 

5. ให้สร้างตัวเลื่อนเรคคอร์ด โดยวาด command button 2 ตัว control ให้ตั้งชื่อว่า cmdNext สำหรับการเลื่อนไปเรคคอร์ดต่อไป และ cmdPreview สำหรับเลื่อนย้อนไปหาเรคคอร์ดก่อนหน้าและกำหนดคำสั่ง 

Private Sub cmdNext_Click()
   DataEnvironment1.rsProducts.MoveNext
End Sub 

Private Sub cmdPrevious_Click()
   DataEnvironment1.rsProduct.MovePrevious
End Sub 

การเลือกประเภทฟิลด์ 

เมื่อวางอ๊อบเจค Command บนฟอร์มแล้ว Data Environment designer จะสร้าง Text Box เป็นค่าเริ่มต้นตามประเภทข้อมูลของฟิลด์ การเปลี่ยนค่าเริ่มต้น ทำได้ดังนี้ 

- คลิกปุ่ม Options บนแถบเครื่องมือ Data Environment จะปรากฏไดอะล๊อกบ๊อกซ์ Options ที่สามารถเลือกซึ่งตัว control จะสร้างขึ้นเมื่อวางฟิลด์ตามประเภทที่กำหนดให้ ประเภทฟิลด์ของ ADO ได้รับการจัดกลุ่มเป็น category แต่สามารถเลือกให้แสดงประเภทข้อมูลทั้งหมดที่ show All Data Type สำหรับแต่ละประเภทฟิลด์ สามารถเลือกให้ตรงกับตัว control แบบ instrinsic และตัว control แบบ ActiveX Drag and Drop Field Caption สามารถเลือกเพื่อใช้สร้าง Label ให้แต่ละฟิลด์ โดย Data Environment designer 

- สามารถเลือกจากประเภทฟิลด์พิเศษ 2 ประเภท Caption เป็นการระบุให้ตัว control เป็น Label ของตัว control อื่น Multiple เป็นตัว control ที่ใช้เมื่อ drag อ๊อบเจค Command ด้วยการใช้เมาส์ปุ่มซ้าย และสามารถระบุเป็นตัว control แบบตาราง 

- สามารถเลือกตัว control สำหรับแต่ละฟิลด์ของอ๊อบเจค Command ที่เจาะจง ด้วยการคลิกเมาส์ปุ่มขวา ใน Data Environment designer คลิกคำสั่ง Properties Menu แล้วเลือกประเภท control และ Caption ที่ใช้เมื่อวางฟิลด์บนฟอร์ม 

Hierarchical Command 

DataEnvironment designer มีการอินเตอร์เฟซ ระหว่างการออกแบบที่มีประโยชน์ของ ADO คือการสร้างโครงสร้างลำดับชั้น (hierarchy) ของ Recordset โดยโครงสร้างนี้มีกลุ่มของเรคคอร์ด ซึ่งอาจจะมี Recordset ที่เป็นลูก เช่น การสร้างรายชื่อลูกค้า จากฐานข้อมูล Nwind.mdb และลูกค้ามีการสั่งสินค้าหลายใบสั่งซื้อ สารสนเทศ เหล่านี้สามารถดึงมาด้วยคำสั่ง SQL แต่การแสดงด้วยโครงสร้างลำดับชั้นของ Recordset (hierarchical Recordset) 

ความสัมพันธ์ของ Hierarchy 

การสร้าง Hierarchical Recordset ภายใน Data Environment designer เป็นคู่ของวิธีการที่แตกต่างกัน สิ่งแรกต้องการแสดงคุณสมบัติความสัมพันธ์ของอ๊อบเจค Command ที่ตรงตาม table หลักในความสัมพันธ์ วิธีการทำ 

1. เปิด Connection ของฐานข้อมูล Nwind.mdb ใน Window ของ Data View เลือก table ชื่อ Categories แล้ว drag ไปที่ Window ของ Data Environment แล้วตั้งชื่อว่า CategoryList 

2. สร้าง Command ลูกโดยเลือก table ชื่อ Product แล้ว drag ไปที่ Window ของ Data Environment ภายในโครงสร้างของ CategoryList เมื่อวางลง Command ลูกจะอยู่ต่อจากรายการฟิลด์ของ List_Customers แล้วตั้งชื่อว่า ProductList 

3. จากนั้นกำหนดความสัมพันธ์ของCommand ลูก ด้วยการเปิด Property page ของอ๊อบเจค List_Customers แล้วเปลี่ยนไปที่แท็บ Relation ให้คลิกเลือก Relation To a Parent Command Object เพื่อปรับค่าตัว control แล้วเลือก Parent Command ในกรณีนี้เลือก CategoryList 

4. ในกรอบ Relation Definition เลือกฟิลด์ที่อ๊อบเจค Command ทั้งสองสัมพันธ์กัน ซึ่งฟิลด์ที่ primary key อยู่ใน Command แม่และฟิลด์ดีเป็น Foreign key อยู่ใน Command ลูกในตัวอย่างนี้คือฟิลด์ CategoryID คลิกปุ่ม Add 

5. จะปรากฏชื่อฟิลด์ทั้งสองในรายการฟิลด์ แล้วคลิก OK 

การปรับปรุงตัวอย่างโดยการสร้าง Command ชื่อ OrderByProduct และให้เป็นลูกของอ๊อบเจค ProductList 

1. คลิกเมาส์ปุ่มขวาบน Command ชื่อ ProductList แล้วเลือก Add Child Command Object 

2. เมื่ออ๊อบเจค Command 1 ได้รับการสร้างให้สร้างเปลี่ยนชื่อเป็น OrderByProduct 

3. เปิด Property page ของ OrderByProduct แล้วเลือกเรคคอร์ดจาก table ชื่อ Order Detail 

4. เปลี่ยนไปที่แท็บ Relation คลิกที่ check box ของ Relate to a Parent Command Object แล้วกำหนดความสัมพันธ์ของ Command ทั้งสองคือ ProductList และ OrderByProduct มีความสัมพันธ์ด้วยฟิลด์ ProductID 

5. ไปที่แท็บ Grouping ให้เลือกฟิลด์ที่ใช้จัดกลุ่ม ให้เลือกฟิลด์ ProductID ต้องคลิกเลือก Group Command Object ที่ check box 

6. ไปที่แท็บ Aggregate เลือกฟิลด์ที่ใช้หาผลรวม ให้เลือก Sum ฟิลด์ Quantity และ Count ฟิลด์ OrderID 

7. คลิกปุ่ม Add เพื่อระบุฟิลด์ในรายการฟิลด์ แล้วคลิก OK 

ทดสอบอ๊อบเจคที่สร้างขึ้น ให้เพิ่ม Microsoft Hierarchical Flex Grid control โดยการเพิ่ม component นี้ 

1. ไปที่เมนู Project คลิกที่ Component เมื่อไดอะล๊อกบ๊อกซ์ของ Component แสดงขึ้น ให้เลือก Microsoft Hierarchical Flex Grid control แล้วคลิก OK 

2. สร้างฟอร์มใหม่ 

3. เลือก CategoryList แล้ว drag ด้วยการคลิกเมาส์ปุ่มขวา แล้วลงบนฟอร์ม 

4. จะปรากฏฟอร์มแบบ Master/Detail โดย CategoryList จะเป็นฟอร์ม Master และ ProductList เป็นฟอร์ม Detail ของ HierarchicalFlexGrid แสดงผลรวมด้วย OrderByProduct_Grouping และรายละเอียดของแต่ละกลุ่มด้วย OrderByProduct ภายใน HierarchicalFlexGrid ของ ProductList 

5. ทำการซ่อนบางคอลัมน์ด้วยคลิกเมาส์ปุ่มขวาบนตาราง เลือกคำสั่ง Retrieve Command คลิกเมาส์ปุ่มขวาเพื่อแสดงไดอะล๊อกบ๊อกซ์ Properties แล้วเปลี่ยนไปที่แท็บ Bands 

6. ในแท็บ Bands ใช้กำหนดฟิลด์ที่ให้เห็นได้บนฟอร์มของ Recordset สามารถเปิดดูความสัมพันธ์ในแต่ละ Band เช่น Band0 (ProductList) Band1 (OrderByProduct_Grouping) Band2 (OrderByProduct) โดยให้คลิกที่ check box หน้าฟิลด์ 

7. เรียกใช้โปรแกรมประยุกต์ จะปรากฏตารางข้อความตามความสัมพันธ์ โดยผู้ใช้สามารถขยายหรือลดแถวโดยการคลิกเครื่องหมายบวก และลบใกล้ขอบด้านซ้ายของตาราง 

Grouping Hierarchy 

Data Environment designer สนับสนุน hierarchy 2 ประเภท คือ Grouping hierarchy และ Aggregate hierarchy แนวคิดของ Grouping hierarchy เป็นแนวคิดที่ง่าย เริ่มต้นด้วยอ๊อบเจค Command และสร้าง Command แม่ที่จัดกลุ่มเรคคอร์ดของ Command เดิมด้วยฟิลด์ 1 ฟิลด์ หรือมากกว่า ตัวอย่างเช่น การสร้างกลุ่มของ ProductID ด้วย วาง table ชื่อ Order Detail บน Window ของ Data Environment แล้วเปิด Property page ของ Grouping ให้เลือก Group Command Object เพื่อทำให้ตัว control เข้าถึงได้ ในหน้านี้ คลิกเลือกฟิลด์ ProductID จากรายการด้านซ้าย มายังด้านขวา แล้วปิดไดอะล๊อกบ๊อกซ์ ใน Data Environment designer จะมีอ๊อบเจค Command เพิ่มขึ้นใต้ Connection หลักชื่อ OrderByProduct_Grouping และไดเรคทอรี 1 ไดเรคทอรี ข้างใต้ ไดเรคทอรี หนึ่งเก็บฟิลด์ ProductID อีกไดเรคทอรีเก็บฟิลด์ของ Command เดิมไว้ 

 

Aggregate hierarchy 

ฟิลด์ aggregate เป็นฟิลด์คำนวณที่คำนวณด้วย expression พื้นฐาน (sum, count, overage เป็นต้น) ให้กับฟิลด์ที่กำหนดทุกแถวของ Recordset การเพิ่มฟิลด์ aggregate ทำเมื่อมีการใช้ grouping hierarchy จากตัวอย่างใน Grouping hierarchy ให้นับจำนวนใบสั่งซื้อ ด้วยการ Count ฟิลด์ OrderID ภายใต้กลุ่มของแต่ละ ProductID และ เพิ่มฟิลด์ SumQty เพื่อหาผลรวมของฟิลด์ Quantity ภายใต้กลุ่มของแต่ละ ProductID 

ฟิลด์ aggregate กำหนดในแท็บ Aggregate ของไดอะล๊อกบ๊อกซ์ คลิกปุ่ม Add เพื่อฟิลด์ aggregate ใหม่ ตั้งชื่อและเลือกฟังก์ชันที่มีให้ คือ COUNT, SUM, AVERAGE, MINIMUM, MAXIMUM, STANDARD DEVIATION หรือ ANY โดย Combo Box ของ Aggregate On จะหาฟิลด์ aggregate และประเมินให้เป็นอย่างใดอย่างหนึ่งจาก Grouping, Grand Total หรือชื่อของ Command ลูก ถ้าเลือก Grand Total จะสามารถป้อนชื่อของฟิลด์ได้ 

Data View

หัวข้อพิเศษไอที, VB 6.0 No Comments »

Visual Basic 6 มีเครื่องมือ Visual Database ในชุด Professional ซึ่งเป็นชุดของเครื่องมือสำหรับการทำงานกับฐานข้อมูลใน IDE ในขณะที่ Visual Basic 5 มีให้ในชุด Enterprise สำหรับ Database Designer window และ Query Designer Window มีให้เฉพาะ Visual Basic 6 ชุด Enterprise 

Data View Window 

การเข้าไปใช้เครื่องมือ Visual Database ต้องเข้าผ่าน window ของ Data View ซึ่งการเปิด window ใช้คำสั่งในเมนู View หรือคลิกบนปุ่มสีเหลืองบนแถบเครื่องมือมาตรฐาน Window ที่เป็นรวมสำหรับการติดต่อฐานข้อมูล และสามารถแสดง table, view, ไดอะแกรม และ stored procedure ในฐานข้อมูล (ในฐานข้อมูล Oracle สามารถมองเห็นไดเรคทอรีอีก 2 ไดเรคทอรี คือ Function และ Synonyms) ผู้ใช้สามารถขยายโหนดของ table หรือ view เพื่อดูฟิลด์ภายใน table หรือ view ของ Data View สามารถนำไปประยุกต์ได้ คือ
การเปิด Data View Windows ให้ไปที่เมนู View เลือก Data View Window จะปรากฏ window ของ Data View บนหน้าจอ การประยุกต์บน window ของ Data View สามารถสรุปได้ คือ 

 

- สร้างการเชื่อมข้อมูล (Data Link) และเพิ่มเข้าไปยัง Window ของ Data View โดยการคลิกปุ่มขวาสุด บนแถบเครื่องมือของ Data View จากนั้นจะปรากฏไดอะล๊อกบ๊อกซ์ของ Data Link Properties สำหรับกำหนดการเชื่อมต่อกับฐานข้อมูล ผู้ใช้สามารถลบการเชื่อมข้อมูลที่มีอยู่ หรืออ๊อบเจคที่ปรากฏ อยู่ใน Window โดยการคลิกที่การเชื่อมข้อมูลหรืออ๊อบเจค แล้วกดปุ่ม Del บนแป้นพิมพ์ หรือคลิกเมาส์ด้านขวาแล้วเลือกคำสั่ง Remove บนเมนู popup การสร้าง connection ของการเชื่อมข้อมูลเป็นการเก็บใน Registry ของระบบและไม่สัมพันธ์กับ Project ของ Visual Basic 

- การดูข้อมูลของ table หรือ view โดยเลือกชื่อ table หรือ view แล้วดับเบิลคลิกหรือเลือกคำสั่ง Open บนเมนู popup 

- สร้าง table ของฐานข้อมูลใหม่ โดยการสร้างคลิกเมาส์ปุ่มขวาบนโฟลเดอร์ของ table แล้วเลือกคำสั่ง New table ในเมนูเดียวกับผู้ใช้สามารถเลือกสามารถแสดงหรือซ่อน system table หรือกรอง table แต่ความสามารถที่ไม่ได้สนับสนุนโดยฐานข้อมูลทุกประเภท เช่น provider ของ SQL Server สนับสนุนในขณะที่ provider ของ Jet ไม่สนับสนุน 

- การเปลี่ยนผังของ table โดยการคลิกเมาส์ปุ่มขวาแล้วเลือกคำสั่ง Design ซึ่งความสามารถนี้ได้รับการสนับสนุนจากฐานข้อมูลบางประเภท 

- การดู Attributes ให้การคลิกเมาส์มุ่มขวาบนอ๊อบเจค และเลือกคำสั่ง Properties ผู้ใช้สามารถใช้ประโยชน์ในการเปลี่ยนค่าสำหรับการติดต่อ ความเป็นเจ้าของในแต่ละ table และประเภทของคอลัมน์ 

- การสร้าง stored procedure ใหม่หรือแก้ไข ซึ่ง stored procedure เป็นอนุกรมของคำสั่งฐานข้อมูลที่เก็บในฐานข้อมูลในการคอมไฟล์ และกำหนดค่าเหมาะสมให้ฟอร์ม stored procedure ยอมรับพารามิเตอร์ และส่งออกกลุ่มของเรคคอร์ด และ stored procedure สามารถแก้ไขใน SQL Editor และเครื่องมือในชุดเครื่องมือ Visual Database 

- การเพิ่ม Trigger ใหม่ให้กับ table ที่มีอยู่ โดยการเลือกคำสั่ง New Trigger จากเมนู pop-up ซึ่ง Trigger เป็น Store Procedure พิเศษ ที่ประมวลผลอัตโนมัติ เมื่อเรคคอร์ดใน table มีการปรับปรุง เพิ่มหรือลบ 

- สร้างไดอะแกรมของฐานข้อมูลใหม่หรือแก้ไข โดยการเลือกคำสั่งจากเมนู pop-up เมื่อคลิกเมาส์ปุ่มขวาที่ไดเรคทอรี Database Diagram หรือบนอ๊อบเจค Database Diagram ที่มีอยู่ ไดอะแกรมของฐานข้อมูลเป็นมุมมองของกราฟฟิก ของ table ทั้งหมดหรือบางส่วนในฐานข้อมูลที่แสดงความสัมพันธ์ (Relationships) ระหว่างอ๊อบเจค 

การสร้าง Connection ใหม่
การทำงานฐานข้อมูลใน Window ของ Data View ต้องมีการสร้างการเชื่อมข้อมูลไปยังฐานข้อมูล การเชื่อมข้อมูลประกอบด้วยสารสนเทศหลายอย่าง เช่น ชื่อของ OLE DB provider ที่ใช้ในการติดต่อกับ engine ของฐานข้อมูล ซึ่งของฐานข้อมูลที่เจาะจงในการติดต่อ และการข้อมูลของการ login เช่น ชื่อผู้ใช้และรหัสผ่าน 

1. การสร้างการเชื่อมข้อมูลใหม่ ทำได้โดยการคลิกปุ่มขวาสุด บนแถบเครื่องมือของ Data View หรือโดยการคลิกคำสั่ง Add a Data Link จากเมนู popup จากนั้นจะปรากฏไดอะล๊อกบ๊อกซ์ของ Data Link Properties สำหรับกำหนดการเชื่อมต่อกับฐานข้อมูล 

2. ที่แท็บ Provider ของไดอะล๊อกบ๊อกซ์ Data Link Properties ให้เลือก provider ที่ต้องการใช้ติดต่อกับฐานข้อมูล ค่าเริ่มต้น ของ ADO ใช้ Microsoft OLE DB provider for ODBC drivers (MSDASQL ซึ่งให้ผู้ใช้ติดต่อกับฐานข้อมูลแบบสัมพันธ์และ ISAM สำหรับแหล่งข้อมูลบางประเภทให้เลือก provider เฉพาะเพื่อสร้างข้อมูล เมื่อเลือก provider ตามที่แสดงให้เห็นในรายการ ตามตัวอย่างเลือก Microsoft Jet 3.5.1 OLE DB provider แล้วคลิกปุ่ม Next หรือแท็บ Connection 

3. ที่แท็บ Connection โดยรายละเอียดของแท็บขึ้นกับ provider ที่เลือกกำหนดการเชื่อมต่อ ให้กำหนดฐานข้อมูล ในช่อง1. Select or enter a database name ในช่อง 2. การ login ขึ้นกับการประยุกต์ อาจจะทดสอบการเชื่อมต่อด้วยการคลิกปุ่ม Test Connection ถ้าการเชื่อมต่อถูกต้อง จะมีไดอะล๊อกบ๊อกซ์แจ้งว่า “Test connection succeeded” ถ้าติดต่อไม่ได้ จะมีข้อความแจ้งว่า “Test connection failed” พร้อมสาเหตุ แล้วคลิกปุ่ม OK 

4. แท็บ Advance ใช้ในกรณีที่มีเงื่อนไขการเข้าถึงเพิ่มเติม เช่น การเข้าถึงฐานข้อมูล และป้องกันความผิดพลาด timeout โดยการตั้งค่าคุณสมบัติ timeout สูงขึ้น 

5. All เป็นการสรุปคุณสมบัติทั้งหมดของการติดต่อ รวมถึงคุณลักษณะ และสามารถเข้าไปแก้ไขข้อมูลได้ โดยเลือกรายการข้อมูลและคลิกที่ปุ่ม Edit Value
ตามปกติข้อมูลพื้นฐานในการสร้างการเชื่อมกับข้อมูลอยู่ที่แท็บ Provider และ Connection ซึ่งเพียงในการทำงาน
ถ้าเป็นการเลือก provider อื่นๆ เช่น การเลือก ODBC เมื่อมาที่แท็บ Connection จะมีข้อมูลคือ การเลือก Data Source ในช่อง1. Specify source of data และระบุพาร์ทของฐานข้อมูล ในช่อง 3. Enter initial catalog to use ส่วนช่อง 2. Enter information to login ขึ้นกับการประยุกต์
ถ้าเป็นการเลือกเมื่อการมีการติดต่อกับฐานข้อมูล SQL Server ใช้ Microsoft OLE DB Provider for SQL Server 6.5 โดยผู้ใช้สามารถเลือกชื่อแม่ข่าย ป้อนข้อมูลการ login และเลือกชื่อฐานข้อมูล (ADO เรียกว่า initial catalog) ในกรณีที่ SQL Server ใช้ชื่อและรหัสผ่านในเวลา login เพื่อตรวจสอบสอนสิทธิ์ในการเข้าถึงแม่ข่าย คลิกปุ่ม Test Connection เพื่อตรวจสอบทุกอย่าง 

ถ้าใช้ Microsoft OLE DB provider for ODBC drivers ข้อมูลในแท็บ Connection จะแตกต่างออกไป ในกรณีนี้สามารถเลือก DSN หรือ ข้อความการติดต่อ (สำหรับ DSN-Lass Connection) ถ้าเลือกใช้ Connection String ผู้ใช้สามารถสร้างการเริ่มต้นด้วย DSN ที่มีอยู่หรือสร้างใหม่ และสามารถป้อนค่าคุณสมบัติอื่นใน ไดอะล๊อกบ๊อกซ์ ซึ่งมีรายละเอียดตามไดร์ฟเวอร์ของ ODBC ถ้ามีการป้อนค่าของชื่อผู้ใช้รหัสอ่านและชื่อฐานข้อมูล ใน ไดอะล๊อกบ๊อกซ์ ผู้ใช้ไม่จำเป็นต้องป้อนค่าอีกใน Wizard ต่อไป 

Data Form

หัวข้อพิเศษไอที, VB 6.0 No Comments »

Data Form Wizard 

Wizard ของ Data Form เป็นฟอร์มที่เชื่อมต่อกับฐานข้อมูลที่มีให้ใน add-in ของ Visual Basic 6 ซึ่งสามารถใช้สร้างฟอร์มโดยอัตโนมัติด้วยกลุ่มของตัว control ที่รวมเข้ากับแหล่งข้อมูล และสร้างปุ่มคำสั่งสำหรับการทำงานปกติ เช่น การเพิ่มหรือลบเรคคอร์ด วิธีรวมกับแหล่งข้อมูล สามารถเลือกเป็น ADO Data control, ADO Recordset หรือ class modules 

วิธีการสร้างฟอร์มด้วย Data Form Wizard 

ที่เมนู Project เลือกคำสั่ง Add Form จะปรากฏไดอะล๊อกบ๊อกซ์ Add Form ให้เลือก VB Data Form Wizard แล้วคลิก Open เพื่อเข้าสู่การสร้างฟอร์มด้วย Data Form Wizard มีขั้นตอน คือ 

1. Wizard ขั้นตอนที่ 1 Introduction เพื่อให้ถึง Profile มาใช้งาน คลิก Next เพื่อไปที่ขั้นตอนที่ 2 

2. Wizard ขั้นตอนที่ 2 Database Type เลือกประเภทฐานข้อมูลจากรายการ คลิก Next เพื่อไปที่ขั้นตอนที่ 3 

3. Wizard ขั้นตอนที่ 3 ชี้ตำแหน่งของฐานข้อมูล (ตามตัวอย่างเลือก Access) ถ้าเป็นการเลือก ODBC จะต้องกำหนดรายละเอียดข้อมูลการติดต่อผ่าน ODBC คลิก Next เพื่อไปที่ขั้นตอนที่ 4 

4. Wizard ขั้นตอนที่ 4 ให้กำหนดประเภทของฟอร์ม และการรวมกับข้อมูล คลิก Next เพื่อไปที่ขั้นตอนที่ 5 

 

5. Wizard ขั้นตอนที่ 5 การสร้างฟอร์ม ด้วยการเลือก table แล้วเลือกฟิลด์จากช่องด้านซ้าย และคลิกปุ่มการเลือกให้มาอยู่ในช่องด้านขวา ตามตัวอย่างเป็นในขั้นตอนที่ 4 เป็นการเลือก Master/Detail ขั้นตอนนี้จึงเป็นการเลือกแหล่งข้อมูลและฟิลด์สำหรับฟอร์มที่เป็น Master 5 แล้วคลิก Next เพื่อไปขั้นตอนต่อไป 

6. Wizard ขั้นตอนนี้ เป็นการสร้างฟอร์มที่เป็น Detail ซึ่งให้ทำการกำหนดและเลือกตามข้อ 5 แต่ถ้าเป็นการเลือกฟอร์มประเภทอื่นๆ จะไม่มีขั้นตอนนี้ แล้วคลิก Next เพื่อไปขั้นตอนต่อไป 

7. Wizard ขั้นตอนนี้ เป็นระบุฟิลด์ที่เชื่อมระหว่างฟอร์ม Master กับ Detail แล้วคลิก Next เพื่อไปขั้นตอนที่ 6
ขั้นตอนนี้เหมือนกับข้อ 7 คือ มีเฉพาะฟอร์มประเภท Master/Detail 

8. Wizard ขั้นตอนที่ 6 กำหนดปุ่มคำสั่งบนฟอร์ม คลิก Next เพื่อไปขั้นตอนที่ 7 

9. Wizard ขั้นตอนที่ 7 ฟอร์มได้รับการสร้างเสร็จเรียบร้อย ขั้นตอนนี้เป็นการเก็บเป็น profile แล้วคลิกปุ่ม Finish เพื่อออกจาก Wizard 

10. เมื่อออกจาก Wizard แล้วจะพบฟอร์มที่สร้างเสร็จเรียบร้อยแล้ว 

ADO Data Control

หัวข้อพิเศษไอที, VB 6.0 No Comments »

ADO Data Control เป็นตัว Control ที่ได้รับการออกแบบให้สนับสนุนเทคโนโลยี ADO ซึ่งเป็นเทคโนโลยีใหม่ใน Visual Basic 6

การรวมกับข้อมูล

เทคโนโลยีการรวมข้อมูล หมายถึง เมื่อมีการวางตัว control ลงบนฟอร์มแล้ว และรวมตัว control บางส่วนหรือทั้งหมดเข้ากับตัว control อีกตัว เช่น data control ซึ่งจะทำหน้าที่เชื่อมต่อกับฐานข้อมูล data control ให้ผู้ใช้สามารถเลื่อนไปยังเรคคอร์ดต่าง ๆ ในฐานข้อมูล เมื่อมีการเรคคอร์ดใหม่ ค่าของฟิลด์จะปรากฏ ตัว bound control เมื่อมีการปรับค่าในตัว control การเปลี่ยนค่าจะส่งไปที่ฐานข้อมูล
การรวมข้อมูลของ ADO เป็นการปฏิวัติ เทคโนโลยีการแสดงข้อมูลจากฐานข้อมูล ประการแรก ผู้ใช้อาจจะไม่ได้ทำงานกับฐานข้อมูลตลอดเวลา ซึ่งใน Visual Basic 6 ไม่ได้กล่าวถึงตัว bound control และ data control แต่กล่าวถึง data consumer ที่ผูกติดกับแหล่งข้อมูล ประการต่อการ Visual Basic มี data consumer หลายประเภท เช่น ตัว intrinsic control หรือตัว control ภายนอก, class, COM, component, ตัว control แบบ Homemade ActiveX (หรือ User control), หรือ Data Report designer และมีแหล่งข้อมูลหลายประเภทที่มีสามารถเลือกได้ เช่น ตัว control แบบ ADO Data, class, COM component, User control หรือ Data Environment designer
การเลือกแหล่งข้อมูลและ consumer จะทำให้แบบแผนการรวมข้อมูลมีความยืนหยุ่นในโปรแกรมประยุกต์ที่ดีกว่า data control แบบดั้งเดิม เมื่อมีการใช้การรวมข้อมูลของ ADO ซึ่งไม่ได้เป็นการเชื่อมแบบสถาปัตยกรรม 2-tier เนื่องจากการประยุกต์ไม่ได้รวมโดยตรงกับฟิลด์ในฐานข้อมูล แต่สามารถใช้ตัวกลาง COM component เพื่อที่จะใช้เครื่องมือสำหรับการออกแบบตามสถาปัตยกรรม 3-tier ที่การประมวลผลสามารถทำได้ที่เครื่องลูกข่าย เครื่องแม่ข่ายหรือเครื่องอื่นได้

กลไกการรวม

ADO Data control สามารถรวมตัว control ที่ต่างกัน และนำไปประยุกต์กับ date source หรือ consumer อื่นเนื่องจาก ADO Data control ไม่ได้เป็นตัว intrinsic control ดังนั้นการนำมาใช้ต้องเพิ่มตัว control เข้ามาด้วยวิธีการดังนี้
1. ที่เมนู Project เลือก Components (Project -> Components) หรือคลิกเมาส์ปุ่มขวาบน Tool Box แล้วเลือก Components จากเมนู popup
2. เมื่อไดอะล๊อกบ๊อกซ์ Components ปรากฏขึ้นให้เลื่อนรายการไปที่ Microsoft ADO data control 6.0 (OLE DB) ให้คลิกที่ check box ด้านหน้า แล้วคลิกปุ่ม OK
3. ADO data control จะได้รับการแทรกที่ Tool Box โดยมีชื่อย่อ Adodc
การเพิ่ม Adodc (ADO data control) บนฟอร์ม
1. สร้าง Project ใหม่ และให้ตั้งชื่อว่า Project เป็น DataFmt.vbp และสร้างฟอร์มใหม่
2. คลิกที่ Tool ของ Adodc บน Toolbox แล้ววางลงบนฟอร์ม ตามปกติควรอยู่ด้านล่างของฟอร์ม แล้วกำหนดคุณสมบัติ Align เป็น 2-vbAlignButton เพื่อทำให้สามารถปรับขนาดตามฟอร์มได้
3. สร้าง Connection
4. ที่เมนู View เลือก Property Pages (View -> Property Pages) หรือคลิกเมาส์ปุ่มขวาแล้วเลือก Property Pages
5. บนไดอะล๊อกบ๊อกซ์ของ Property Pages ที่แท็บ General ให้กำหนดติดต่อกับแหล่งข้อมูลได้ 3 แบบ คือ ไฟล์ Data Link, ODBC Data Source Name (DSN), และ Connection String ในตัวอย่างเลือกใช้ Connection String
ให้คลิกที่ปุ่มตัวเลือกของ Connection String เมื่อช่องข้อความด้านล่าง Connection String เปลี่ยนสีขาวให้คลิกปุ่ม Build ด้านหลัง
6. เมื่อปรากฏไดอะล๊อกบ๊อกซ์ของ Data Link Properties ที่หน้าของแท็บ Provider ให้เลือก Microsoft Jet 3.5.1 OLE DB Provider แล้วคลิกปุ่ม Next
7. ที่แท็บ Connection ให้คลิกที่ปุ่มด้านหลังช่องข้อความของ Select or Enter Database Name จะปรากฏ Window ของ Select Access Database ให้เลือกฐานข้อมูล (ตามตัวอย่างเลือกจาก C:\Program Files\Microsoft Visual Studio\VB98\NWind.mdb) คลิกปุ่ม Open ชื่อของฐานข้อมูลและพาร์ทจะปรากฏในช่องข้อความหมายเลข 1 ของแท็บ Connection หรือพิมพ์พาร์ทและชื่อฐานข้อมูลลงในช่องข้อความเอง
ในช่องข้อความ User Name ใช้สำหรับกำหนดชื่อผู้ใช้ที่สามารถเข้าถึงฐานข้อมูลได้ ในที่นี้กำหนดเป็น Admin หมายถึงผู้ใช้ที่สามารถเข้าถึงทุกส่วนของฐานข้อมูลได้ ส่วนช่อง Password สำหรับการกำหนดรหัสผ่านเข้าฐานข้อมูล
คลิกปุ่ม Test Connection เมื่อทดสอบการติดต่อระหว่าง ADO data control กับฐานข้อมูลที่เลือกถ้าสามารถติดต่อกันได้ จะปรากฏข้อความ “Test Connection Succeeded” ให้คลิกปุ่ม OK
8. ที่ Data Link Properties ให้คลิกปุ่ม OK เพื่อไปยัง Property Page จะปรากฏพารามิเตอร์ของการติดต่อระหว่าง ADO data control กับฐานข้อมูลในช่อง Connection String
9. คลิกที่แท็บ Record source บน Property Page ให้เลือก 2-adCmdTable ในช่อง Command Type เพื่อการติดต่อกับ table จากนั้นช่อง Table or Stored Procedure Name จะเปลี่ยนเป็นสีขาวและมีรายชื่อ table ให้เลือก table ชื่อ Orders
10. คลิกปุ่ม OK
11. วาด text Box , label อย่างละ 4 ตัว และ option button 2 ตัวแต่สร้างเป็น control array โดยอาจจะใช้การสร้างตัวหนึ่งบนฟอร์ม แล้วใช้กับการคัดลอกและวาง ซึ่งจะมีไดอะล๊อกบ๊อกซ์ให้ยืนยันการสร้างชื่อเดียวกัน แต่จะมีการกำหนดคุณสมบัติ Index ตามลำดับให้แล้วกำหนดคุณสมบัติ ดังนี้

อ๊อบเจค ตัว Control หรือ อ๊อบเจค คุณสมบัติ การตั้งค่า
ฟอร์ม Form1 Name Data Format
text box Text1 Name txtOrderID
Text2 Name txtOrderDate
Text3 Name txtShippeddate
Text4 Name txtFreight
option button Option1 Name optCurrency

ส่วน Label ให้กำหนดคุณสมบัติ caption ตามตำแหน่งที่วางหน้า text box
12. ที่ txtOrderDate ไปที่ตารางคุณสมบัติ ให้กำหนดคุณสมบัติ DataSource เป็น adodc1 และคุณสมบัติ DataField เป็น OrderDate โดยเลือกจากรายการในเมนู drop-down กำหนดคุณสมบัติ DataFormat โดยการที่ปุ่ม build เพื่อเปิด Property pages แล้วเลือกรูปแบบที่เหมาะสมกับประเภทข้อมูล สำหรับ OrderDate เลือกประเภทรูปแบบเป็น Date และกำหนดรูปแบบเป็น d mmmm yyyy
จากนั้น กำหนดค่าคุณสมบัติกับ Text box อื่นๆ ตามค่าคุณสมบัติในตาราง และเลือกคุณสมบัติ DataFormat ที่เหมาะสมของประเภทข้อมูล

ตัว Control คุณสมบัติ การตั้งค่า
txtOrderID DataSource adodc1
DataField OrderID
txtOrderDate DataSource adodc1
DataField OrderDate
txtShippeddate DataSource adodc1
DataField Shippeddate
txtFreight DataSource adodc1
DataField Freight

เนื่องจากมีการใช้อ๊อบเจค StdDataFormat ดังนั้น ต้องเพิ่มการอ้างอิง โดยไปที่ Project เ Reference แล้วเลือก Microsoft Data Format Object Library จากไดอะล๊อกบ๊อกซ์ References
การตั้งค่าคุณสมบัติให้ Text box ที่เป็นการรวมข้อมูล คือ คุณสมบัติ DataSource ของทุกตัว control ให้ตั้งค่าเป็น Adodc1 (หรือตามชื่อที่ตั้งขึ้น) และคุณสมบัติ DataField ให้เลือกฟิลด์ของ table หรือคิวรี่ ซึ่งได้จากการกำหนด RecordSource ของ ADO data control การตั้งค่าให้เลือกจากรายการด้วยการคลิกที่ปุ่มลูกศรแล้วเลือกค่าที่ต้องการ

ADO Data Control

ภายในตัว ADO Data control ประกอบด้วยคุณสมบัติของ ADOConnection และอ๊อบเจค Recordset สามารถแสดงรายการคุณสมบัติที่สำคัญในการทำงาน

คุณสมบัติ การประยุกต์
ADOConnection
ConnectionString เก็บสารสนเทศในการติดต่อกับแหล่งข้อมูล
User และ Password ตั้งข้อมูลสำหรับการ login
ConnectionTimeout ตั้งค่าการหมดเวลาในการเปิด connection
Mode หาการปฏิบัติที่ยอมให้ในการติดต่อกับแหล่งข้อมูล
   
อ๊อบเจค Recordset
RecordSource ส่งออกเรคคอร์ดจาก table, stored procedure หรือคำสั่ง SQL
CommandType ประเภทของคิวรี่ที่เก็บในคุณสมบัติ RecordSource
CommandTimeout การสิ้นสุดเวลาเป็นวินาทีในการประมวลผลคำสั่ง
CursorLocation ระบุตำแหน่งของ cursor ควรอยู่ที่ลูกข่ายหรือแม่ข่าย
CursorType ประเภทของ cursor เป็นจำนวนของเรคคอร์ดที่อ่านจากฐานข้อมูลในแต่ละทรานแซคชัน
LockType มีผลกับการปรับปรุงข้อมูลในฐานข้อมูล
   

ในขณะเรียกใช้ ADO Data Control จะเกิดได้หลายคุณสมบัติ ทำให้สนับสนุนการเพิ่มเมธอดในการทำงาน เช่น เมธอด Add New และ Delete อาจจะใช้ปุ่มคำสั่งและ event คลิกในการทำงาน
1. สร้าง Project ใหม่ และสร้างฟอร์มใหม่
2. คลิกที่ Tool ของ Adodc บน Toolbox แล้ววางลงบนฟอร์ม ตามปกติควรอยู่ด้านล่างของฟอร์ม แล้วกำหนดคุณสมบัติ Align เป็น 2-vbAlignButton เพื่อทำให้สามารถปรับขนาดตามฟอร์มได้
3. วาด 3 Text box 4 Command button และ 5 Label ลงบนฟอร์ม
อ๊อบเจค อ๊อบเจค หรือ ตัว Control คุณสมบัติ การตั้งค่า

อ๊อบเจค ตัว Control หรือ อ๊อบเจค คุณสมบัติ การตั้งค่า
ฟอร์ม Form1 Name frmAdoData
text box Text1 Name txtTitle
MultiLine True
Text2 Name txtYear
Text3 Name txtISBN
Command button Command1 Name cmdAdd
Command2 Name cmdDelete
Command3 Name cmdUpdate
Command4 Name cmdCancel

ส่วน Label ให้กำหนดคุณสมบัติ Caption ตามตำแหน่งที่วางหน้า text box
4. ตั้งค่าการเชื่อมต่อตามขั้นตอนที่ 3 ถึง 10 ของ Project “DataFmt.vbp” โดยตั้งค่าคุณสมบัติ
คุณสมบัติ ConnectionString ด้วย Microsoft Jet 3.5.1 OLEDB provider (ในแท็บ Provider) และชี้ไปที่ฐานข้อมูล Biblio.mdb ใน “C:\Program Files\Microsoft Visual Studio\Vb98″ หรือตามตำแหน่งที่เก็บฐานข้อมูล (ในแท็บ Connection)
คุณสมบัติ RecordSource ให้ชี้ไปที่ table ชื่อ Titles (ในแท็บ Record Source)
เมธอดที่นำมาใช้ในการทำงานกับเรคคอร์ด ใน Project นี้ คือ
- เมธอด AddNew สำหรับการเพิ่มเรคคอร์ดใหม่ มีไวยากรณ์ดังนี้
recordset.AddNew
Private Sub cmdAdd_Click()
   Adodc1.Recordset.AddNew
End Sub
- เมธอด Delete สำหรับการลบเรคคอร์ด มีไวยากรณ์ดังนี้
recordset.Delete
Private Sub cmdDelete_Click()
   Adodc1.Recordset.Delete
End Sub
- เมธอด Update สำหรับการบันทึกการเปลี่ยนแปลงค่าของเรคคอร์ด มีไวยากรณ์ดังนี้
recordset.Update
Private Sub cmdUpdate_Click()
   Adodc1.Recordset.Update
End Sub
- เมธอด Cancel สำหรับการลบเรคคอร์ด มีไวยากรณ์ดังนี้
recordset.Cancel
Private Sub cmdCancel_Click()
   Adodc1.Recordset.Cancel
End Sub
อ๊อบเจค Recordset มีชุดของคุณสมบัติและเมธอดที่สามารถใช้ได้จาก ADO Data control เช่น การเรียงหรือการกรอง ในการติดต่ออ๊อบเจค ADO Data control ไม่สามารถรองรับติดต่อโดยตรง แต่ใช้ความสามารถของคุณสมบัติ ActiveConnection ของอ๊อบเจค Recordset ได้
Private Sub Form_Load()
   Adodc1.ConnectionString = “Provider=Microsoft.Jet.OLEDB.3.51;” & _
Persist Security Info=False;Data Source=” & _
“C:\Program Files\Microsoft Visual Studio\Vb98\Nwind.mdb”
   Adodc1.Refresh
   ’ เริ่มต้น transaction
   Adodc1.Recordset.ActiveConnection.BeginTrans
   Adodc1.RecordSource = “SELECT * FROM Customers”
End Sub
Private Sub Form_Unload(Cancel As Integer)
   If Not DataChanged Then
      ’ no record was changed, do nothing
   ElseIf MsgBox(”ยืนยันการเปลี่ยนแปลงข้อมูล?”, vbYesNo + vbExclamation) = vbYes Then
      Adodc1.Recordset.ActiveConnection.CommitTrans
   Else
      Adodc1.Recordset.ActiveConnection.RollbackTrans
      Adodc1.Refresh
   End If
End Sub
ADO Data control ใช้ event ของอ๊อบเจค Recordset ในการทำงานตัวอย่าง เช่น MoveComplete, WillChangeRecord และ Error โดย MoveComplete เกิดเมื่อเรคคอร์ดใหม่ เปลี่ยนมาเป็นเรคคอร์ดปัจจุบัน
Private Sub rs_MoveComplete(ByVal adReason As ADODB.EventReasonEnum, ByVal pError As ADODB.error, adStatus As ADODB.EventStatusEnum, ByVal pRecordset As ADODB.Recordset)
   ShowEvent txtEvents, “MoveComplete”, “adReason”, GetReason(adReason), “pError”, GetError(pError), “adStatus”, GetStatus(adStatus)
End Sub
WillChangeRecord เกิดทันทีก่อนที่ ADO data control เขียนข้อมูลลงในฐานข้อมูล
Private Sub rs_WillChangeRecord(ByVal adReason As ADODB.EventReasonEnum, ByVal cRecords As Long, adStatus As ADODB.EventStatusEnum, ByVal pRecordset As ADODB.Recordset)
   ShowEvent txtEvents, “WillChangeRecord”, “adReason”, GetReason(adReason), quot;cRecords”, cRecords, “adStatus”, GetStatus(adStatus)
End Sub
Error เป็น event ไม่ได้ inherited จากอ๊อบเจค Recordset โดย Error เกิดขึ้นเมื่อไม่มีคำสั่งของ Visual Basic ทำงาน

การเข้าถึงฐานข้อมูล

หัวข้อพิเศษไอที, VB 6.0 No Comments »

การพัฒนาโปรแกรมประยุกต์ Visual Basic ส่วนใหญ่นำมาใช้กับฐานข้อมูล และการประยุกต์แบบ client / server ซึ่ง Visual Basic เป็นเครื่องมือที่อำนวยความสะดวกให้กับผู้พัฒนาโปรแกรมการเข้าถึงข้อมูล  

ความสามารถใหม่ที่สัมพันธ์กับฐานข้อมูลของ Visual Basic มีพื้นฐานจาก ActiveX Data Object (ADO) ซึ่งเป็นเทคโนโลยีที่ให้ผู้ใช้เข้าถึงฐานข้อมูลหรือแหล่งข้อมูล เมื่อมีการใช้ OLE DB provider ติดต่อกับแหล่งข้อมูล 

Visual Basic 6 มีวิธีการติดต่อกับฐานข้อมูลได้หลายวิธี 

ODBC 

ODBC ย่อมาจาก Open Data Connectivity และตั้งค่าการทำงานให้ผู้ใช้ติดต่อกับฐานข้อมูลทั้งภายในพื้นที่และระยะไกล Microsoft เสนอเทคโนโลยีที่เป็นวิธีการเข้าถึงฐานข้อมูลหลายประเภท เช่น dBase, Microsoft FoxPro, Microsoft Access, Microsoft SOL Server, Oracle รวมไฟล์ text แบบ comma-delimited ด้วยการใช้ API ร่วมกัน ส่วนที่โปรแกรมประยุกต์ทำงานกับ DLL เรียกว่า ODBC driver manager ซึ่งจะส่งคำสั่งไปที่ไดร์ฟเวอร์ ODBC ในการระบุฐานข้อมูลที่ผู้ใช้ต้องการ
สิ่งท้าทายของ ODBC เป็นการให้ติดต่อร่วมกับฐานข้อมูลประเภทต่างๆ ในทางทฤษฎี ผู้เขียนโปรแกรมประยุกต์สามารถเตรียมใช้ ODBC ติดต่อกับฐานข้อมูล Access และเปลี่ยนขนาดไปที่ฐานข้อมูล SOL Server โดยการเปลี่ยนไดร์ฟเวอร์ back-end ของ ODBC และมีคำสั่งไม่มาก การทำสิ่งเหล่านี้ได้เนื่องจากคำสั่งที่ส่งไปยังฐานข้อมูล คือ คำสั่งมาตรฐาน SQL ภาษา SOL (Structure Query Language) เป็นภาษาโปรแกรมที่ใช้กับฐานข้อมูล ในการปฏิบัติเลเยอร์ ODBC สามารถแปลงคำสั่ง SQL ให้เป็นภาษาเฉพาะของฐานข้อมูล ผู้เขียนโปรแกรม ODBC มักจะข้าม engine การแปลของ ODBC และส่งคำสั่งโดยตรงกับฐานข้อมูล
ODBC มีประสิทธิภาพเมื่อเปรียบเทียบกับเทคนิคการเข้าถึงข้อมูล ความได้เปรียบของ ODBC คือสนับสนุน API ทั้งประเภท 16 บิต และ 32 บิต ใน ODBC เวอร์ชัน 3 เพิ่มเทคนิคการบู๊ตให้ดีขึ้น เช่น การติดต่อแบบ pool ทำให้โปรแกรมประยุกต์ตอบสนองได้ดีขึ้น Microsoft Transaction Server ใช้การติดต่อแบบ pool เพื่อความเร็วในการเปิดการติดต่อโดย component ของ ActiveX ที่ทำงานอยู่ภายใต้ ODBC 

การใช้ ODBC ไม่ใช่เรื่องง่ายโดยเฉพาะอย่างยิ่งสำหรับผู้พัฒนาโปรแกรมด้วย Visual Basic กลุ่มของฟังก์ชัน API มีความซับซ้อนและถ้ามีความผิดพลาดเกิดขึ้นอาจจะให้โปรแกรมประยุกต์เสียหาย ด้วยเหตุนี้ผู้พัฒนาโปรแกรม Visual Basic น้อยมากที่จะเขียนคำสั่งเรียกฟังก์ชัน ODBC โดยตรง เทคนิคการแก้ไขข้อมูลอื่น ๆ ส่วนใหญ่ให้ Visual Basic ใช้ไดร์ฟเวอร์ ODBC ในฐานะเลเยอร์กลาง ในบางครั้งอาจใช้เทคนิคอื่น ๆ กับการเรียก API โดยตรง แต่ไม่สามารถใช้วิธีการนี้กับ ADO ได้ถึงแม้ว่าภายใน ADO จะใช้ไดร์ฟเวอร์ ODBC 

แนวคิดพื้นฐานของเทคโนโลยี เช่น เมื่อมีการทำงานกับ ADO มีความเกี่ยวข้องกับ Data Source Name (DSN) โดย DSN เป็นกลุ่มของค่าที่โปรแกรมประยุกต์ในการติดต่อกับฐานข้อมูล โดยทั่วไปจะรวมถึงชื่อไดร์ฟเวอร์ของ ODBC ที่ต้องการใช้ ชื่อของไดร์ฟเวอร์เป็น host ของแม่ข่ายฐานข้อมูล (การทำงาน กับ Client-Server engine เช่น SQL Server หรือ Oracle), ชื่อพาร์ทของฐานข้อมูลที่เจาะจง, เวลาสิ้นสุดของการติดต่อ, ชื่อของการเรียกเวิร์คสเตชัน หรือโปรแกรมประยุกต์ เป็นต้น 

การสร้าง DSN ทำได้หลายวิธี ทั้งภายในและภายนอก Visual Basic ศูนย์กลางของคำสั่ง ODBC อยู่ใน control Panel ของระบบปฏิบัติการ Windows ที่ให้ผู้ใช้ติดต่อสร้าง DSN และคอนฟิก ODBC ซึ่งมี DSN หลายประเภท DSN ของผู้ใช้จะเก็บไว้ใน Registry ของระบบ และสามารถใช้ได้เฉพาะผู้ใช้ปัจจุบันโดยไม่สามารถแบ่งให้ผู้ใดได้ DSN ของระบบเก็บไว้ใน Registry เช่นกัน และสามารถเห็นได้โดยผู้ใช้อื่น ๆ รวมถึงแม่ข่าย Windows NT ไฟล์ DSN เก็บในไฟล์ .dsn และสามารถใช้ร่วมกันโดยผู้ใช้ทั้งหมดไฟล์ DSN สามารถคัดลอกได้ง่าย ทำให้การติดตั้งทำได้สะดวก อีกด้านหนึ่งโปรแกรมประยุกต์ต้องการที่เก็บ DSN ต้องใช้คำสั่งที่ระบุพาร์ทของไฟล์ DSN ที่สมบูรณ์ 

การทำงานกับ ODBC โดยไม่เกี่ยวข้องกับ DSN ทำได้โดยการให้สารสนเทศที่ต้องการสำหรับการติดต่อ เช่น ไดร์ฟเวอร์, ชื่อฐานข้อมูล และพาร์ทเป็นต้น ให้ถูกต้องในคำสั่ง วิธีนี้เรียกว่า DSN-Less Connections ซึ่งมีประสิทธิภาพเพราะประหยัดของไดร์ฟเวอร์ ODBC ในการเดินทางไปที่ Registry หรือไฟล์ DSN แต่วิธีการนี้ ผู้พัฒนาโปรแกรมต้องทำงานมากขึ้น 

แท็บ 3 แท็บแรกของไดอะล๊อกบ๊อกซ์ ODBC ใน control Panel ให้ผู้ใช้สร้าง, ลบ และคอนฟิก DSN ทุกประเภท การสร้าง DSN ต้องเปิด ไดอะล๊อกบ๊อกซ์ ที่เกี่ยวข้องหลายชุด 

แท็บ Driver แสดงไดร์ฟเวอร์ ODBC ที่มีการติดตั้งและเปรียบเทียบหมายเลขของเวอร์ชัน Visual Basic 6 มาพร้อมกับไดร์ฟเวอร์ ODBC หลายตัว แต่สามารถซื้อไดร์ฟเวอร์จากผู้ขายรายอื่น 

แท็บ Tracing ของ ODBC Data Source Administrator กำหนดพาร์ทของไฟล์ล๊อกในการทำงานของ ODBC ซึ่งการป้องกันไดร์ฟเวอร์ เมื่อมีการหาข้อผิดพลาดโปรแกรมประยุกต์แบบ ODBC 

แท็บ Connection Pool ให้ผู้ใช้สามารถใช้หรือยกเลิก Connection Pool สำหรับแต่ละไดร์ฟเวอร์ของ ODBC ตามปกติไม่ค่อยมีการเปลี่ยนแปลงการตั้งค่า และเก็บ About ให้ผู้ใช้ตรวจสอบตำแหน่งและเวอร์ชันของ DLL ของระบบย่อย ODBC 

DAO 

DAO หรือ Data Access Object เป็นหัวใจของโปรแกรมประยุกต์ Visual Basic 3 ในพัฒนาการประยุกต์กับฐานข้อมูล DAO เป็นการติดต่อแบบ Object-oriented ไปยัง Microsoft Jet ที่เป็น engine ที่มีความสามารถสูง ผู้พัฒนาโปรแกรมสามารถออกแบบฐานข้อมูล MDB ด้วย Access และใช้ DAO จากโปรแกรมประยุกต์ Visual Basic ในการเปิดฐานข้อมูล เพิ่มและลบเรคคอร์ด และจัดการทรานแซคชัน สิ่งที่ดีที่สุดของ DAO คือไม่จำกัดผู้ใช้กับ Jet database เพราะผู้ใช้สามารถเปิดฐานข้อมูลทุกชนิดที่มีไดร์ฟเวอร์ ODBC ได้โดยตรงหรือผู้ใช้สามารถใช้ Jet attached table ซึ่งเป็น table เสมือนที่ปรากฏตามฐานข้อมูล MDB แต่การดึงและเก็บข้อมูลจริงในแหล่งอื่นของ ODBC 

ถ้าผู้ใช้สามารถใช้ DAO เข้าถึงแหล่ง non-jet ผู้ใช้สามารถเห็นกลไกของฐานข้อมูล Access เช่น โปรแกรมประยุกต์ไม่ใช่ฐานข้อมูล Access ผู้ใช้ยังคงโหลด DLL ของ Jet engine เข้าสู่หน่วยความจำ DAO ไม่สามารถให้ผู้ใช้ทำงานกับฟังก์ชัน API ของ ODBC โดยตรง เช่น การทำงานแบบผลลัพธ์หลายชุด, การคิวรี่แบบ asynchronous หรือการติดต่อด้วย DAO
Data control เป็นตัว control ที่ให้ผู้ใช้เชื่อมตัว control 1 ตัวหรือมากกว่าบนฟอร์มกับแหล่งข้อมูลและมีปุ่ม navigator สำหรับเลื่อนเรคคอร์ดของ table ที่มีการติดต่อ Data control ดูเหมือนเป็นเครื่องมือที่ดีมาก เพราะทำให้สามารถทำการอินเตอร์เฟซ กับผู้ใช้ได้รวดเร็วแต่พบว่า Data control มีข้อจำกัดอยู่หลายอย่าง เมื่อพิจารณาสมรรถนะ Data control มีข้อเสียเปรียบสำคัญประการหนึ่ง คือ ผูกติดการประยุกต์ด้าน Front-end กับข้อมูลในฐานข้อมูล ถ้ามีการเปลี่ยนไปใช้เข้าถึงฐานข้อมูลอื่น จะต้องมีทบทวนฟอร์ม ทั้งในโปรแกรมประยุกต์ ถ้าต้องการเพิ่ม Validation rule ที่ซับซ้อนไปยังฟิลด์ ในฐานข้อมูล ต้องมีการเพิ่มคำสั่งในโมดูลเดียวของโปรแกรมทำให้มีผลกับสถาปัตยกรรม 2-tier และไม่สามารถใช้ได้กับสถาปัตยกรรม 3-tier ซึ่งมีเลเยอร์ชั้นกลางระหว่างโปรแกรมประยุกต์ กับฐานข้อมูล ที่ให้บริการ เช่น การตรวจสอบข้อมูล กฎทางธุรกิจ ความสมดุลของภาระงาน และความปลอดภัย 

Visual Basic 4 ไปปรับปรุง DAO เวอร์ชัน 3 ซึ่งมีส่วน DLL พิเศษ ที่ให้ผู้พัฒนาโปรแกรมด้วยเทคโนโลยี 32 บิต สามารถเข้าถึงฐานข้อมูล 16 บิต Visual Basic 5 ได้ปรับปรุงเป็น DAO 3.54 และ Visual Basic ได้ปรับปรุงเป็น DAO 3.51 และ DAO เวอร์ชัน 4 ได้ปรับปรุงสำหรับ Microsoft Office 2000 

RDO 

RDO หรือ Remote Data Objects เป็นความพยายามครั้งแรกของ Microsoft ในการรวมความง่ายของ DAO กับความสามารถระดับสูงของ Direct ODBC API Programming โดย RDO เป็นแบบจำลองอ๊อบเจคที่ไม่ชัดเจน ภายหลัง DAO แต่ใช้การข้าม Jet engine และ DLL ของ DAO และทำงานโดยตรงกับไดร์ฟเวอร์ ODBC โปรแกรมประยุกต์ที่มาจาก RDO โหลดเฉพาะ DLL จำนวนหนึ่งแทนการใช้ทรัพยากรจำนวนมากของ Jet engine โดยสิ่งสำคัญอยู่ที่การออกแบบเฉพาะของ RDO ให้ทำงานกับทรัพยากรของ ODBC ทำให้สามรถทำงานที่ไม่สามารถเข้าถึงได้โดย DAO เทคโนโลยีของ RDO เป็นเทคโนโลยี 32 บิต จึงไม่สามารถใช้ได้จากโปรแกรมประยุกต์ 16 บิต 

RDO1 ได้รับการแนะนำใน Visual Basic 4 และ engine มีการปรับปรุงใน Visual Basic เป็น RDO2 เวอร์ชันล่าสุดเป็นผลิตภัณฑ์ที่สมบูรณ์และสนับสนุนแบบจำลองการโปรแกรมใหม่ที่เป็นแบบ event ซึ่งมีประโยชน์กับการทำงานแบบ asynchronous การพัฒนา RDO ดูเหมือนได้หยุดลง เนื่องจาก Visual Basic 6 ยังคงใช้เวอร์ชัน 2 และไม่มีการปรับปรุงเพิ่มเติมจากเวอร์ชันที่มาพร้อมกับ Visual Basic 5 

RDO1 และ RDO2 มาพร้อมกับ Remote Data control ซึ่งทำงานเหมือนกับ Data control และให้ผู้ใช้เชื่อมตัว control กับแหล่งข้อมูลระยะไกล จึงทำให้ Remote Data control มีข้อดีและข้อเสียเหมือนกับ Data control รวมถึงปัญหากับสถาปัตยกรรมแบบ n-tier 

ODBC Direct 

Visual Basic 5 ได้รวมเทคโนโลยีการเข้าถึงข้อมูลอีกแบบ ชื่อ ODBC Direct ซึ่งยินยอมให้ผู้พัฒนาโปรแกรมประยุกต์ RDO ด้วยไวยากรณ์ DAO โดย ODBC Direct ทำหน้าที่ในฐานะเทคนิคการส่งผ่านที่การเขียนโปรแกรม Visual Basic ย้ายการประยุกต์ DAO/Jet ไปยังสถาปัตยกรรม client/server ในทางทฤษฎีเป็นการเปลี่ยนคุณสมบัติเพียงเล็กน้อย ซึ่งโปรแกรม DAO ที่เก็บข้อมูลใน Jet database จะแปลงไปเป็นการประยุกต์แบบ client/server ในการติดต่อแหล่ง ODBC ในขณะที่ ODBC Direct ไม่ได้รับการพิจารณาในฐานะเทคโนโลยี แต่เหมือนเป็นวิธีการที่ทำให้ประหยัดเวลาการแปลงโปรแกรมประยุกต์ส่วนเพิ่มใหม่ของ RDO2 ส่วนใหญ่ เช่น แบบจำลองโปรแกรมแบบ event ไม่สามารถใช้ ODBC Direct เพราะคำสั่งเข้าได้กับ DAO แต่พื้นฐานคล้ายกับ RDO คือ ODBC Direct เป็นการประยุกต์ 32 บิต 

OLE DB 

OLE DB เป็นเทคโนโลยีการเข้าถึงข้อมูลระดับล่างที่ Microsoft ผู้พัฒนาให้เข้ามาแทนที่ ODBC ในฐานะวิธีการหลักในการติดต่อกับฐานข้อมูล ส่วนของ OLE DB ที่เทียบได้กับไดร์ฟเวอร์ของ ODBC คือ OLE DB provider ซึ่งทำงานเป็นสะพานระหว่างโปรแกรมประยุกต์กับฐานข้อมูล OLE DB เป็นเทคโนโลยีที่ใหม่ แต่ OLE DB provider พบได้ในฐานข้อมูลจำนวนมาก ถึงแม้ว่า ODBC และ OLE DB มีความคล้ายคลึงกัน แต่มีข้อแตกต่างกัน คือ OLE DB มีพื้นฐานจาก COM ซึ่งเป็นสถาปัตยกรรมที่ให้การย้ายปริมาณข้อมูลจำนวนมากผ่านเครือข่าย ประการต่อมา OLE DB ให้ตัวเองทำหน้าที่ในการติดต่อกับแหล่งข้อมูล ไม่เหมือนกับไดร์ฟเวอร์ ODBC ที่เป็นความสัมพันธ์กับฐานข้อมูล หรือ ISAM ( Indexed sequential access mode)
OLE DB เป็นยุทธศาสตร์ Microsoft’s Universal Data Access ซึ่งเป็นการให้ผู้ใช้อ่านและประมวลข้อมูลโดยไม่ต้องแปลง และนำเข้ามายังฐานข้อมูลแบบแผน การใช้ OLE DB provider ทำให้ผู้ใช้สามารถประมวลข้อมูลใน e-mail, message, HTML, กระดาษทำการและเอกสารข้อความ และแหล่งข้อมูลภายนอก Visual Basic 6 มี provider ของ Microsoft Jet, SOL Server, FoxPro, ไฟล์ข้อความและฐานข้อมูล Oracle สำหรับ OLE DB provider อื่น ๆ สามารถดาวน์โหลดจากเว็บของ Microsoft 

การส่งผ่านระหว่าง ODBC กับ OLE DB เป็นการใช้ OLE DB provider เฉพาะชื่อ MSDASQL ที่รู้จักในชื่อ Kagera ที่ทำหน้าที่เป็นสะพานเชื่อมกับแหล่งต่าง ๆ ของ ODBC แทนที่การติดต่อโดยตรงกับฐานข้อมูล ผู้ใช้สามารถใช้ provider พิเศษในการติดต่อกับไดร์ฟเวอร์ของ ODBC ซึ่งอ่านและเขียนข้อมูลในฐานข้อมูล การใช้เลเยอร์ส่วนเพิ่มนี้มีผลต่อสมรรถนะแต่น่าจะเป็นปัญหาในระยะสั้น 

ADO 

ADO หรือ ActiveX Data Object เป็นการติดต่อระดับสูงของ OLE DB มีบทบาทใกล้เคียง RDO ในทำงานกับ API ของ ODBC ในขณะที่ OLE DB คล้ายกับ API ของ ODBC ที่เป็นการติดต่อระดับล่างที่ไม่สามารถเข้าถึงได้ง่ายจากภาษาระดับสูง เช่น Visual Basic เป็นต้น ADO สร้างบน OLE DB เพื่อให้การทำงานที่ไม่ให้ติดต่อโดยตรง ODBC หรือทำให้ผู้ใช้เขียนคำสั่งที่มีความสามารถ ADO สามารถเปรียบเทียบความสามารถกับ ADO คือทั้งคู่สามารถสร้างคิวรี่แบบ asynchronous และการติดต่อ ADO เพิ่มส่วนใหญ่จำนวนมาก เช่น file-based และ stand-alone Recordset, hierarchical Recordset และอื่น ๆ 

ส่วนสำคัญของ ADO คือส่วนขยาย แทนที่จะซับซ้อนและลำดับชั้นของอ๊อบเจคที่แข็งตัว ซึ่ง DAO และ RDO เป็นอยู่ ADO ประกอบด้วยอ๊อบเจคจำนวนน้อยที่สามารถรวมได้ในหลายวิธีส่วนใหญ่สามารถเพิ่ม ADO ในรูปแบบพิเศษ ของ OLE DB provider เช่น Data Shape provider ซึ่งเสนออ๊อบเจค hierarchical Recordset ไปให้ provider อื่น ๆ Microsoft กำลังสร้างส่วนใหม่ให้ ADO ในรูปแบบพิเศษของไลบรารีแบบแยกที่เชื่อมแบบ dynamic ไปยังแกนไลบรารีรี่ของ ADO เช่น ไลบรารี ADO 2.1 ได้สนับสนุน Data Definition Language และความปลอดภัย (ในการสร้าง table ของฐานข้อมูล, ผู้ใช้ และกลุ่มของผู้ใช้), Jet replica และ Recordset แบบหลายมิติ เพราะตรงข้ามกับ DAO และ RDO ซึ่งจะฝัง DLL ขนาดใหญ่ในทุกส่วน 

ส่วนพิเศษของ ADO ที่ผู้ใช้สามารถใช้ภายในเพ็จ HTML ใน browser เช่น Internet explorer หรือด้านแม่ข่ายด้วย Active Server Page บน Internet information Server ระบบย่อยของ ADO ระบบหนึ่งชื่อ Remote Data Service ให้ผู้ใช้ส่งกลุ่มของเรคคอร์ดไปยัง browser ของลูกข่าย หรือ component ของ active COM บนอินเตอร์เน็ต 

Drag and Drop

หัวข้อพิเศษไอที, VB 6.0 No Comments »

Visual Basic มีความสามารถ drag-and-drop ตั้งแต่เวอร์ชันแรก ๆ แต่ใน Visual Basic 5 ได้เพิ่มกลุ่มของคุณสมบัติ, เมธอด และ event ที่ใช้พัฒนาเครื่องมือสำหรับ OLE มาตรฐานและการ drag-and-drop ข้ามโปรแกรมประยุกต์ 

Automatic Drag-and-Drop 

โดยพื้นฐาน ตัว control สามารถทำงานเป็นต้นทางหรือปลายทางของการ drag-and-drop และมีการทำงานเป็น 2 โหมด คือ automatic หรือ manual ในโหมด automatic การตั้งค่าคุณสมบัติในการออกแบบหรือเรียกใช้และให้ Visual Basic ทำทุกอย่างให้ส่วนโหมด manual เป็นการตอบสนอง event ที่เกิดขึ้นขณะที่มีการ drag ซึ่งทำให้มีการควบคุมกระบวนการที่ดีกว่า 

ถ้าตัว control สนับสนุนการ drag-and-drop แบบอัตโนมัติ ให้ตั้งค่าคุณสมบัติ OLEDragMode หรือ OLEDropMode (หรือทั้ง 2 ค่า) เป็น vbAutomatic เช่น ถ้าต้องการให้โปรแกรมสนับสนุนการ drag-and-drop ข้อความ RTF ให้วาง Rich Text box บนฟอร์ม และตั้งค่าคุณสมบัติ OLEDragMode และ OLEDropMode เป็น vbAutomatic จะทำให้สามารถ drag ข้อความไปที่หรือมาจาก Microsoft Word, WordPad หรือโปรแกรมประมวลผลคำต่าง ๆ ได้ และสามารถ drag-and-drop กับ Rich text box อื่นรวมถึง Text box และ Mask ed box 

Manual Drag-and-Drop 

การ drag-and-drop แบบจัดการเองหรือ manual ต้องการคำสั่งใน event procedure สำหรับ event ต่าง ๆ ที่เกิดขึ้น ทั้งตัว control ต้นทางและปลายทางตามรูป ได้สรุปการเกิด event ของการ drag-and-drop
ตามโปรแกรมตัวอย่างที่ ประกอบด้วย Rich text box ซึ่งทำหน้าที่เป็นต้นทางหรือปลายทางของการ drag-and-drop บนฟอร์มมี List box ที่สามารถวางข้อความได้ ทั้งจาก Rich text box หรือแหล่งอื่น ๆ ถ้ามีการวางข้อความใน List box จะมีการตรวจข้อความ ค้นหาคำที่ไม่ซ้ำ เรียงลำดับ และแสดงผลให้ผู้ใช้โดย List box 

Initiated การทำงาน Drag-and-Drop 

การทำให้ตัว control สามารถ Initiate การทำงานดังกล่าวต้องตั้งค่าคุณสมบัติ OLEDragMode เป็น vbManual และเริ่มกระบวนการโดยการกระตุ้นเมธอด OLEDrag ซึ่งมักจะใช้ MouseDown event 

Private Sub rtfText_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
   ’ เริ่มต้นการ drag ถ้ามีการกดเมาส์ปุ่มชวา
   If Button = 2 Then rtfText.OLEDrag
End Sub 

เมื่อการ drag จากเมธอด OLEDrag จะเกิด OLEStartDrag event ที่ตัว control ต้นทาง ซึ่ง event นี้จะรับอ๊อบเจค DataObject และพารามิเตอร์ AllowedEffects โดยการเก็บข้อมูลในอ๊อบเจคใช้เมธอด SetData 

Private Sub rtfText_OLEStartDrag(Data As RichTextLib.DataObject, AllowedEffects As Long)
   ’ ใช้การเลือกข้อความหรือข้อความทั้งหมดถ้าไม่มีการเลือก
   If chkLoadOnDemand Then
      ’ แจ้งถึงรูปแบบที่ตัว control สนับสนุน
      Data.SetData , vbCFRTF
      Data.SetData , vbCFText
   ElseIf rtfText.SelLength Then
      Data.SetData rtfText.SelRTF, vbCFRTF
      Data.SetData rtfText.SelText, vbCFText
   Else
      Data.SetData rtfText.TextRTF, vbCFRTF
      Data.SetData rtfText.text, vbCFText
   End If
   AllowedEffects = vbDropEffectMove Or vbDropEffectCopy
End Sub 

ควรกำหนดค่าให้พารามิเตอร์ AllwedEffects เพื่อระบุผลที่ต้องการให้สนับสนุน การทำงาน drag-and-drop โดยตั้งค่าเป็น 1-vbDropEffectCopy หรือ 2-vbDropEffectMove หรือ รวมทั้งหมดถ้าต้องการสนับสนุนผลทั้งสองแบบ 

เตรียมการ Drop ตัว Control ต้นทาง 

ระหว่างการ drag ดำเนินอยู่ Visual Basic จะเกิด OLEDragOver สำหรับตัว control ที่เมาส์อยู่บนตัว control นั้น event นี้รับอ๊อบเจค DataObject และค่า Effect ที่ตั้งโดยตัว control ต้นทาง และสารสนเทศ ตำแหน่งเมาส์และสถานของปุ่ม 

Private Sub lstWords_OLEDragOver(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single, State As Integer)
   ’ เลือก copy ถ้าทำได้ กรณีอื่นเลือก move
   If Not Data.GetFormat(vbCFText) Then
      ’ source ตัว control ต้นทางไม่ส่งออกเป็นรูปแบบ text
      Effect = 0
   ElseIf Effect And vbDropEffectCopy Then
      Effect = vbDropEffectCopy
   ElseIf Effect And vbDropEffectMove Then
      Effect = vbDropEffectMove
   End If
   ’ เปลี่ยนพื้นหลังของ list box เมื่อเมาส์อยู่เหนือ list box
   If State = vbLeave Then
      ’ เปลี่ยนกลับเมื่อเมาส์ออกไปแล้ว
      lstWords.BackColor = vbWindowBackground
   ElseIf Effect 0 And State = vbEnter Then
      ’ เปลี่ยนสีพื้นหลังเมื่อ entry
      lstWords.BackColor = vbYellow
   End If
End Sub 

event ที่เกิดต่อจาก OLEDragOver event สำหรับตัว control ต้นทางคือ OLEGiveFeedBack event ซึ่ง event ที่ตัว control ต้นทาง จะรับรู้การเลือก Effect จากตัว control ปลายทางและเปลี่ยนเคอร์เซอร์ของเมาส์ 

Private Sub lstWords_OLEGiveFeedback(Effect As Long, DefaultCursors As Boolean)
   If Effect = vbDropEffectCopy Then
      DefaultCursors = False
      Screen.MousePointer = vbCustom
      Screen.MouseIcon = imgCopy.Picture
   Else
      DefaultCursors = True
   End If
End Sub 

พารามิเตอร์ DefaultCursors ควรตั้งค่าเป็น False 

การวางข้อมูล 

เมื่อผู้ใช้ปล่อยปุ่มเมาส์ เหนือตัว control ปลายทาง Visual Basic จะให้เกิด OLEDragDrop event สำหรับตัว control ปลายทาง Event นี้จะรับพารามิเตอร์เหมือนกับ OLEDragOver event 

Private Sub lstWords_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single)
   ’ เปลี่ยนกลับสีพื้นหลังที่ถูกต้อง
   lstWords.BackColor = vbWindowBackground
   ’ เลือก copy ถ้าทำได้ กรณีอื่นเลือก move
   If Effect And vbDropEffectCopy Then
      Effect = vbDropEffectCopy
   ElseIf Effect And vbDropEffectMove Then
      Effect = vbDropEffectMove
   End If
   ’ ขอข้อมูล - เฉพาะการสนับสนุน plain text
   Dim text As String, w As Variant
   text = Data.GetData(vbCFText)
   ’ เพิ่มช่องว่างท้ายคำเพื่อทำให้มั่นใจว่าคำสุดท้ายได้รับการแยกอย่างถูกต้อง
   text = text & ” “ 

‘ กระจายข้อความและแยกแต่ละคำ
Dim i As Long, start As Long, words As New Collection
On Error Resume Next 

   For i = 1 To Len(text)
      If Mid$(text, i, 1) Like “[!A-Za-z0-9]” Then
         If start Then
            ’ เพิ่มคำใน collection แต่ไม่สนใจคำซ้ำ
            w = Mid$(text, start, i - start)
            words.Add w, w
            start = 0
         End If
      ElseIf start = 0 Then
         ’ ถ้าพบคำใหม่
         start = i
      End If
   Next 

   ’ เพิ่มคำทั้งหมดใน list box
   lstWords.Clear
   For Each w In words
      lstWords.AddItem w
   Next
End Sub 

เมื่อ OLEDragDropevent ได้รับการประมวล Visual Basic จะให้ตัว control ต้นทางเกิด OLECompleteDrag event 

Private Sub rtfText_OLECompleteDrag(Effect As Long)
   If Effect = vbDropEffectMove Then
      ’ การ move ลบข้อความที่ไฮไลต์
      rtfText.SelText = “”
   Else
      ’ การ copy ยกเลิกการเลือก clear the selection
      rtfText.SelLength = 0
   End If
End Sub 

การโหลดข้อมูลตามคำสั่ง 

ถ้าตัว control ต้นทางสนับสนุนข้อมูลหลายรูปแบบ การโหลดข้อมูลไปที่อ๊อบเจค Data ใน OLEStartDrag ไม่ใช่วิธีการที่มีประสิทธิภาพ แต่ Visual Basic สนับสนุนวิธีการอื่น โดยใช้ OLESetData event และเปลี่ยนจากการโหลดข้อมูลให้อ๊อบเจค DataObject เมื่อมีการ drag เป็นการระบุรูปแบบที่สนับสนุน 

Private Sub rtfText_OLEStartDrag(Data As RichTextLib.DataObject, AllowedEffects As Long)
   ’ ใช้การเลือกข้อความหรือข้อความทั้งหมดถ้าไม่มีการเลือก
   If chkLoadOnDemand Then
      ’ แจ้งถึงรูปแบบที่ตัว control สนับสนุน
      Data.SetData , vbCFRTF
      Data.SetData , vbCFText
   ElseIf rtfText.SelLength Then
      Data.SetData rtfText.SelRTF, vbCFRTF
      Data.SetData rtfText.SelText, vbCFText
   Else
      Data.SetData rtfText.TextRTF, vbCFRTF
      Data.SetData rtfText.text, vbCFText
   End If
   AllowedEffects = vbDropEffectMove Or vbDropEffectCopy
End Sub 

ถ้าต้องการ drag-and-drop ไม่ได้ถูกยกเลิก ตัว control ปลายทางจะให้เมธอด GetData รับข้อมูลตามรูปแบบที่กำหนด Visual Basic จะทำให้เกิด OLESetData event สำหรับตัว control ต้นทาง 

Private Sub rtfText_OLESetData(Data As RichTextLib.DataObject, DataFormat As Integer)
   ’ event นี้เกิดเฉพาะถ้า chkLoadOnDemand ได้รับการเลือก when
   ’ เมื่อตัว control เป้าหมายใช้ the Data’s GetData method
   If DataFormat = vbCFText Then
      If rtfText.SelLength Then
         Data.SetData rtfText.SelText, vbCFText
      Else
         Data.SetData rtfText.text, vbCFText
      End If
    ElseIf DataFormat = vbCFRTF Then
      If rtfText.SelLength Then
         Data.SetData rtfText.SelRTF, vbCFRTF
      Else
         Data.SetData rtfText.TextRTF, vbCFRTF
      End If
   End If 

End Sub 

MDI Forms

หัวข้อพิเศษไอที, VB 6.0 No Comments »

MDI ย่อมาจาก Multiple Document Interface และเป็นการอินเตอร์เฟซกับผู้ใช้ที่มีการใช้ในโปรแกรมประยุกต์ ในชุด Microsoft Office โปรแกรมประยุกต์จำนวนมากได้ใช้การอินเตอร์เฟซแบบ MDI ถ้าโปรแกรมประยุกต์ที่พัฒนาขึ้นมามีความเกี่ยวข้องกับเอกสารจำนวนมากในเวลาเดียวกัน การอินเตอร์เฟซ MDI จะเป็นการเลือกที่ดี 

โปรแกรมประยุกต์ MDI 

การสร้างโปรแกรมประยุกต์ MDI ทำได้ง่าย ในการเริ่มต้นให้เพิ่มโมดูล MDI Form เข้าไปยัง project ปัจจุบัน ซึ่งโมดูล MDI Form คล้ายกับโมดูลฟอร์มธรรมดา แต่มีข้อแตกต่างเล็กน้อย คือ 

  • โมดูล MDI Form มีเพียง 1 โมดูล ต่อ project 
  • ไม่สามารถวางตัว control ส่วนโดยตรงที่ MDI Form โดยให้สร้างเมนู ตัว control ที่มองไม่เห็น (เช่น timer และ Common Dialog) และตัว control ที่สนับสนุนคุณสมบัติ Align (เช่น Picture box, Tool bar และ Status bar) การแสดงตัว control อื่น ๆ บน MDI Form ให้วางในตัว control ประเภท container ตามปกติ คือ Picture box 
  • ไม่สามารถแสดงข้อความหรือกราฟฟิกบนผิว MDI Form 

MDI child forms 

อ๊อบเจค MDI Form จะเก็บฟอร์มลูก 1 ฟอร์ม หรือมากกว่า การสร้างฟอร์มลูกทำได้โดยการสร้างฟอร์มธรรมดาเข้าไปใน project และตั้งค่าคุณสมบัติ MDIChild เป็น True ไอคอนของฟอร์มใน Window ของ Project Explorer จะเปลี่ยน
ฟอร์มลูก MDI จะไม่แสดงภายนอกฟอร์มแม่ MDI Form ถ้าฟอร์มลูก MDI เป็นฟอร์มเริ่มต้นสำหรับโปรแกรมประยุกต์ ฟอร์มแม่ MDI Form จะได้รับการโหลดโดยอัตโนมัติ และแสดงก่อนที่ฟอร์มลูกจะมองเห็น instance ของ ฟอร์มลูก MDI สร้างด้วยการใช้คีย์เวิร์ด New 

‘ ภายใน โมดูล MDI Form
Private Sub mnuFileNew_Click ( )
   Dim frmDoc As New frmDocument
   frmDoc.Show
End Sub 

 

โมดูล MDI Form สนับสนุนคุณสมบัติ AutoShowChildren ถ้าคุณสมบัตินี้เป็น True ฟอร์มลูกจะปรากฏขึ้นภายในฟอร์มแม่ตลอดเวลาที่มีการโหลดฟอร์มแม่ และไม่สามารถซ่อนได้ ถ้าไม่กำหนดคุณสมบัติเป็น False
ฟอร์มลูก MDI มีลักษณะพิเศษบางประการ เช่น ไม่แสดงแถบเมนู ถ้ามีการเพิ่มเมนูระดับสูงไปที่ฟอร์มฟอร์มลูก เมื่อฟอร์มแอ๊คทีฟ แถบเมนูจะไปแทนที่แถบเมนูของฟอร์มแม่ MDI Form การปรับปรุงเมนูทำได้เฉพาะโมดูล หลักของ MDI Form 

เมื่อคำสั่งเมนูเกี่ยวข้องในโมดูล MDI Form ให้ประยุกต์เข้าไปที่ฟอร์มลูกที่กำลังแอ๊คทีฟ โดยใช้คุณสมบัติ ActiveForm 

Private Sub mnuFileClose_Click ( )
   If Not (ActiveForm Is Nothing) Then Unload ActiveForm
End Sub 

คุณสมบัติ ActiveForm ต้องมีการตรวจอยู่เสมอ เพื่อทำให้ทราบถึงฟอร์มปัจจุบัน 

Private Sub mnuFilePrint_Click ( )
   If TypeOf ActiveForm Is frmDocument Then
      Printer.Print ActiveForm.txtText.Text
      Printer.EndDoc
   Else
      Printer.Print ActiveForm.picBitmap.Picture, 0, 0
      Printer.EndDoc
   End If
End Sub 

เมนู Window 

โมดูล MDI สนับสนุนเมธอด Arrange ซึ่งไม่มีในฟอร์มธรรมดา เมธอดนี้ช่วยในการจัดฟอร์มลูกใน MDI Form โดยสามารถจัดตามแนวนอนหรือแนวตั้ง การจัดแบบ cascading หรือฟอร์ม minimized ให้เรียงลำดับที่ด้านล่างของฟอร์มแม่ MDI Form 

Private Sub mnuWindowArrangeIcons_Click()
   Me.Arrange vbArrangeIcons
End Sub 

Private Sub mnuWindowCascade_Click()
   Me.Arrange vbCascade
End Sub 

Private Sub mnuWindowTileHorizontal_Click()
   Me.Arrange vbTileHorizontal
End Sub 

Private Sub mnuWindowTileVertical_Click()
   Me.Arrange vbTileVertical
End Sub 

Tip: การจัดเรียงด้วยเมธอด Arrange สามารถใช้ตัวเลือก WindowList ใน Menu Editor สำหรับเมนู window 

Polymorphic MDI Containers 

โปรแกรมประยุกต์ MDI ตามตัวอย่างได้กล่าวถึงฟังก์ชันอย่างสมบูรณ์ แต่ไม่ได้เป็นตัวอย่างที่ดี ในการออกแบบสำหรับ Object-Oriented programming ตามความจริง MDI Form ได้ทำลาย encapsulated ของฟอร์มลูก เพราะเข้าถึงคุณสมบัติของ txtEditor โดยตรง แต่สามารถปรับปรุงตามแนวคิด encapsulation ได้กำหนดการอินเตอร์เฟซระหว่างฟอร์มแม่กับลูก
ถ้าไม่ต้องการให้ฟอร์มแม่ MDI Form เข้าถึงฟอร์มลูกโดยตรง สามารถใช้การกำหนดอินเตอร์เฟซให้ติดต่อผ่านอีกฟอร์มหนึ่ง เช่น แทนที่การควบคุมการโหลดและบันทึกข้อความด้วยคุณสมบัติของ txtEditor แต่ให้ฟอร์มแม่ MDI Form ตามฟอร์มลูกในการโหลดหรือบันทึกไฟล์เช่นเดียวกับการตัด คัดลอก และวางข้อมูลด้วยตัว control ชื่อ txtEditor ให้ฟอร์มแม่ MDI Form ปลุกเมธอดในฟอร์มลูกให้ทำงาน ตามตัวอย่าง MDI Notepad ใช้คำสั่ง Save As บนไฟล์เมนูในฟอร์มแม่ MDI 

Private Sub mnuFileSaveAs_Click()
‘ ถาม document เพื่อแสดง common dialog แล้วบันทึกไฟล์ด้วยชื่อที่ผู้ใช้เลือก
On Error Resume Next
   ActiveForm.SaveFile ActiveForm.AskFilename(True)
End Sub 

การเปลี่ยนเครื่องมือฟอร์มลูกข่าย 

เมื่อมีการปรับปรุงให้ฟอร์มแม่ MDI ทำงานกับฟอร์มลูก MDI แบบ encapsulation ทำให้การเปลี่ยนเครื่องมือในฟอร์มลูกข่ายทำได้โดยอิสระ และไม่มีผลกับโปรแกรมประยุกต์ที่เหลือ เช่น การเปลี่ยนโปรแกรม MDI Notepad เป็นโปรแกรมประยุกต์ MDI Image viewer ในกรณีที่ฟอร์มลูก MDI มี picture box และปรับปรุงเครื่องมือของคุณสมบัติและเมธอดทั้งของการอินเตอร์เฟชระหว่างการสื่อสารระหว่างแม่กับลูก เช่น เมธอด PrintDoc ได้เปลี่ยนเป็น 

Sub PrintDoc()
   Printer.NewPage
   Printer.PaintPicture picBitmap.Picture, 0, 0
   Printer.EndDoc
End Sub 

การปรับปรุงจากโปรแกรมประยุกต์ MDI Document เป็นโปรแกรมประยุกต์ MDI Image viewer เป็นการเปลี่ยนคำสั่งไม่กี่บรรทัด และไม่จำเป็นต้องแก้ไขคำสั่งในโมดูล frmMain ซึ่งเป็นการฟอร์มแบบใช้ใหม่ได้ของฟอร์มแม่ MDI แบบ Polymorphic การปรับปรุงฟอร์มลูก สามารถประยุกต์เป็น container ในการทำงานที่แตกต่างกันได้ 

Application Wizard 

Application Wizard เป็นเครื่องมือในการสร้างฟอร์ม และส่วนประกอบต่าง ๆ ของ Visual Basic มีการแนะนำตั้งแต่ Visual Basic 5 สำหรับการสร้างฟอร์มต่าง ๆ เช่น ฟอร์ม Login ใน Visual Basic 6 ได้เพิ่มการทำงานที่กว้างขวางและการใช้ Toolbar Wizard และ Form Wizard ที่กว้างขวาง
การสร้าง Project ด้วย Application wizard มีขั้นตอน คือ 

1. ที่เมนู File เลือกคำสั่ง New Project 

2. บนหน้าจอจะแสดงไดอะล๊อกบ๊อกซ์ Add Project ให้เลือกไอคอน VB Application Wizard แล้วคลิก OK 

3. บนหน้าจอจะเป็น Wizard ขั้นตอนที่ 1 เป็นการเลือกข้อมูลเดิมถ้ามีการเก็บอยู่ใน Profile แล้วคลิก Next เพื่อไปขั้นตอนต่อไป 

4. Wizard ขั้นตอนที่ 2 เป็นการเลือกประเภทของฟอร์ม และตั้งชื่อ Project คลิก Next เพื่อไปขั้นตอนต่อไป 

5. Wizard ขั้นตอนที่ 3 เป็นการเลือกสร้าง เมนูและเมนูย่อย แล้วคลิก Next เพื่อไปขั้นตอนต่อไป 

6. Wizard ขั้นตอนที่ 4 เป็นการเลือกสร้างแถบเครื่องมือ แล้วคลิก Next เพื่อไปขั้นตอนต่อไป 

7. Wizard ขั้นตอนที่ 5 เป็นการเลือกนำเข้าไฟล์ Resource เข้ามาใช้ในโปรแกรมประยุกต์ ถ้าต้องการให้คลิกที่ปุ่มตัวเลือก Yes แล้วคลิก Next เพื่อไปขั้นตอนต่อไป 

8. Wizard ขั้นตอนที่ 6 เป็นการกำหนดการใช้ Browser สำหรับการใช้อินเตอร์เน็ตในโปรแกรม แล้วคลิก Next เพื่อไปขั้นตอนต่อไป 

9. Wizard ขั้นตอนที่ 7 เป็นการเลือกฟอร์มมาตรฐานที่มีให้เข้ามาใช้ในโปรแกรม แล้วคลิก Next เพื่อไปขั้นตอนต่อไป 

10. Wizard ขั้นตอนที่ 8 สำหรับการประยุกต์ฐานข้อมูล ถ้าไม่มีฟอร์มที่ติดต่อกับฐานข้อมูลสามารถใช้ Wizard นี้ โดยคลิกที่ปุ่ม Create New Form ซึ่งจะพบ Wizard ของ Data Form Wizard แล้วคลิก Next เพื่อไปขั้นตอนต่อไป 

11. Wizard ขั้นตอนที่ 9 การสร้าง Project เสร็จเรียบร้อย ถ้าต้องการเก็บข้อมูลเป็น profile ไว้ให้ตั้งชื่อ แล้วคลิก Finish ยืนยันเสร็จสิ้นการสร้าง 

12. เมื่อเปิดดู Project จะพบฟอร์มต่างที่เลือกพร้อมส่วนการทำงานต่างๆ เช่น ตามตัวอย่าง เลือกประเภทฟอร์ม เป็น MDI เลือกไฟล์มาตรฐาน About

SS Tab

หัวข้อพิเศษไอที, VB 6.0 No Comments »

SS tab เป็นตัว control ที่ยอมให้สร้างไดอะล๊อกบ๊อกซ์ Tab ซึ่งเกือบเหมือนกับ Tab strip แต่มีความแตกต่างที่สำคัญระหว่างตัว control นี้ คือ SS tab เป็น container ทำให้สามารถวางตัว control ลูกได้โดยตรงบนผิว และสามารถเปลี่ยนหน้า Tab ระหว่างการออกแบบ ทำให้งานที่เตรียมตัว control มีความง่ายและสะดวกมากกว่า Tab strip การทำงานกับ SS tab ทำได้ง่ายเพราะตัว control ไม่เก็บอ๊อบเจคที่ขึ้นต่อ และไวยากรณ์ของคุณสมบัติและ event ตรงไปตรงมา 

SS tab อยู่ในไฟล์ TABCTL32.OCX ซึ่งต้องกระจายไปกับโปรแกรมประยุกต์ที่ใช้ตัว control นี้ และต้องมีการโหลดเข้ามา โดยเลือก Microsoft Tabbed Dialog Control 6.0 จากรายการในไดอะล๊อกบ๊อกซ์ Component ส่วน tool บน Toolbox คือ 

การตั้งค่าคุณสมบัติเมื่อออกแบบ 

เมื่อมีการวางตัว control ลงบนฟอร์มแล้ว ที่แท็บ General คุณสมบัติ Style เป็นคุณสมบัติแรกที่ควรเปลี่ยนจากค่าเริ่มต้น 0-ssStyleTabbedDialog เป็นรูปที่ทันสมัยกว่าด้วยค่า 1-ssStylePropertyPage แต่จะไม่สามารถเปลี่ยนค่าเริ่มต้นได้ ถ้าตั้งค่าคุณสมบัติ TabOrientation 

การเพิ่มหรือลบหน้าแท็บใช้การเปลี่ยนค่าในฟิลด์ TabCount และสร้างแถวแท็บเป็นแบบหลายแถว ด้วยการตั้งค่าที่เหมาะสมสำหรับคุณสมบัติ TabsPerRow การย้ายระหว่างแท็บ สามารถใช้ปุ่ม spin และปรับปรุงคุณสมบัติ Caption (คุณสมบัติจะแสดงฟิลด์ เฉพาะแท็บปัจจุบัน) และสามารถใช้ตัวอักษร & เพื่อกำหนดเป็น hot key
คุณสมบัติ TabHeight เป็นความสูงในหน่วย twips ของแท็บทั้งหมดในตัว control คุณสมบัติ TabMaxWidth มีความกว้างมากที่สุด คุณสมบัติ WordWrap ควรตั้งเป็น True เพื่อล้อม caption ถ้าคุณสมบัติ ShowFocusRect เป็น True โฟกัสรูปสี่เหลี่ยมจะปรากฏบนแท็บที่ได้รับโฟกัส
ที่แท็บ Picture สามารถกำหนดภาพขนาดเล็กด้วยการคลิกบนคุณสมบัติ Picture ที่ซ้ายสุดของ List box และเลือกบิตแม็บหรือไอคอนที่ต้องการกำหนดให้กับแท็บปัจจุบัน ภาพที่ใช้สามารถอ้างถึงในคำสั่งด้วยคุณสมบัติ TabPicture 

ข้อควรระวัง: ตัว control ที่วางลงไปทั้งหมดอยู่ใน container เดียวของ SS tab ไม่ขึ้นกับหน้าแท็บ ทำให้ตัว control เช่น Option button ถ้ามี 2 กลุ่มในหน้าแท็บที่ต่างกับ 2 หน้า ควรวางแต่ละกลุ่มให้อยู่คนละ frame หรือคนละ container 

การทำงานเมื่อเรียกใช้ 

คุณสมบัติหลักของ SS tab คือแท็บซึ่งส่งค่าดัชนีของแท็บปัจจุบันที่เลือกโดยผู้ใช้ ซึ่งสามารถตั้งค่าเพื่อเปลี่ยนไปแท็บอื่นโดยใช้คำสั่ง โดยแท็บแรกที่ค่าดัชนีที่เป็น 0 

การเปลี่ยนคุณลักษณะของแท็บ 

การเปลี่ยนคุณลักษณะของแท็บไม่จำเป็นต้องทำที่แท็บปัจจุบันเพราะคุณสมบัติ ที่ต้องการ คือ ดัชนี 

SSTab1.TabCaption(0) = “เข้าสู่ระบบ”
picFile = (”C:\ Microsoft Visual Studio\Common\Graphics\Bitmaps\Asserted\ballon.bmp”
SSTab1.TabPicture(1) = LoadPicture(picFile)
SSTab1.TabVisible(2) = False 

คุณสมบัติ Tabs ส่งออกจำนวนของแท็บที่มีอยู่ 

‘ ไม่ให้ใช้แท็บทั้งหมดยกเว้นแท็บปัจจุบัน
For i = 0 to SSTab1.Tabs -1
SSTab1.TabEnabled (i) = (I = SSTab1.Tab}
Next 

การสร้างแท็บใหม่ 

การสร้างแท็บใหม่ เมื่อเวลาเรียกใช้สร้างด้วยการเพิ่มค่าของคุณสมบัติ Tabs และสามารถต่อแท็บใหม่ในที่เฉพาะได้ 

SSTab1.Tabs = SSTab1.Tabs+1
SSTab1.TabCaption (SSTab1.Tabs-1) = “รายงานสรุป” 

การเพิ่มตัว control ให้กับแท็บที่สร้างใหม่ สามารถทำด้วยการสร้างตัว control แบบ dynamic แล้วเปลี่ยนคุณสมบัติ Container 

Dim txt As TextBox
Set txt = Controls.Add (”VB.Text Box”, “txt”)
SSTab1.Tab = SSTab1.Tab -1
txt.Move 400, 800, 1200, 350
txt.Visible = True 

Rich Text Box

หัวข้อพิเศษไอที, VB 6.0 No Comments »

Rich text box เป็นตัว control ที่มีความสามารถสูงของ Visual Basic ลักษณะภาย Rich text box เป็น Text box ที่แสดงข้อความในรูปแบบ Rich text format (RTF) ซึ่งเป็นรูปแบบมาตรฐานที่โปรแกรมประมวลคำรวมถึง Microsoft Word Pad รู้จัก ตัว control ที่สนับสนุน multiple font และสี มาร์จิน ซ้ายและขวาเป็นต้น
Rich text box มีคำสั่งที่สอดคล้องกับ Text box แบบหลายบรรทัด ทำให้สามารถนำคำสั่งที่ใช้กับ Text box มาใช้ Rich text box ได้ แต่ Rich text box ไม่มีจำกัดในด้านจำนวนบรรทัดที่สามารถเก็บได้ 

Rich text box อยู่ในไฟล์ RICHTX32.OCX ที่ต้องกระจายไปกับโปรแกรมที่ใช้ตัว control นี้ และต้องมีการโหลดเข้ามา โดยเลือก Microsoft Rich Textbox Control 6.0 จากรายการในไดอะล๊อกบ๊อกซ์ Component ส่วน tool บน Toolbox 

การตั้งค่าคุณสมบัติเมื่อออกแบบ 

การตั้งค่าคุณสมบัติที่ใช้งานแท็บ General ของไดอะล๊อกบ๊อกซ์ Property Pages ได้แก่ การกำหนดชื่อไฟล์ TXT หรือ RTF ที่ต้องการโหลดในคุณสมบัติ FileName คุณสมบัติ RightMargin เสนอระหว่างห่างเป็น twips ของมาร์จินด้านขวาจากขอบด้ายซ้ายของตัว control คุณสมบัติ BalletIndent เป็นจำนวน twips ของการย่อหน้าเมื่อคุณสมบัติ SetBullet เป็นจริง คุณสมบัติ AutoVerbMenu ใช้สำหรับป้องกันแก้ไขของเมนู pop-up จากการคลิกเมาส์ปุ่มขวา ถ้าต้องการใช้เมนู pop-up ให้ตั้งค่าคุณสมบัตินี้เป็น False และคุณสมบัติทั้งหมดในแท็บ General โดย Text box 

Rich Text box เป็นตัว control แบบ data-aware ดังนั้น จึงมีคุณสมบัติ DataXXXX เพื่อใช้ในการรวมตัว control กับแหล่งข้อมูล 

การทำงานเมื่อเรียกใช้ 

Rich text box มีหลายคุณสมบัติ และเมธอดที่สามารถจัดแบ่งเป็นกลุ่มการทำงานได้ 

การโหลดและบันทึกไฟล์ 

การโหลดไฟล์ข้อความไปยังตัว control ใช้เมธอด LoadFile และ อากิวเมนต์ระบุรูปแบบโดยไฟล์ RTF (0-rtfRTF และเป็นค่าเริ่มต้น) หรือ TXT (1-rtfText) 

RichTextBox1.LoadFile “C:\Docs\tryMe.rtf”, rtfRTF 

ชื่อไฟล์เมื่อได้รับการโหลดแล้ว จะปรากฏในคุณสมบัติ FileName การโหลดไฟล์อาจจะใช้วิธีทางอ้อมโดยการกำหนดชื่อให้คุณสมบัติ FileName แต่ไม่สามารถระบุรูปแบบ 

การบันทึกไฟล์ปัจจุบันในตัว control สามารถใช้เมธอด SaveFile ในไวยากรณ์ แบบนี้ได้ 

RichTextBox1.SaveFile RichTextBox1.FileName, rtfRTF 

ถ้าต้องการเพิ่มข้อมูลในตัว control ให้กับไฟล์ที่มีอยู่หรือเก็บข้อมูลเพิ่มในไฟล์เดิม สามารถใช้คุณสมบัติ TextRTF 

‘ สมมติให้ Rich text box ทั้งสองอยู่ในไฟล์เดียวกัน
Dim tmp As Variant
Open “c:\test.rtf” For Binary As #1 

‘ ใช้ตัวแปรสำหรับความสะดวกในการทำงาน
tmp = RichTextBox1.TextRTF: Put #1, , tmp
tmp = RichTextBox2.TextRTF: Put #1, , tmp
Close #1 

‘ อ่านข้อมูลกลับยังตัว control
Open “c:\test.rtf” For Binary As #1
Get #1, , tmp: RichTextBox1.TextRTF = tmp
Get #1, , tmp: RichTextBox2.TextRTF = tmp
Close #1 

การเปลี่ยนคุณลักษณะตัวอักษร 

Rich text box มีหลายคุณสมบัติที่มีผลต่อคุณลักษณะของตัวอักษรในข้อความที่เลือก ได้แก่ SelFontName, SelFontSize, SelColor, SelBold, SelItalic, SelUnderline และ SelStrikeThru และตัว control ที่มีคุณสมบัติ FontXXXX แต่คุณสมบัตินี้มีผลเฉพาะคุณลักษณะของเมื่อโหลดตัว control 

‘ การเปลี่ยน ชื่อและขนาดฟอนต์
RichTextBox1.SelStart = 0
RichTextBox1.SelLength = Len(RichTextBox1.Text)
RichTextBox1.SelFontName = “Microsoft Sans Serif”
RichTextBox1.SelFontSize = 12
‘ การยกเลิกการเลือก
RichTextBox1.SelLength = 0 

เมื่อมีการอ่านค่าด้วยคุณสมบัติ SelXXXX จะเห็นว่ามีการส่งค่าคุณลักษณะของข้อความที่เลือกแต่สามารถส่งค่าเป็น Null ถ้าตัวอักษรมีคุณลักษณะที่ต่างกัน 

Private Sub cmdToggleBold_Click()
   If IsNull(RichTextBox1.SelBold) Then
      RichTextBox1.SelBold = True
   Else
      RichTextBox1.SelBold = Not RichTextBox1.SelBold
   End If
End Sub 

ปัญหานี้มีผลกับการใช้แถบเครื่องมือ ซึ่งต้องใช้คุณสมบัติ MixedState ในอ๊อบเจคแถบเครื่องมือ 

‘ rtfText As RichTextBox, fMainForm As Form, tbToolBar As ToolBar
Private Sub rtfText_SelChange() 

   If IsNull(rtfText.SelBold) Then
      fMainForm.tbToolBar.Buttons(”Bold”).MixedState = True
   Else
      fMainForm.tbToolBar.Buttons(”Bold”).MixedState = False
      fMainForm.tbToolBar.Buttons(”Bold”).Value = IIf(rtfText.SelBold, tbrPressed, tbrUnpressed)
   End If 

   ’ คำสั่งอื่นๆ
End Sub 

คุณสมบัติ SelProtect ใช้ป้องกันข้อความที่เลือกจากการแก้ไข แต่ถ้าไม่ต้องการให้มีการแก้ไขทั้งเอกสารหรือทั้งไฟล์ ให้ตั้งค่าคุณสมบัติ Locked เป็น True 

การเปลี่ยนคุณลักษณะการย่อหน้า 

การควบคุมรูปแบบการย่อหน้า ทั้งหมดทำได้ในการเลือกปัจจุบัน โดยคุณสมบัติ SelIndent และ SelHangingIndent ทำงานด้วยกับในการกำหนดการย่อหน้าซ้ายของบรรทัดแรก และบรรทัดที่ตามมาของย่อหน้า ซึ่งมีวิธีการทำงานคือ คุณสมบัติ SelIndent กำหนดย่อหน้าของบรรทัดแรก ส่วนคุณสมบัติ SelHangingIndent กำหนดการย่อหน้าของบรรทัดต่อมาโดยสัมพันธ์กับบรรทัดแรก เช่น การย่อหน้าทั้งหมดเป็น 400 twips และบรรทัดแรกเพิ่มขึ้นอีก 200 twips 

RichTextBox1.SelIndent = 600
RichTextBox1.SelHangingIndent = -200 

คุณสมบัติ SelRightIndent เป็นระยะห่างย่อหน้าจากมาร์จินทางขวา หรือตำแหน่งขึ้นกับคุณสมบัติ RightMargin เช่น กำหนดมาร์จินทางขวาไว้ 300 twips และตั้งค่าการย่อหน้าขวาของย่อหน้า ที่ 100 twips 

RichTextBox.RightMargin = RichTextBox.Width - 300
RichTextBox.SelRightIndent = 100 

การจัดแนวของย่อหน้าใช้คุณสมบัติ SelAlignment ส่งออกค่าว่างถ้ามีการจัดแนวหลายแบบ ส่วนคุณสมบัติ SelCharOffset ใช้สำหรับการสร้างข้อความ superscript (ตัวยก) และ subscript (ตัวห้อย) โดยใช้ค่าบวกกับ superscript และค่าลบกับ subscript และศูนย์สำหรับการฟื้นฟูข้อความปกติ และใน Rich text box ไม่มีการจัดระยะอัตโนมัติ 

‘ ทำการเลือกข้อความ superscript
RichTextBox1.SelCharOffset = 40
‘ ลดขนาดตัวอักษร
RichTextBox1.SelFontSize = RichTextBox1.SelFontSize \ 2 

คุณสมบัติ SelBullet เป็นค่า Boolean สำหรับการตั้งค่าในการเปลี่ยนการย่อหน้าธรรมดา เป็นการย่อหน้าด้วยสัญลักษณ์ SelBullet ส่งออกค่าคุณลักษณะของย่อหน้าที่เลือกหรือค่าว่างถ้าการย่อหน้าที่หลายคุณลักษณะ 

Private Sub cmdToggleBullet_Click()
   If IsNull(RichTextBox1.SelBold) Then
      RichTextBox1.SelBullet = True
   Else
      RichTextBox1.SelBullet = Not RichTextBox1.SelBullet
   End If
End Sub 

การจัดการแท็บ 

Rich text box มีความสามารถในการจัดตำแหน่งของแท็บในลักษณะย่อหน้าต่อย่อหน้า การจัดแท็บทำได้ด้วยคุณสมบัติ SelTabCount และ SelTabs ซึ่งคุณสมบัติ SelTabCount ตั้งจำนวนตำแหน่งของแท็บในย่อหน้า ส่วนคุณสมบัติ SelTabs ให้ค่าของแต่ละตำแหน่ง Tab 

RichTextBox.SelTabCount = 3
RichTextBox.SelTabs (0) = 300
RichTextBox.SelTabs (1) = 600
RichTextBox.SelTabs (2) = 1200 

ปุ่มแท็บจะเพิ่มตัวอักษร Tab เมื่อไม่มีตัว control บนฟอร์มตั้งค่าคุณสมบัติ TabStop เป็น True ในกรณีอื่น การเพิ่มตัวอักษร Tab ในเอกสารใช้ปุ่ม Ctrl + Tab 

การแก้ไขปัญหานี้ทำได้โดยการตั้งค่าคุณสมบัติ TabStop ของทุกตัว control เป็น False เมื่อ Rich text box ได้รับโฟกัส และตั้งค่าใหม่เป็น True เมื่อ Rich text box ไม่ได้รับโฟกัส 

‘ ในโมดูล BAS
Sub SetTabStops(frm As Form, value As Boolean)
Dim ctrl As Control
On Error Resume Next
   For Each ctrl In frm.Controls
      Ctrl.TabStop = value
   Next
End Sub 

‘ ในโมดูลฟอร์ม
Private Sub RichTextBox1_GotFocus()
   SetTabStops Me, False
End Sub 

Private Sub RichTextBox1_LostFocus()
   SetTabStops Me, True
End Sub 

การพิมพ์เอกสารปัจจุบัน 

Rich text box สนับสนุนการพิมพ์โดยตรงด้วยเมธอด SelPrint ซึ่งพิมพ์การเลือกปัจจุบัน หรือเอกสารทั้งหมดถ้าไม่มีการเลือกข้อความ และมีไวยากรณ์ 

SelPrint hDC, [Start Doc] 

hDC เป็นอุปกรณ์ที่ใช้พิมพ์
Start Doc เป็นค่า Boolean ที่หาเมธอดส่งคำสั่ง StartDoc และ EndDoc 

การพิมพ์เอกสารปัจจุบันทั้งหมด 

RichTextBox1.SelLength = 0
RichTextBox1.SelPrint Printer.hDC 

Common Dialog

หัวข้อพิเศษไอที, VB 6.0 No Comments »

Common dialog เป็นตัว control ที่ให้วิธีการที่ง่ายและสะดวกในการเกี่ยวข้องกับสี, ฟอนต์, Printer, File Open และ File Save dialog และรวมถึงการแสดงไฟล์ Help ตัว control นี้มีเฉพาะคุณสมบัติและเมธอด แต่ไม่มี event โดยส่วนใหญ่จะไม่มีการตั้งค่าคุณสมบัติ เมื่อเวลาออกแบบเพราะนิยมที่จะกำหนดค่าทั้งหมดในเวลาเรียกใช้ โดยเฉพาะอย่างยิ่งใช้ตัว control ตัวเดียวแสดงไดอะล๊อกบ๊อกซ์ที่แตกต่างกัน ตัว control จะมองไม่เห็นระหว่างการประมวลผล และอยู่ในไฟล์ COMDLG32.OCX ซึ่งต้องกระจายให้กับโปรแกรมประยุกต์ที่ใช้ และต้องมีการโหลดเข้ามา โดยเลือก Microsoft Common Dialog Control 6.0 (SP3) จากรายการในไดอะล๊อกบ๊อกซ์ Component 

Common dialog มีการประยุกต์ที่ซับซ้อน เพราะสนับสนุนหลายตัวเลือก บางคุณสมบัติมีหลายความหมาย ขึ้นกับไดอะล๊อกที่ใช้ เช่น คุณสมบัติ Flags เป็นฟิลด์บิต ซึ่งแต่ละบิตมีความหมายแตกต่างกันตามไดอะล๊อก
ไดอะล๊อกทั้งหมดของ Common dialog มีคุณสมบัติร่วมกันจำนวนหนึ่งที่สัมพันธ์กับ Help โดยสามารถแสดงปุ่ม Help บนไดอะล๊อกบ๊อกซ์ และบอก Common dialog ควบคุมหน้าของไฟล์ Help ที่ต้องการเปิดเมื่อผู้ใช้คลิกปุ่ม Help คุณสมบัติ HelpFile เป็นชื่อสมบูรณ์ของไฟล์ Help คุณสมบัติ HelpConText เป็น Context ID ของหน้าที่ต้องการ และ HelpCommand เป็นการทำงานเมื่อมีการคลิกปุ่ม Help และต้องมีการตั้งค่าคุณสมบัติ Flags 

‘ แสดงปุ่ม help
CommomDialog1.HelpFile = “C:\Program Files \Microsoft Office\Office\Graph9.hlp”
CommomDialog1.HelpContext = 12
CommomDialog1.HelpCommand = cdlHelpContext
‘ ค่าของคุณสมบัติ Flag ขึ้นกับ dialog
If ShowColorDialog Then
   CommomDialog1.Flag = cdlCCHelpButton
   CommomDialog1.ShowColor
ElseIf ShowFontDialog Then
   CommomDialog1.Flag = cdlCFHelpButton
   CommomDialog1.ShowFont
Else
   ’ คำสั่งอื่นๆ
End If 

Common dialog มี 6 เมธอด คือ ShowColor, ShowFont, ShowPrinter, ShowOpen, ShowSave และ ShowHelp แต่ละเมธอดใช้แสดงไดอะล๊อกบ๊อกซ์ แต่ละอย่าง 

Color Dialog 

Color dialog ให้ผู้ใช้เลือกสี และอนุญาตให้กำหนดสีเองได้ แต่ต้องการให้สิทธิกับผู้ใช้โดยกำหนดค่า 4- cdlCCPreventFullOpen ให้กับคุณสมบัติ Flags มีตัวเลือกในการแสดงส่วนของสีกำหนดเอง เมื่อไดอะล๊อก ปรากฏโดยตั้งค่าเป็นบิต 2-cdlCCFullOpen การ initiate สี ในไดอะล๊อกบ๊อกซ์ ทำได้โดยการส่งผ่านสี RGB ไปที่คุณสมบัติ Color และตั้งค่าบิต 1-cdlCCRGBInit ในคุณสมบัติ Flags 

With CommonDialog1
   ’ ป้องกันการแสดงที่เจาะจงเองของ dialog
   .Flags = cdlCCPreventFullOpen Or cdlCCRGBInit
   .Color = Text1.ForeColor
   .CancelError = False
   .ShowColor
   Text1.ForeColor = .Color
End With 

ถ้ามีการให้สีเริ่มต้นแล้ว ไม่จำเป็นต้องตั้งค่าคุณสมบัติ CancelError เป็น True เพราะถ้าผู้ใช้คลิกปุ่ม Cancel ค่าของคุณสมบัติจะไม่เปลี่ยน 

Font Dialog 

Font dialog ให้ผู้ใช้เลือกชื่อฟอนต์และคุณลักษณะ สามารถ initiate ค่าที่แสดงในไดอะล๊อกบ๊อกซ์ และพิจารณาปรับปรุงคุณลักษณะ ซึ่งขึ้นอยู่กับการเพิ่มคุณลักษณะใหม่เข้าสู่ตัว control และอ๊อบเจคในโปรแกรมประยุกต์ 

คุณลักษณะของฟอนต์สามารถ initiate ผ่านกลุ่มคุณสมบัติ คือ FontName, FontSize, FontBold, FontItalic, FontUnderLine, FontStrikeThru และ Color
คำสั่งในการปรับปรุงคุณลักษณะฟอนต์ของตัว control โดยจำขนาดจาก 8 ถึง 80 

With CommonDialog1
   .Flags = cdlCFScreenFonts Or cdlCFForceFontExist Or cdlCFEffects Or cdlCFLimitSize
   .Min = 8
   .Max = 80
   .FontName = Text1.FontName
   .FontSize = Text1.FontSize
   .FontBold = Text1.FontBold
   .FontItalic = Text1.FontItalic
   .FontUnderline = Text1.FontUnderline
   .FontStrikethru = Text1.FontStrikethru
   .CancelError = False
   .ShowFont
   Text1.FontName = .FontName
   Text1.FontBold = .FontBold
   Text1.FontItalic = .FontItalic
   Text1.FontSize = .FontSize
   Text1.FontUnderline = .FontUnderline
   Text1.FontStrikeThru = .FontStrikethru
End With 

ในกรณีนี้ ไม่ต้องการตั้งค่าคุณสมบัติ CancelError เป็น True เพราะผู้ใช้คลิกปุ่ม Cancel ตัว control จะไม่ปรับค่าใดในคุณสมบัติ FontXXXX และค่าคุณสมบัติ FontXXXX สามารถได้รับการกำหนดกลับไปยังตัว control โดยไม่มีผลที่ไม่คาดคิด
คำสั่งในการให้ผู้ใช้ปรับปรุงคุณลักษณะของ Rich text box 

‘ dlgOpen As CommonDialog, rtfShowInfo As RidhTextBox
Private Sub cmdFont_Click()
‘ ไม่รวม vertical fonts.
Const CF_NOVERTFONTS = &H400000 

On Error Resume Next 

   With dlgOpen
      .CancelError = True
      .Flags = cdlCFBoth Or cdlCFForceFontExist Or cdlCFEffects Or cdlCFLimitSize
      If IsNull(rtfShowInfo.SelFontName) Then
         .Flags = .Flags Or cdlCFNoFaceSel
      Else
         .FontName = rtfShowInfo.SelFontName
      End If 

      If IsNull(rtfShowInfo.SelFontSize) Then
         .Flags = .Flags Or cdlCFNoSizeSel
      Else
         .FontSize = rtfShowInfo.SelFontSize
      End If 

      If IsNull(rtfShowInfo.SelBold) Or IsNull(rtfShowInfo.SelItalic) Then
         .Flags = .Flags Or cdlCFNoStyleSel
      Else
         .FontBold = rtfShowInfo.SelBold
         .FontItalic = rtfShowInfo.SelItalic
      End If 

      If Not IsNull(rtfShowInfo.SelColor) Then
         .Color = rtfShowInfo.SelColor
      End If 

      .Min = 8
      .Max = 80
      .ShowFont 

      If Err = 0 Then
         rtfShowInfo.SelFontName = .FontName
         rtfShowInfo.SelBold = .FontBold
         rtfShowInfo.SelItalic = .FontItalic
         If (.Flags And cdlCFNoSizeSel) = 0 Then
            rtfShowInfo.SelFontSize = .FontSize
      End If
         rtfShowInfo.SelUnderline = .FontUnderline
         rtfShowInfo.SelStrikeThru = .FontStrikethru
         rtfShowInfo.SelColor = .Color
      End If
   End With 

End Sub 

Printer Dialog 

Common dialog สามารถแสดงไดอะล๊อกได้ 2 กลุ่ม คือ ไดอะล๊อกบ๊อกซ์ Print Setup ที่ยินยอมให้ผู้ใช้เลือกคุณลักษณะเครื่องพิมพ์ และไดอะล๊อกบ๊อกซ์ Print มาตรฐานที่ให้ผู้ใช้เลือกตัวเลือกของงานพิมพ์ เช่น ส่วนเอกสารที่ต้องการพิมพ์ (พิมพ์ทั้งหมด, ช่วงหรือที่เลือกปัจจุบัน), จำนวนของสำเนา เป็นต้น
การเลือกไดอะล๊อกบ๊อกซ์ ปรากฏโดยการตั้งค่า บิต cdlPDPrintSetup ในคุณสมบัติ Flags รายการของบิตสามารถตั้งในคุณสมบัติ Flags
เมื่อแสดงไดอะล๊อกบ๊อกซ์เครื่องพิมพ์ คุณสมบัติ Min และ Max จะเป็นค่าน้อยที่สุดและมากที่สุดของค่าที่มีอยู่สำหรับจำนวนหน้า ในขณะที่ From Page และ To Page เป็นค่าจริงที่แสดงในไดอะล๊อกบ๊อกซ์ ซึ่งค่าทั้งสองตั้งได้ เมื่อมีการตั้งค่าบิต cdlPDPageNums
คุณสมบัติ PrintDefault หาค่าอ๊อบเจคเครื่องพิมพ์ของ Visual Basic และจับคู่โดยอัตโนมัติกับเครื่องพิมพ์ที่เลือกโดยผู้ใช้ และควรตั้งบิตนี้เพื่อทำให้ง่ายในการพิมพ์ตั้งต่อไป ถ้าไม่มีการตั้งค่าบิตนี้ การดึงสารสนเทศเครื่องพิมพ์ต้องทำโดยใช้การเรียก API ซึ่งมีความยุ่งยาก
ถ้ามีการแสดงไดอะล๊อกบ๊อกซ์ Print ปกติ ควรพิจารณาให้ปุ่ม Option ของ Pages และ Selection สามารถใช้ได้ 

‘ dlgOpen As CommonDialog, rtfShowInfo As RidhTextBox
Private Sub cmdPrinter_Click()
Dim saveSelStart As Long, saveSelLength As Long 

On Error Resume Next
   With dlgOpen
      .CancelError = True
      .Flags = cdlPDHidePrintToFile Or cdlPDNoPageNums Or cdlPDReturnDC
      If rtfShowInfo.SelLength = 0 Then
      ’ ถ้าไม่มีการเลือก ให้ disable ตัวเลือกบนไดอะล๊อก
         .Flags = .Flags Or cdlPDNoSelection
      Else
      ’ กรณีอื่น ให้ “selection” เป็นตัวเลือกเริ่มต้น
         .Flags = .Flags Or cdlPDSelection
      End If
      .ShowPrinter
      If Err = 0 Then
         If .Flags And cdlPDSelection Then
         ’ ผู้ใช้ตัดสินใจ พิมพ์การเลือกปัจจุบัน
            rtfShowInfo.SelPrint .hDC
         Else
            ’ ผู้ใช้ตัดสินใจ เลือกพิมพ์ข้อมูลที่มีอยู่
            saveSelStart = rtfShowInfo.SelStart
            saveSelLength = rtfShowInfo.SelLength
            rtfShowInfo.SelStart = 0
            rtfShowInfo.SelLength = 999999
            ’ พิมพ์ด้วยเครื่องพิมพ์ ที่ส่งออกโดย common dialog
            rtfShowInfo.SelPrint .hDC
            ’ ฟื้นฟูการเลือกเดิม
            rtfShowInfo.SelStart = saveSelStart
            rtfShowInfo.SelLength = saveSelLength
         End If
      End If
   End With
End Sub 

File Open และ File Save Dialog 

File Open dialog และ File Save dialog คล้ายกันมาก ที่สามารถอธิบายร่วมแต่มีหลายสิ่งที่แตกต่างกัน 

คุณสมบัติร่วม 

วิธีการกำหนดลักษณะภายนอกและพฤติกรรมของไดอะล๊อกบ๊อกซ์ File Open และ File Save ได้หลายวิธี เช่น คุณสมบัติ DialogTitle หาหัวข้อของไดอะล๊อกบ๊อกซ์ และคุณสมบัติ InitDir เป็นไดเรคทอรี่ ที่แสดงเมื่อไดอะล๊อกปรากฏ เมื่อไดอะล๊อกเปิดขึ้น คุณสมบัติ FileName เก็บชื่อของไฟล์ prompt เมื่อปิดไดอะล๊อก จะเก็บชื่อไดฟล์ที่เลือกโดยผู้ใช้ คุณสมบัติ DefaulExt สามารถกำหนดนามสกุลไฟล์ เพื่อทำให้ตัว control ส่งออกชื่อไฟล์สมบูรณ์ ให้คุณสมบัติ FileName ถึงแม้ว่าผู้ใช้จะไม่ได้พิมพ์นามสกุลไฟล์ 

สามารถกำหนดการกรองไฟล์ให้ผู้ใช้เมื่อมีสำรวจโฟล์เดอร์ โดยการกำหนดคุณสมบัติ FilterCommon Dialog1.Filter = “All Files / *.* / Bitmaps / *.bmp / Meta Files / *.wmf ; *emf” 

สามารถใช้คุณสมบัติ FilterIndex
CommonDialog1.FilterIndex = 2 

การทำงานกับไดอะล๊อกบ๊อกของ File Open หรือ File Save ควรตั้งค่าคุณสมบัติ CancelError เป็น True เพราะต้องการวิธีการหาผู้ใช้ยกเลิกการทำงานกับไฟล์ 

File Save Dialog 

File Save dialog มีวิธีการทำงานที่ง่ายกว่า File Open dialog ตามตัวอย่างฟังก์ชัน SaveTextControl 

Function SaveTextControl(txtBox As Control, dlg As CommonDialog, Filename As String) As Boolean
Dim filenum As Integer
On Error GoTo ExitNow 

   dlg.Filter = “All files (*.*)|*.*|Text files|*.txt”
   dlg.FilterIndex = 2
   dlg.DefaultExt = “txt”
   If TypeName(txtBox) = “RichTextBox” Then
      dlg.Filter = dlg.Filter & “|RTF files|*.rtf”
      dlg.FilterIndex = 3
      dlg.DefaultExt = “rtf”
   End If 

   dlg.Flags = cdlOFNHideReadOnly Or cdlOFNPathMustExist Or _
cdlOFNOverwritePrompt Or cdlOFNNoReadOnlyReturn
   dlg.DialogTitle = “Select the destination file ”
   dlg.Filename = Filename
   ’ ออก ถ้าผู้ใช้กดปุ่ม cancel
   dlg.CancelError = True
   dlg.ShowSave
   Filename = dlg.Filename
   ’ เขียนข้อมูลของตัว control
   filenum = FreeFile() 

   Open Filename For Output As #filenum
   If TypeName(txtBox) = “RichTextBox” Then
      Print #filenum, txtBox.TextRTF;
   Else
      Print #filenum, txtBox.Text;
   End If
   Close #filenum
   ’ แสดงการทำงานสำเร็จ
   SaveTextControl = True 

ExitNow: 

End Function 

สามารถใช้คำสั่งจากฟังก์ชัน SaveTextControl 

Dim File Name As String
If SaveTextControl (RichTextBox1, CommonDialog1, File Name) Then
   MsgBox “ข้อความได้รับการบันทึกไปที่ไฟล์ ” & File name
End If 

เมื่อมีการออกจากไดอะล๊อกบ๊อกซ์ของ File Save (และ File Open) สามารถทดสอบบิต cdlFNExtensionDifferent ของคุณสมบัติ Flags
ในกรณีที่ต้องการทราบถึงการเลือกไฟล์มีนามสกุลไฟล์ที่แตกต่างจากคุณสมบัติ DefaulText 

If CD.Flags and cdlFNextensionDifferent Then
   ’ประมวลผล นามสกุลไฟล์ที่ไม่อยู่ในมาตรฐาน
End If 

การเลือกแบบ Single ใน File Open Dialog 

Common dialog สนับสนุนการเลือกของ File Open ทั้งแบบ single และ multiple โดยการเลือกแบบ Single ไม่แตกต่างจาก File Save dialog ยกเว้นการกำหนดบิตของคุณสมบัติ Flags ต่างกัน 

Function LoadTextControl(txtBox As Control, dlg As CommonDialog, _
Filename As String) As Boolean
Dim filenum As Integer
On Error GoTo ExitNow 

   dlg.Filter = “All files (*.*)|*.*|Text files|*.txt”
   dlg.FilterIndex = 2
   dlg.DefaultExt = “txt”
   If TypeName(txtBox) = “RichTextBox” Then
      dlg.Filter = dlg.Filter & “|RTF files|*.rtf”
      dlg.FilterIndex = 3
      dlg.DefaultExt = “rtf”
   End If
   dlg.Flags = cdlOFNHideReadOnly Or cdlOFNFileMustExist Or _
   dlOFNNoReadOnlyReturn
   dlg.DialogTitle = “Select the source file ”
   dlg.Filename = Filename
   ’ ออก ถ้าผู้ใช้กดปุ่ม cancel
   dlg.CancelError = True
   dlg.ShowOpen
   Filename = dlg.Filename 

   ’ อ่านข้อมูลของไฟล์ไปที่ตัว control
   filenum = FreeFile()
   Open Filename For Input As #filenum
      If TypeName(txtBox) = “RichTextBox” Then
         txtBox.TextRTF = Input$(LOF(filenum), filenum)
      Else
         txtBox.Text = Input$(LOF(filenum), filenum)
      End If
   Close #filenum
   ’ แสดงการทำงานสำเร็จ
   LoadTextControl = True 

ExitNow: 

End Function 

ถ้าไม่มีการระบุบิต cdlOFNHideReadyOnly ในคุณสมบัติ Flags ไดอะล๊อกบ๊อกซ์จะแสดง Check box ของ Read-Only เพื่อค้นหาการคลิก Check box ของผู้ใช้ให้ทดสอบคุณสมบัติ Flags 

If CD.Flags And cdlOFNReadOnly Then
   ’ ไฟล์ได้รับการเปิดในโหมดอ่านอย่างเดียว (read-only)
   ’ ( เช่น ไม่ให้ใช้คำสั่ง File Save)
End If 

การเลือกแบบ Multiple ใน File Open Dialog 

การเลือกแบบ multiple ของ File Open dialog มีความซับซ้อนกว่าแบบ single ต้องมีการระบุการเปิดไดอะล๊อกบ๊อกซ์ การเลือกไฟล์แบบ multiple ด้วยตั้งค่าบิต cdlOFNAllowMultiSelect ของคุณสมบัติ Flags เพื่อทำให้ไฟล์ทั้งหมดที่ผู้ใช้เลือกได้รับการต่อเป็นข้อความเดียวและส่งไปให้คุณสมบัติ FileName 

ตามปกติ File Open dialog ทำงานกับข้อความไม่เกิน 256 ตัวอักษร ถ้าชื่อไฟล์ที่เลือกยาวกว่าข้อจำกัดจะเกิดความผิดพลาด การแก้ไขผิดพลาดนี้สามารถกำหนดค่าคุณสมบัติ MaxFileSize ให้สูงขึ้น เช่น ให้เป็น 10 KB 

CommonDialog.MaxFileSize = 10240 

Function SelectMultipleFiles(dlg As CommonDialog, Filter As String, _
Filenames() As String) As Boolean
On Error GoTo ExitNow 

   dlg.Filter = “All files (*.*)|*.*|” & Filter
   dlg.FilterIndex = 1
   dlg.Flags = cdlOFNAllowMultiselect Or cdlOFNFileMustExist Or cdlOFNExplorer
   dlg.DialogTitle = “Select one or more files”
   dlg.MaxFileSize = 10240
   dlg.Filename = “”
   ’ ออก ถ้าผู้ใช้กดปุ่ม cancel
   dlg.CancelError = True
   dlg.ShowOpen
   ’ กระจายผลลัพธ์เพื่อดึงชื่อไฟล์
   Filenames() = Split(dlg.Filename, vbNullChar)
   ’ แสดงการทำงานสำเร็จ
   SelectMultipleFiles = True 

ExitNow: 

End Function 

Help Windows 

Common dialog สามารถนำมาใช้ในการแสดงสารสนเทศของไฟล์ Help ได้ ในกรณีนี้จะไม่มีไดอะล๊อกบ๊อกซ์ปรากฏ และมีคุณสมบัติที่ใช้เพียงเล็กน้อย ให้กำหนดคุณสมบัติ HelpFile ด้วยชื่อไฟล์ และพาร์ทตั้งค่าของคุณสมบัติ HelpCommand
การแสดงไฟล์ Help 

With CommonDialog1
   ’ ตำแหน่งไฟล์ขึ้นกับตำแหน่งจริง
   .HelpFile = “C:\Program Files\Common Files\Microsoft Shared\Dao\Dao35.hlp”
   .HelpCommand = cdlHelpContents
   .ShowHelp
End With 

ถ้าต้องการแสดงเพจที่สัมพันธ์กับคีย์เวิร์ด และคีย์เวิร์ดของคุณสมบัติ HelpKey ไม่ตรงกับเพจที่มีอยู่ 

With CommonDialog1
   ’ ตำแหน่งไฟล์ขึ้นกับตำแหน่งจริง
   .HelpFile = “C:\Program Files\Common Files\Microsoft Shared\Dao\Dao35.hlp”
   .HelpCommand = cdlHelpKey
   .HelpKey = “BOF property”
   .ShowHelp
End With 

ActiveX Control

หัวข้อพิเศษไอที, VB 6.0 No Comments »

โปรแกรมประยุกต์ Visual Basic สามารถใช้ตัว ActiveX control ที่มากับผลิตภัณฑ์ และซื้อจากผู้ผลิตรายอื่น รวมถึงการสร้างตัว ActiveX control เอง สำหรับในตอนนี้เป็นการแนะนำถึงตัว control ที่มีอยู่ในแพ็คเกจของ Visual Basic

ชื่อ control
ชื่อ class
ชื่อไฟล์
คำอธิบาย
Common Dialog CommonDialog COMDLG32.OCX Common dialog เป็นตัว control ที่ให้วิธีการที่ง่ายและสะดวกในการเกี่ยวข้องกับสี, ฟอนต์, Printer, File Open และ File Save dialog และรวมถึงการแสดงไฟล์ Help
Mask ed box MaskEdBox MSMASK32.OCX Mask ed box เป็นตัว control ที่คล้ายกับ Text box ที่มีส่วนเพิ่มที่เป็นประโยชน์ สำหรับการสร้างความสามารถของขั้นตอนการป้อนข้อมูล
MS Chart MSChart MSCHART20.OCX MS Chart เป็นตัว control ภายนอกของ ActiveX ที่ให้ผู้ใช้เพิ่มความสามารถทำแผนภูมิในโปรแกรมประยุกต์
Rich text box RichTextBox RICHTX32.OCX Rich text box เป็นตัว control ที่มีความสามารถสูงของ Visual Basic ลักษณะภาย Rich text box เป็น Text box ที่แสดงข้อความในรูปแบบ Rich text format (RTF)
SysInfo SysInfo SYSINFO.OCX SysInfo เป็นตัว control ที่ช่วยในการสร้างโปรแกรมประยุกต์ที่ยินยอมด้วยโปรแกรม Window Logo ความต้องการเบื้องต้นสำหรับการประยุกต์แบบนี้ คือ ความสามารถในการตอบสนอง event ของระบบ เช่น การเปลี่ยนความละเอียดของจอภาพ หรือ เมื่ออุปกรณ์ plug-and-play ต่อเชื่อมหรือยกเลิกการต่อเชื่อมกับระบบ
Tab dialog หรือ SS tab SSTab TABCTL32.OCX SS tab เป็นตัว control ที่ยอมให้สร้างไดอะล๊อกบ๊อกซ์ Tab ซึ่งเกือบเหมือนกับ Tab strip แต่มีความแตกต่างที่สำคัญระหว่างตัว control นี้ คือ SS tab เป็น container ทำให้สามารถวางตัว control ลูกได้โดยตรงบนผิว และสามารถเปลี่ยนหน้า Tab ระหว่างการออกแบบ

   Designed By:  SadhWeb Directory  &  WP Theme

Sponsored By:  Affiliate Marketing Blog  &  Paid Directory