สำนักวิชาเทคโนโลยีสารสนเทศและการสื่อสาร มหาวิทยาลัยนเรศวร พะเยา Printing กนกวรรธน์ เซี่ยงเจ็น สำนักวิชาเทคโนโลยีสารสนเทศและการสื่อสาร มหาวิทยาลัยนเรศวร พะเยา
เนื้อหา บทนำ Crystal Report การพิมพ์อย่างง่าย การแสดงตัวอย่างก่อนพิมพ์ การพิมพ์หลายหน้า สรุป
บทนำ ในการทำงานเชิงธุรกิจ รายงานเป็นสิ่งจำเป็นมากที่สุด โดยมีเครื่องมือจำนวนมากที่สามารถใช้สร้างรายงานได้ อาทิเช่น Crystal Report ซึ่งจะไม่มีการติดตั้งมากับ Visual Basic .NET Express Edition ที่เป็นเวอร์ชันฟรี อย่างไรก็ดีในการเรียนการสอน เราสามารถใช้เครื่องมือ GDI+ Library ซึ่งเป็นเครื่องมือเกี่ยวกับ Graphics ที่ติดมากับ VB เพื่อทดสอบการพิมพ์แบบง่าย ๆ ได้
Crystal Report เป็นเครื่องมือ ที่นิยมนำมาใช้ช่วยในการออกรายงาน โดยจะมีการติดตั้งมากับ Visual Basic .NET เวอร์ชันเต็ม
การพิมพ์อย่างง่าย ในการพิมพ์เอกสารด้วยต้นเอง จะมี Name Space ที่เกี่ยวข้องคือ System.Drawing.Printing นิสิตจำเป็นต้องมีการ Imports System.Drawing.Printing เข้าไปไว้บรรทัดบนสุดเพื่อให้สามารถเรียกใช้งานเครื่องพิมพ์ได้
การสร้างรายงาน ประกอบด้วย 2 ส่วน เนื้อหาของเอกสารที่จะส่งให้เอกสารเปล่า เอกสารเปล่าเพื่อจัดเก็บเอกสาร เอกสารเปล่า เนื้อหา เอกสาร+เนื้อหา +
การพิมพ์อย่างง่าย (สร้างเนื้อหา) Private Sub myDoc_PrintPage(ByVal sender As Object, ByVal e As PrintPageEventArgs) Dim myFont As New Font("Arial", 10) Dim x As Single = e.MarginBounds.Left Dim y As Single = e.MarginBounds.Top Dim lineHeight As Single = myFont.GetHeight(e.Graphics) Dim i As Integer For i = 0 To 100 e.Graphics.DrawString("This is line " & i.ToString, myFont, Brushes.Black, x, y) y += lineHeight Next End Sub
การพิมพ์อย่างง่าย (สร้างเอกสารเปล่า) Private Sub btnPrint_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPrint.Click Dim myDoc As New PrintDocument AddHandler myDoc.PrintPage, AddressOf myDoc_PrintPage Dim dlgSetting As New PrintDialog dlgSetting.Document = myDoc Dim result As DialogResult = dlgSetting.ShowDialog() If (result = Windows.Forms.DialogResult.OK) Then myDoc.Print() End If End Sub
หลักการทำงาน สร้างเอกสารเปล่าเพื่อจัดเก็บเอกสาร Dim myDoc As New PrintDocument AddHandler myDoc.PrintPage, AddressOf myDoc_PrintPage โดยมีการเชื่อมโยงกับเหตุการณ์ของหน้าเอกสาร(PrintPage) ของวัตถุ(myDoc) myDoc.PrintPage โดยสัมพันธ์กับ Procdure ชื่อ myDoc_PrintPage ที่เราสร้างไว้ก่อนหน้า
Dim dlgSetting As New PrintDialog หลักการทำงาน สร้าง Dialog เพื่อแสดงรายละเอียดของเครื่องพิมพ์ (PrintDialog) โดยส่งเอกสาร (myDoc) ไปยังเครื่องพิมพ์ โดยรอการยืนยันว่าจะพิมพ์เอกสาร หรือไม่ จากผู้ใช้ Dim dlgSetting As New PrintDialog dlgSetting.Document = myDoc
หลักการทำงาน Dim result As DialogResult = dlgSetting.ShowDialog() ถ้าผู้ใช้ยืนยันการพิมพ์โดยการคลิก “OK” ก็จะทำการพิมพ์เอกสาร(myDoc) ผ่านคำสั่ง (Print) Dim result As DialogResult = dlgSetting.ShowDialog() If (result = Windows.Forms.DialogResult.OK) Then myDoc.Print() End If
คำถาม: ข้อมูลที่จะพิมพ์จากไหน คำตอบ: ข้อมูลที่จะพิมพ์ออกทางเอกสาร (myDoc) มาจาก Private Sub myDoc_PrintPage คำถาม: แล้วข้อมูลข้างต้นมาได้ยังไง คำตอบ: ข้อมูลที่จะพิมพ์ ได้ถูกกำหนดให้สัมพันธ์กัน ตอนนี้ Dim myDoc As New PrintDocument AddHandler myDoc.PrintPage, AddressOf myDoc_PrintPage
การสร้างเนื้อหาในเอกสาร สร้างจาก Private Sub myDoc_PrintPage การสร้างเนื้อหาในเอกสาร มีขั้นตอนอะไรบ้าง
ขั้นตอนการสร้างเนื้อหาของเอกสาร ฟอนต์ Dim myFont As New Font("Arial", 10) ตำแหน่งที่ต้องการพิมพ์ Dim x As Single = e.MarginBounds.Left Dim y As Single = e.MarginBounds.Top ความสูงของตัวอักษรในแต่ละบรรทัด Dim lineHeight As Single = myFont.GetHeight(e.Graphics)
การสร้างเนื้อหาต้องพิจารณาอะไรบ้าง การแสดงผลลัพธ์ออกทางจอภาพด้วย DrawString e.Graphics.DrawString("This is line " & i.ToString, myFont, Brushes.Black, x, y) การขึ้นบรรทัดใหม่ คือ การเปลี่ยนตำแหน่งในแกน y ให้เท่ากับความสูงของตัวอักษรที่เราเก็บไว้ก่อนหน้า y += lineHeight
การแสดงตัวอย่างก่อนพิมพ์
ปุ่มตัวอย่างก่อนพิมพ์ (btnPrintPreview) Private Sub btnPrintPreview_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPrintPreview.Click Dim dlgPreview As New PrintPreviewDialog Dim myDoc As New PrintDocument AddHandler myDoc.PrintPage, AddressOf myDoc_PrintPage dlgPreview.Document = myDoc dlgPreview.Show() End Sub
การพิมพ์หลายหน้า จากตัวอย่างที่ผ่านมาจะเห็นได้ว่า หากมีข้อมูลเกิน 1หน้ากระดาษ ก็จะไม่สามารถแสดงผลลัพธ์ที่เหลือได้ หากนิสิตต้องการพิมพ์หลายหน้าต้องมีการคำนวณจุดต่ำสุด (Bottom) ของหน้ากระดาษว่าต่ำสุดแล้วก็ให้ทำการสร้างหน้าใหม่ขึ้นมา ดังนั้นในหัวข้อนี้จะมีปรับปรุงโค้ดบางส่วนเพื่อให้รองรับการพิมพ์หลายหน้า
การพิมพ์หลายหน้า โดยต้องมีการเตรียมพื้นที่สำหรับพักข้อมูล (Buffer) ก่อนการพิมพ์ โดยในที่นี้ผู้สอนได้สร้าง Class ชื่อว่า TextDocument ที่รับการถ่ายทอดคุณสมบัติจาก PrintDocument ซึ่งสามารถพิมพ์ได้แค่ 1 หน้า
คลาส TextDocument Public Class TextDocument Inherits PrintDocument Private _Text() As String Private _PageNumber As Integer Private _Offset As Integer Public Property Text() As String() Get Return _Text End Get Set(ByVal value As String()) _Text = value End Set End Property
คลาส TextDocument (ต่อ) Public Property PageNumber() As Integer Get Return _PageNumber End Get Set(ByVal value As Integer) _PageNumber = value End Set End Property Public Property Offset() As Integer Return _Offset _Offset = value Public Sub New(ByVal text() As String) Me.Text = text End Sub End Class
การสร้างเนื้อหาในเอกสาร Private Sub myDoc1_PrintPage(ByVal sender As Object, ByVal e As PrintPageEventArgs) Dim Doc As TextDocument = CType(sender, TextDocument) Dim myFont As New Font("Arial", 10) Dim LineHeight As Single = myFont.GetHeight(e.Graphics) Dim x As Single = e.MarginBounds.Left Dim y As Single = e.MarginBounds.Top Doc.PageNumber += 1 Do e.Graphics.DrawString(Doc.Text(Doc.Offset), myFont, Brushes.Black, x, y) Doc.Offset += 1 y += LineHeight Loop Until (y + LineHeight) > e.MarginBounds.Bottom Or Doc.Offset > Doc.Text.GetUpperBound(0) If Doc.Offset < Doc.Text.GetUpperBound(0) Then e.HasMorePages = True Else Doc.Offset = 0 End If End Sub
การพิมพ์เอกสารหลายหน้า Private Sub btnPrint1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPrint1.Click Dim PrintText(100) As String Dim i As Integer For i = 0 To 100 PrintText(i) = "This is line " PrintText(i) &= i.ToString() Next Dim myDoc1 As New TextDocument(PrintText) AddHandler myDoc1.PrintPage, AddressOf myDoc1_PrintPage Dim dlgSetting As New PrintDialog() dlgSetting.Document = myDoc1 Dim result As DialogResult = dlgSetting.ShowDialog() If result = Windows.Forms.DialogResult.OK Then myDoc1.Print() End If End Sub
การแสดงตัวอย่างก่อนพิมพ์หลายหน้า Private Sub btnPrintPreview1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnPrintPreview1.Click Dim PrintText(100) As String Dim i As Integer For i = 1 To 100 PrintText(i) = "This is line " PrintText(i) &= i.ToString() Next Dim dlgPreview As New PrintPreviewDialog Dim myDoc1 As New TextDocument(PrintText) AddHandler myDoc1.PrintPage, AddressOf myDoc1_PrintPage dlgPreview.Document = myDoc1 dlgPreview.Show() End Sub
สรุป ในการออกรายงาน ปกติจะมีเครื่องมือช่วยสนับสนุนการทำงานนี้อยู่แล้ว เช่น Crystal Report ซึ่งจะติดตั้งกับ Visual Basic .NET เวอร์ชันเต็มอย่างไรก็ดีเราสามารถพิมพ์เอกสารแบบง่าย ๆ ได้โดยใช้ GDI+ ที่มากับ VB.NET แทน เนื่องจากถึงระบบจะดีเพียงใด แต่ถ้าไม่สามารถออกรายงานได้ฉันใด ก็ไม่สามารถแสดงได้ถึงคุณค่าของโปรแกรมได้อย่างเต็มที่ฉันนั้น
สรุป หากนิสิตต้องการรายงานที่มีประสิทธิภาพ คงต้องติดตั้งโปรแกรม Visual Basic .NET เวอร์ชันเต็มที่จะติดตั้งฟังก์ชันการทำงาน มาอย่างครบครัน