Framework 標準印刷処理

  実行環境、その他



↓で定義されたインターフェイスを持つデータベースクラスを使用しています
http://winofsql.jp/VA003334/dnettool080612185847.htm

フォームに最初からデザインされている印刷関連のコントロールは PrintPreviewDialog のみです

このコードのメインとなるクラスは別のソースコードにあります。このコードは Partial Class です


データを一行づつ読んで、改ページコントロールをする古典的な印刷処理とは違って、
イベント内が必ず1ページぶんの印刷をするという仕様なので、ヘッダー印刷がしやすいのが特徴です。

変数の持ち方は古典的で、ページカウンタと行カウンタがあり、
行カウンタは必ず次に印字する行を指しています。

イベント登録を AddHandler で行っているのは、デザイナの無いビルド環境でも印刷処理は
重要であるので、サンプル的に転用で間違いのないようにと思ったのと、汎用性を感じたからです



  コード





  
' /////////////////////////////////////////////////////////////////////
' 印刷処理
'
' 社員マスタメンテダイアログの処理メニューより実行されます
' PrintPreviewDialog のみコントロールとしてフォームの一部として定義
' ※ 少なくとも、Load イベント内でないと、表示位置の指定変更が
'    できなかったので、デザイナで記述できるようにしています
' PrintDocument に関しては、汎用性の為 New で作成しています
' /////////////////////////////////////////////////////////////////////
Imports System.Drawing.Printing

Partial Class 社員マスタメンテ

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

	' 印刷用の SQL
	Private Query As String = "select * from 社員マスタ"

	' ページの情報
	Private topMargin As Integer
	Private leftMargin As Integer
	Private prContext As System.Drawing.Graphics

	' ******************************************************
	' 印刷の呼び出し
	' ******************************************************
	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
		' 開始
		preview.ShowDialog()
		db.Close()

	End Sub

	' ******************************************************
	' 印刷プレビューの初期処理
	' ******************************************************
	Private Sub preview_Load(ByVal sender As System.Object, _
	 ByVal e As System.EventArgs) Handles preview.Load

		' デスクトップ左上
		preview.DesktopLocation = New System.Drawing.Point(0, 0)

	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, "対象データが存在しませんでした")
				e.HasMorePages = False
				Return
			End If
			pCnt = 0
		End If

		' ******************************************************
		' ページのタイトル
		' ******************************************************
		pCnt += 1
		PrString(1, "タイトル部分 : " + pCnt.ToString())
		PrString(2, "---------------------------------")
		pRow = 3

		' ******************************************************
		' ページの明細
		' ******************************************************
		Do While pRow <= pMax
			PrString(pRow, db.GetValue("氏名"))
			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 str As String)

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

	End Sub

End Class
  










  infoboard   管理者用   
このエントリーをはてなブックマークに追加





フリーフォントWEBサービス
SQLの窓WEBサービス

SQLの窓フリーソフト

素材

一般WEBツールリンク

SQLの窓

フリーソフト

JSライブラリ