ชุมชนคนรักภาษาเบสิค - Visual Basic Community

 ลืมรหัสผ่าน
 ลงทะเบียน
ค้นหา
ดู: 3087|ตอบกลับ: 2

[VB.NET] การพิมพ์รหัสแท่งบาร์โค้ด 1 มิติด้วย ActiveReports .NET ออกกระดาษ A4

[คัดลอกลิงก์]

262

กระทู้

422

โพสต์

3751

เครดิต

ผู้ดูแลระบบ

Rank: 9Rank: 9Rank: 9

เครดิต
3751



โค้ดชุดนี้แอดมินได้แจกจ่ายไปหลายตลบแล้ว เพราะย้ายเว็บบอร์ดอยู่เรื่อยๆ แต่ครั้งนี้จะมีลูกเล่นในเรื่องของไดนามิกเข้ามาเพิ่มเติมอีก นั่นคือเป็นการเขียนโค้ดเข้าช่วย เพื่อทำให้งานของเราดูดีมีชาติตระกูลมากขึ้น เช่น การกำหนดจำนวนหลักในการพิมพ์ การเลือกรูปแบบบาร์โค้ด และการพิมพ์กรอบ ...


การกำหนดจำนวนหลักใน AR Designer ... คลิ๊กเลือก Detail ใน Designer ก่อน ก็จะเห็นคุณสมบัติ (Properties) ...


หัวข้อที่เกี่ยวข้อง ...
การเรียกใช้งาน ActiveReports .NET แบบเบื้องต้น
[VB.NET] ก้าวแรกกับการพิมพ์รายงานด้วย ActiveReports .NET
[VB.NET] พื้นฐานการพิมพ์รายงานด้วย ActiveReports .NET ลงบนกระดาษขนาด A4

ดาวน์โหลด ActiveReports .NET (เฉพาะสมาชิกเท่านั้น)

เมื่อสั่งรันรายงานจาก Visual Basic IDE จะทำให้เกิดการทำงานที่เหตุการณ์ ReportStart ก่อน ...
  1.     '// START HERE
  2.     Private Sub arBarcode_ReportStart(sender As Object, e As System.EventArgs) Handles Me.ReportStart
  3.         ' การตั้งค่าแบบ Run Time (มีหน่วยวัดเป็นนิ้ว ... แต่สามารถเปลี่ยนเป็น ซม. ได้ด้วย CmToInch)
  4.         With PageSettings
  5.             .Margins.Left = CmToInch(0.5)
  6.             .Margins.Right = CmToInch(0.5)
  7.             .Margins.Top = CmToInch(1)
  8.             .Margins.Bottom = CmToInch(1)
  9.             ' ตั้งค่ากระดาษแนวตั้ง
  10.             .Orientation = PageOrientation.Portrait
  11.             ' กระดาษขนาด A4
  12.             .PaperKind = Drawing.Printing.PaperKind.A4
  13.             ' กรณีที่กำหนดขนาดกระดาษเอง
  14.             ' .PaperKind = Drawing.Printing.PaperKind.Custom
  15.         End With

  16.         '/ กำหนดรูปแบบบาร์โค้ด (Barcode Style) ...
  17.         Select Case frmPrintBarcode.cmbStyle.SelectedIndex
  18.             Case 0
  19.                 Barcode1.Style = BarCodeStyle.Code_128_A
  20.             Case 1
  21.                 Barcode1.Style = BarCodeStyle.Code_128_B
  22.             Case 2
  23.                 Barcode1.Style = BarCodeStyle.Code_128_C
  24.         End Select
  25.         '// กำหนดจำนวนหลักในการพิมพ์ (ความกว้างของกระดาษ / จำนวนหลัก)
  26.         Select Case frmPrintBarcode.cmbColumn.SelectedIndex
  27.             Case 0
  28.                 Me.Detail1.ColumnCount = 3
  29.                 Me.Shape1.Width = CmToInch(6.58)
  30.                 Me.Barcode1.Width = CmToInch(6.18)
  31.             Case 1
  32.                 Me.Detail1.ColumnCount = 4
  33.                 Me.Shape1.Width = CmToInch(4.94)
  34.                 Me.Barcode1.Width = CmToInch(4.6)
  35.             Case 2
  36.                 Me.Detail1.ColumnCount = 5
  37.         End Select
  38.         '// พิมพ์กรอบหรือไม่
  39.         If frmPrintBarcode.chkPrintShape.Checked Then
  40.             Shape1.Visible = True
  41.         Else
  42.             Shape1.Visible = False
  43.         End If
  44.         ' เคลียร์ค่าตัวแปรเพื่อความแน่ใจ
  45.         ' Count = 0 : CountCode = 0 : BeginCode = 0

  46.         ' รับค่ารหัสบาร์โค้ดตัวแรกเข้ามา
  47.         BeginCode = Val(frmPrintBarcode.txtStartCode.Text)

  48.         ' นับจำนวนของการพิมพ์บาร์โค้ดทั้งหมด
  49.         ' CountCode = End - Begin + 1
  50.         ' ต้องบวกเพิ่มอีก 1 เพื่อให้ได้ค่าที่ถูกต้อง และจะใช้ตัวแปรนี้ในโปรแกรมย่อย FetchData events
  51.         CountCode = Val(frmPrintBarcode.txtEndCode.Text) - Val(frmPrintBarcode.txtStartCode.Text) + 1
  52.         '//
  53.     End Sub
คัดลอกไปที่คลิปบอร์ด

จากนั้นจำทำการเช็คข้อมูลว่ามีข้อมูลให้พิมพ์หรือไม่ที่ FetchData ...
  1.     '// Sub Program ที่คอยตรวจสอบจำนวนข้อมูลในการพิมพ์
  2.     '// หาก eArgs.EOF = True จะเป็นการสิ้นสุดการพิมพ์
  3.     Private Sub arBarcode_FetchData(ByVal sender As Object, ByVal eArgs As DataDynamics.ActiveReports.ActiveReport.FetchEventArgs) Handles Me.FetchData
  4.         Count = Count + 1
  5.         ' หากนับได้ตรงตามจำนวนแล้วก็จะจบการทำงานในส่วนของการพิมพ์
  6.         If Count > CountCode Then
  7.             eArgs.EOF = True
  8.             Exit Sub

  9.         Else
  10.             ' End Of File เป็นเท็จ ก็คือมันยังไม่หมดข้อมูลของการพิมพ์
  11.             eArgs.EOF = False
  12.             ' กระโดดไปทำงานต่อที่ Detal1_Format เพื่อทำการพิมพ์รหัสบาร์โค้ดต่อ
  13.         End If
  14.     End Sub
คัดลอกไปที่คลิปบอร์ด

แล้วเริ่มต้นการพิมพ์รายละเอียดใน Detail_Format ...
  1.     '// รายละเอียดของการพิมพ์
  2.     Private Sub Detail1_Format(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Detail1.Format

  3.         ' จัดรูปแบบการพิมพ์รหัสบาร์โค้ดออกมา เช่น BeginCode = 199, ความยาว 9 ตัว
  4.         ' "0000000000" & 199 ... จะได้ ... "0000000000199"
  5.         ' พอนับจากทางขวามา 9 ตัว ก็จะถูกตัดเหลือ "000000199"
  6.         Barcode1.Text = Right("0000000000" & BeginCode, Val(frmPrintBarcode.cmbLength.Text))

  7.         ' การวางตำแหน่งของชุดคำสั่งนี้สำคัญมาก เพราะหากคุณวางไว้ก่อนบรรทัดข้างบน ผลที่ได้จะเกิด Logical Error
  8.         ' หรือได้ผลลัพธ์ออกมาไม่ตรงตามที่ต้องการ
  9.         BeginCode = BeginCode + 1

  10.         ' จากจุดนี้มันก็จะกระโดดไป arBarcode_FetchData เพื่อตรวจสอบว่า Count นับได้ครบตาม CountCode หรือไม่

  11.     End Sub
คัดลอกไปที่คลิปบอร์ด

มาดูโค้ดฉบับเต็มใน Visual Basic .NET ...
  1. Imports DataDynamics.ActiveReports

  2. Public Class frmPrintBarcode

  3.     Private Sub btnPrintPreview_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPrintPreview.Click
  4.         ' ดัก error จากการป้อนข้อมูล
  5.         If Trim(txtStartCode.Text) = "" Or Len(Trim(txtStartCode.Text)) = 0 Then   ' VB6 Style
  6.             MessageBox.Show("กรุณาป้อนค่ารหัสเริ่มต้นให้เรียบร้อยก่อนด้วย.")
  7.             txtStartCode.Focus()
  8.             Exit Sub
  9.         ElseIf Trim(txtEndCode.Text) = String.Empty Then   ' VB.Net Style
  10.             MessageBox.Show("กรุณาป้อนค่ารหัสสิ้นสุดให้เรียบร้อยก่อนด้วย.")
  11.             txtEndCode.Focus()
  12.             Return
  13.         End If
  14.         ' ค่ารหัสสิ้นสุดน้อยกว่าค่าเริ่มต้นไม่ได้
  15.         If (Val(txtEndCode.Text) - Val(txtStartCode.Text) < 0) Then
  16.             MessageBox.Show("ค่ารหัสสิ้นสุดมีค่าน้อยกว่ารหัสเริ่มต้น กรุณาป้อนใหม่ก่อนด้วย.")
  17.             txtEndCode.Focus()
  18.             Return
  19.         End If

  20.         '/ Instance name ARDesigner มันจะชี้ไปที่ไฟล์ arBarcode.vb
  21.         Dim rpt As New arBarcode()
  22.         '/ Run Report
  23.         rpt.Run()
  24.         '/ โหลดรายงาน document (arBarcode) เข้าสู่ ActiveReports Viewer
  25.         Me.Viewer1.Document = rpt.Document
  26.         Me.Viewer1.ReportViewer.Zoom = 1    '// 100%

  27.     End Sub

  28.     Private Sub frmPrintBarcode_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
  29.         Select Case e.KeyCode
  30.             Case Keys.F7
  31.                 Call btnPrintPreview_Click(sender, e)
  32.             Case Keys.F10
  33.                 Call btnExit_Click(sender, e)
  34.         End Select
  35.     End Sub

  36.     Private Sub frmPrintBarcode_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  37.         With txtStartCode
  38.             .Text = "999999900"
  39.             .MaxLength = 9
  40.         End With
  41.         With txtEndCode
  42.             .Text = "999999999"
  43.             .MaxLength = 9
  44.         End With

  45.         ' กำหนดความยาวของรหัสบาร์โค้ด
  46.         cmbLength.Items.Add("6")    ' Index = 0
  47.         cmbLength.Items.Add("7")    ' Index = 1
  48.         cmbLength.Items.Add("8")    ' Index = 2
  49.         cmbLength.Items.Add("9")    ' Index = 3
  50.         ' เลือกรายการแรก คือ 6 เป็นค่าตั้งต้น
  51.         cmbLength.SelectedIndex = 0
  52.         '// จำนวนหลักในการพิมพ์รหัสบาร์โค้ด
  53.         With cmbColumn
  54.             .Items.Add("3 หลัก")
  55.             .Items.Add("4 หลัก")
  56.             .Items.Add("5 หลัก")
  57.         End With
  58.         cmbColumn.SelectedIndex = 0
  59.         '//
  60.         With cmbStyle
  61.             .Items.Add("Code 128A")
  62.             .Items.Add("Code 128B")
  63.             .Items.Add("Code 128C")
  64.         End With
  65.         cmbStyle.SelectedIndex = 1
  66.         '//
  67.     End Sub

  68.     Private Sub btnExit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExit.Click
  69.         Me.Close()
  70.     End Sub

  71.     '/ Function บังคับให้ผู้ใช้งานกดได้เฉพาะ 0-9 เท่านั้นใน TextBox
  72.     '/ ผมใช้ ASCII Code เป็นเงื่อนไขในการทดสอบ
  73.     '/ ขอให้พิจารณาถึงความแตกต่างของการใช้ IF-THEN-ELSE กับ SELECT CASE
  74.     Function CheckDigitOnly(ByVal index As Integer) As Boolean
  75.         Select Case index
  76.             Case 48 To 57 ' ASCII Code Numeric 0 - 9
  77.                 CheckDigitOnly = False
  78.             Case 8, 13 ' Backspace = 8, Enter = 13
  79.                 CheckDigitOnly = False
  80.             Case Else
  81.                 CheckDigitOnly = True
  82.         End Select
  83.     End Function

  84.     Private Sub txtStartCode_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtStartCode.KeyPress
  85.         '// เกิดการกด ENter
  86.         If e.KeyChar = Chr(13) Then
  87.             e.Handled = True
  88.             SendKeys.Send("{TAB}")
  89.         Else
  90.             '/ อ่านรายละเอียดเพิ่มเติม ... http://www.g2gnet.com/News/activenews_view.asp?articleID=106
  91.             e.Handled = CheckDigitOnly(Asc(e.KeyChar))
  92.         End If
  93.     End Sub

  94.     Private Sub txtEndCode_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtEndCode.KeyPress
  95.         '// เกิดการกด ENter
  96.         If e.KeyChar = Chr(13) Then
  97.             e.Handled = True
  98.             SendKeys.Send("{TAB}")
  99.         Else
  100.             '/ จะกระโดดไปทดสอบค่าที่ฟังค์ชั่น CheckDigitOnly
  101.             '/ ASCII Code ของตัวอักขระ 0 - 9 โดยที่ 0 = 48, 1 = 49, 2 = 50, ... 9 = 57
  102.             e.Handled = CheckDigitOnly(Asc(e.KeyChar))
  103.         End If
  104.     End Sub

  105.     Private Sub frmPrintBarcode_FormClosed(sender As Object, e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
  106.         Me.Dispose()
  107.         Application.Exit()
  108.     End Sub

  109.     Private Sub ToolStripStatusLabel2_Click(sender As System.Object, e As System.EventArgs) Handles ToolStripStatusLabel2.Click
  110.         Process.Start("http://www.g2gnet.com/webboard")
  111.     End Sub

  112.     Private Sub ToolStripStatusLabel3_Click(sender As System.Object, e As System.EventArgs) Handles ToolStripStatusLabel3.Click
  113.         Process.Start("mailto:thongkorn@hotmail.com")
  114.     End Sub
  115. End Class
คัดลอกไปที่คลิปบอร์ด

โค้ดในส่วนของ ActiveReports .NET ...
  1. Imports DataDynamics.ActiveReports
  2. Imports DataDynamics.ActiveReports.Document

  3. '// TIP: สำหรับ Visual Basic เราจะใช้การอ้างถึงชื่อฟอร์มแล้วตามด้วยชื่อ Control ต่างๆได้เลย

  4. Public Class arBarcode
  5.     ' ตัวแปรแบบ Global ซึ่งเราจะมองเห็นได้หมดในโปรแกรมย่อยทุกตัว แต่เฉพาะ ARDesigner ตัวนี้เท่านั้น
  6.     Dim BeginCode As Long
  7.     Dim Count As Integer
  8.     Dim CountCode As Integer

  9.     '// Sub Program ที่คอยตรวจสอบจำนวนข้อมูลในการพิมพ์
  10.     '// หาก eArgs.EOF = True จะเป็นการสิ้นสุดการพิมพ์
  11.     Private Sub arBarcode_FetchData(ByVal sender As Object, ByVal eArgs As DataDynamics.ActiveReports.ActiveReport.FetchEventArgs) Handles Me.FetchData
  12.         Count = Count + 1
  13.         ' หากนับได้ตรงตามจำนวนแล้วก็จะจบการทำงานในส่วนของการพิมพ์
  14.         If Count > CountCode Then
  15.             eArgs.EOF = True
  16.             Exit Sub

  17.         Else
  18.             ' End Of File เป็นเท็จ ก็คือมันยังไม่หมดข้อมูลของการพิมพ์
  19.             eArgs.EOF = False
  20.             ' กระโดดไปทำงานต่อที่ Detal1_Format เพื่อทำการพิมพ์รหัสบาร์โค้ดต่อ
  21.         End If
  22.     End Sub

  23.     '// รายละเอียดของการพิมพ์
  24.     Private Sub Detail1_Format(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Detail1.Format

  25.         ' จัดรูปแบบการพิมพ์รหัสบาร์โค้ดออกมา เช่น BeginCode = 199, ความยาว 9 ตัว
  26.         ' "0000000000" & 199 ... จะได้ ... "0000000000199"
  27.         ' พอนับจากทางขวามา 9 ตัว ก็จะถูกตัดเหลือ "000000199"
  28.         Barcode1.Text = Right("0000000000" & BeginCode, Val(frmPrintBarcode.cmbLength.Text))

  29.         ' การวางตำแหน่งของชุดคำสั่งนี้สำคัญมาก เพราะหากคุณวางไว้ก่อนบรรทัดข้างบน ผลที่ได้จะเกิด Logical Error
  30.         ' หรือได้ผลลัพธ์ออกมาไม่ตรงตามที่ต้องการ
  31.         BeginCode = BeginCode + 1

  32.         ' จากจุดนี้มันก็จะกระโดดไป arBarcode_FetchData เพื่อตรวจสอบว่า Count นับได้ครบตาม CountCode หรือไม่

  33.     End Sub

  34.     '// START HERE
  35.     Private Sub arBarcode_ReportStart(sender As Object, e As System.EventArgs) Handles Me.ReportStart
  36.         ' การตั้งค่าแบบ Run Time (มีหน่วยวัดเป็นนิ้ว ... แต่สามารถเปลี่ยนเป็น ซม. ได้ด้วย CmToInch)
  37.         With PageSettings
  38.             .Margins.Left = CmToInch(0.5)
  39.             .Margins.Right = CmToInch(0.5)
  40.             .Margins.Top = CmToInch(1)
  41.             .Margins.Bottom = CmToInch(1)
  42.             ' ตั้งค่ากระดาษแนวตั้ง
  43.             .Orientation = PageOrientation.Portrait
  44.             ' กระดาษขนาด A4
  45.             .PaperKind = Drawing.Printing.PaperKind.A4
  46.             ' กรณีที่กำหนดขนาดกระดาษเอง
  47.             ' .PaperKind = Drawing.Printing.PaperKind.Custom
  48.         End With

  49.         '/ กำหนดรูปแบบบาร์โค้ด (Barcode Style) ...
  50.         Select Case frmPrintBarcode.cmbStyle.SelectedIndex
  51.             Case 0
  52.                 Barcode1.Style = BarCodeStyle.Code_128_A
  53.             Case 1
  54.                 Barcode1.Style = BarCodeStyle.Code_128_B
  55.             Case 2
  56.                 Barcode1.Style = BarCodeStyle.Code_128_C
  57.         End Select
  58.         '// กำหนดจำนวนหลักในการพิมพ์ (ความกว้างของกระดาษ / จำนวนหลัก)
  59.         Select Case frmPrintBarcode.cmbColumn.SelectedIndex
  60.             Case 0
  61.                 Me.Detail1.ColumnCount = 3
  62.                 Me.Shape1.Width = CmToInch(6.58)
  63.                 Me.Barcode1.Width = CmToInch(6.18)
  64.             Case 1
  65.                 Me.Detail1.ColumnCount = 4
  66.                 Me.Shape1.Width = CmToInch(4.94)
  67.                 Me.Barcode1.Width = CmToInch(4.6)
  68.             Case 2
  69.                 Me.Detail1.ColumnCount = 5
  70.         End Select
  71.         '// พิมพ์กรอบหรือไม่
  72.         If frmPrintBarcode.chkPrintShape.Checked Then
  73.             Shape1.Visible = True
  74.         Else
  75.             Shape1.Visible = False
  76.         End If
  77.         ' เคลียร์ค่าตัวแปรเพื่อความแน่ใจ
  78.         ' Count = 0 : CountCode = 0 : BeginCode = 0

  79.         ' รับค่ารหัสบาร์โค้ดตัวแรกเข้ามา
  80.         BeginCode = Val(frmPrintBarcode.txtStartCode.Text)

  81.         ' นับจำนวนของการพิมพ์บาร์โค้ดทั้งหมด
  82.         ' CountCode = End - Begin + 1
  83.         ' ต้องบวกเพิ่มอีก 1 เพื่อให้ได้ค่าที่ถูกต้อง และจะใช้ตัวแปรนี้ในโปรแกรมย่อย FetchData events
  84.         CountCode = Val(frmPrintBarcode.txtEndCode.Text) - Val(frmPrintBarcode.txtStartCode.Text) + 1
  85.         '//
  86.     End Sub

  87. End Class
คัดลอกไปที่คลิปบอร์ด

ดาวน์โหลดโค้ดฉบับเต็ม VB.NET (2010) ได้ที่นี่ ...

ขออภัย! โพสต์นี้มีไฟล์แนบหรือรูปภาพที่ไม่ได้รับอนุญาตให้คุณเข้าถึง

คุณจำเป็นต้อง ลงชื่อเข้าใช้ เพื่อดาวน์โหลดหรือดูไฟล์แนบนี้ คุณยังไม่มีบัญชีใช่ไหม? ลงทะเบียน

x
สิ่งที่ดีกว่าการให้ คือการให้แบบไม่มีที่สิ้นสุด

1

กระทู้

6

โพสต์

81

เครดิต

Member

Rank: 2

เครดิต
81
โพสต์ 2021-3-2 16:06:41 | ดูโพสต์ทั้งหมด

อาจารย์ครับ ถ้าต้องการให้แท่ง Barcode Auto Size เปลี่ยนขนาดตามข้อความที่ Print มีวิธีการอย่างไรครับ
เพราะ ถ้าข้อความสั้น -- เส้น barcode ห่าง ถ้าข้อความยาว -- เส้น barcode ถี่

262

กระทู้

422

โพสต์

3751

เครดิต

ผู้ดูแลระบบ

Rank: 9Rank: 9Rank: 9

เครดิต
3751
 เจ้าของ| โพสต์ 2021-3-2 16:34:26 | ดูโพสต์ทั้งหมด

ooddog ตอบกลับเมื่อ 2021-3-2 16:06
อาจารย์ครับ ถ้าต้องการให้แท่ง Barcode Auto Size เปลี่ยนขนาดต ...

หน้าจอ Design AR แล้วเลือก Barcode ก่อน ... Properties --> AutoSize = True ครับผม
สิ่งที่ดีกว่าการให้ คือการให้แบบไม่มีที่สิ้นสุด
ขออภัย! คุณไม่ได้รับสิทธิ์ในการดำเนินการในส่วนนี้ กรุณาเลือกอย่างใดอย่างหนึ่ง ลงชื่อเข้าใช้ | ลงทะเบียน

รายละเอียดเครดิต

ข้อความล้วน|อุปกรณ์พกพา|ประวัติการแบน|G2GNet.com  

GMT+7, 2021-9-22 15:41 , Processed in 0.050089 second(s), 4 queries , File On.

Powered by Discuz! X3.4, Rev.62

Copyright © 2001-2020 Tencent Cloud.

ตอบกระทู้ ขึ้นไปด้านบน ไปที่หน้ารายการกระทู้