ソース掲示板




すべてから検索

キーワード   条件 表示 現行ログ 過去ログ トピックス 名前 本文
【VB.NET】印刷処理サンプル ( No.0 )
日時: 2017/08/31 17:28
名前: lightbox



列名型値型定数型名最大桁精度主キーデフォルト型説明
1社員コード130adWCharVARCHAR41Null で終了する Unicode 文字列
2氏名130adWCharVARCHAR50Null で終了する Unicode 文字列
3フリガナ130adWCharVARCHAR50Null で終了する Unicode 文字列
4所属130adWCharVARCHAR4Null で終了する Unicode 文字列
5性別3adIntegerINT104 バイトの符号付き整数
6作成日7adDateDATETIME日付値
7更新日7adDateDATETIME日付値
8給与3adIntegerINT104 バイトの符号付き整数
9手当3adIntegerINT104 バイトの符号付き整数
10管理者130adWCharVARCHAR4Null で終了する Unicode 文字列
11生年月日7adDateDATETIME日付値
↓ブラウザでダウンロード http://lightbox.on.coocan.jp/r205/2008/DB_ACCESS_CLASS_PRINT.lzh ↓テスト用仮想印刷ドライバ( PrimoPDF ) http://www.xlsoft.com/jp/products/primopdf/index.html ↓改造用帳表設計書 http://winofsql.sakura.ne.jp/doc/excel/print_spec.xls ↓印刷で使用している画像 ↓B4 設定
pd.DefaultPageSettings.PaperSize = New PaperSize("B4", 1012, 1433)
↓画像と横罫線メソッド
' ******************************************************
' 横罫線を行の真ん中に引く
' ******************************************************
Private Sub PrHline(ByVal row As Integer, ByVal x As Integer, _
ByVal size As Integer)

	Dim yPos As Integer = 0
	yPos = _
	  topMargin + (row - 1) * pf.GetHeight(prContext) + _
	   pf.GetHeight(prContext) / 2
	prContext.DrawLine(Pens.Black, _
	 leftMargin + x, _
	 yPos, _
	 leftMargin + x + size, _
	 yPos)

End Sub

' ******************************************************
' 画像
' ******************************************************
Private Sub PrImage(ByVal title As Image, ByVal row As Integer, _
   ByVal x As Integer, ByVal offset As Integer)

	Dim yPos As Integer = 0
	yPos = topMargin + (row - 1) * pf.GetHeight(prContext)
	prContext.DrawImage(title, x + leftMargin, yPos + offset)

End Sub
↓画像と横罫線の呼び出し
PrImage(title, 1, 100, -4)
PrHline(4, 0, 800)
' /////////////////////////////////////////////////////////////////////
' 印刷処理
' /////////////////////////////////////////////////////////////////////
Imports System.Drawing.Printing
Imports lightbox.control

Partial Class MAIN

	' 印刷処理の実体
	Private pd As New PrintDocument()
	' 印刷用フォント( 文書は指定がなければ明朝 )
	Public pf As Font = New Font("MS 明朝", 12)
	' 1ページに印刷可能な行数
	Private pMax As Integer = 20
	' ページカウンタ
	Private pCnt As Integer = -1
	' /////////////////////////////////////////
	' ※※※ 次に印字する行 ※※※
	' /////////////////////////////////////////
	Private pRow As Integer = Nothing

	' 印刷用の SQL
	Private Query As String = ""

	' ページの情報
	Private topMargin As Integer
	Private leftMargin As Integer
	Private prContext As System.Drawing.Graphics
	Private title As Image = New Bitmap("..\..\title.png")

	' ******************************************************
	' 印刷の呼び出し
	' ******************************************************
	Private Sub 印刷ToolStripMenuItem_Click(ByVal sender As System.Object, _
	 ByVal e As System.EventArgs) Handles 印刷ToolStripMenuItem.Click

		' 初回のみの処理
		If pRow = Nothing Then
			pRow = 0
			AddHandler pd.PrintPage, AddressOf pd_PrintPage
			preview.Document = pd
		End If

		' ダイアログの大きさ
		preview.Width = 800
		preview.Height = 600

		' 倍率
		preview.PrintPreviewControl.Zoom = 1

		' DB 接続
		If Not db.Connect() Then
			MessageBox.Show("DB接続に失敗しました    ", _
			"エラー", MessageBoxButtons.OK, MessageBoxIcon.Error)
			Return
		End If

		' ///////////////////////////////
		' 開始
		' ///////////////////////////////
		' 【印刷設定】横向き
		pd.DefaultPageSettings.Landscape = True
		' 【印刷設定】マージン
		pd.DefaultPageSettings.Margins = New Margins(20, 20, 20, 20)
		'pd.DefaultPageSettings.PaperSize = New PaperSize("B4", 1012, 1433)

		Query = "select 社員コード,氏名,フリガナ,所属,性別,作成日,更新日"
		Query += ",iif(isnull(給与),0,給与) as 給与,iif(isnull(手当),0,手当) as 手当"
		Query += ",管理者,生年月日 from 社員マスタ"

		Try
			preview.ShowDialog()
		Catch ex As Exception
			LboxText.MessageOk("Windows の印刷サービスが起動しているか確認して下さい")
			Application.Exit()
		End Try

		db.Close()

	End Sub


	' ******************************************************
	' 実際の印刷処理
	' ******************************************************
	Private Sub pd_PrintPage(ByVal sender As System.Object, _
	ByVal e As System.Drawing.Printing.PrintPageEventArgs)

		' ページ内で印字可能な行数
		Dim linesPerPage As Integer = 0
		' 印字する為の y 座標
		Dim yPos As Integer = 0
		' 左側余白
		leftMargin = e.MarginBounds.Left
		' 上側余白
		topMargin = e.MarginBounds.Top
		prContext = e.Graphics

		' 余白を除いた高さをフォントの高さで割る
		linesPerPage = e.MarginBounds.Height / pf.GetHeight(e.Graphics)


		' 初回のみ select 実行
		If pCnt = -1 Then
			If Not db.QueryAndRead(Query) Then
				db.Close()
				PrString(1, 0, "対象データが存在しませんでした")
				e.HasMorePages = False
				Return
			End If
			pCnt = 0
		End If

		' ******************************************************
		' ページのタイトル
		' ******************************************************
		pCnt += 1

		' 画像をタイトルとして印字
		PrImage(title, 1, 100, -4)
		' ページカウンタ
		PrString(1, 700, "page:" + pCnt.ToString())
		' 列タイトル
		PrString(3, 0, "CD")
		PrString(3, 40, "氏名")
		PrString(3, 140, "フリガナ")
		PrString(3, 320, "     給与")
		PrString(3, 400, "     手当")
		' 横罫線
		PrHline(4, 0, 800)
		pRow = 5

		' ******************************************************
		' ページの明細
		' ******************************************************
		Do While pRow <= pMax
			PrString(pRow, 0, db.GetValue("社員コード"))
			PrString(pRow, 40, db.GetValue("氏名"))
			PrString(pRow, 140, db.GetValue("フリガナ"))
			PrString(pRow, 320, NumberFormat(db.GetValue("給与"), 9))
			PrString(pRow, 400, NumberFormat(db.GetValue("手当"), 9))
			If Not db.Read() Then
				' 全てのページが終了
				e.HasMorePages = False
				pCnt = -1	' 次に備えて、ページの初期化
				Return
			End If
			' 1 行カウントアップ
			pRow += 1
		Loop

		' ******************************************************
		' 次のページの準備
		' ******************************************************
		' 次ページ有り
		e.HasMorePages = True


	End Sub

	' ******************************************************
	' 文字列を指定位置から印字
	' ******************************************************
	Private Sub PrString(ByVal row As Integer, ByVal x As Integer, ByVal str As String)

		Dim yPos As Integer = 0
		yPos = topMargin + (row - 1) * pf.GetHeight(prContext)
		prContext.DrawString(str, pf, Brushes.Black, leftMargin + x, yPos)

	End Sub

	' ******************************************************
	' 数値編集 + 右寄せ用のサイズ指定
	' ******************************************************
	Private Function NumberFormat(ByVal num As Integer, _
	ByVal size As Integer) As String

		Dim ret As String = String.Format("{0:#,0}", num)
		ret = ret.PadLeft(size)
		Return ret

	End Function

	' ******************************************************
	' 横罫線を行の真ん中に引く
	' ******************************************************
	Private Sub PrHline(ByVal row As Integer, ByVal x As Integer, _
	ByVal size As Integer)

		Dim yPos As Integer = 0
		yPos = _
		  topMargin + (row - 1) * pf.GetHeight(prContext) + _
		   pf.GetHeight(prContext) / 2
		prContext.DrawLine(Pens.Black, _
		 leftMargin + x, _
		 yPos, _
		 leftMargin + x + size, _
		 yPos)

	End Sub

	' ******************************************************
	' 画像
	' ******************************************************
	Private Sub PrImage(ByVal title As Image, ByVal row As Integer, _
	   ByVal x As Integer, ByVal offset As Integer)

		Dim yPos As Integer = 0
		yPos = topMargin + (row - 1) * pf.GetHeight(prContext)
		prContext.DrawImage(title, x + leftMargin, yPos + offset)

	End Sub

End Class