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
  




yahoo  google  MSDN  MSDN(us)  WinFAQ  Win Howto  tohoho  ie_DHTML  vector  wdic  辞書  天気 


[dnettool]
claudebot
24/04/18 10:03:49
InfoBoard Version 1.00 : Language=Perl

1 BatchHelper COMprog CommonSpec Cprog CprogBase CprogSAMPLE CprogSTD CprogSTD2 CprogWinsock Cygwin GameScript HTML HTMLcss InstallShield InstallShieldFunc JScript JScriptSAMPLE Jsfuncs LLINK OldProg OracleGold OracleSilver PRO PRObrowser PROc PROconePOINT PROcontrol PROftpclient PROjscript PROmailer PROperl PROperlCHAT PROphp PROphpLesson PROphpLesson2 PROphpLesson3 PROphpfunction PROphpfunctionArray PROphpfunctionMisc PROphpfunctionString PROsql PROvb PROvbFunction PROvbString PROvbdbmtn PROvbonepoint PROwebapp PROwin1POINT PROwinSYSTEM PROwinYOROZU PROwindows ProjectBoard RealPHP ScriptAPP ScriptMaster VBRealtime Vsfuncs a1root access accreq adsi ajax amazon argus asp aspSample aspVarious aspdotnet aw2kinst cappvariety centura ckeyword classStyle cmaterial cmbin cmdbapp cmenum cmlang cmlistbox cmstd cmstdseed cmtxt cs daz3d db dbCommon dbaccess dnettool dos download flex2 flex3 flex4 framemtn framereq freeWorld freesoft gimp ginpro giodownload google hdml home hta htmlDom ie9svg install java javaSwing javascript jetsql jquery jsp jspTest jspVarious lightbox listasp listmsapi listmsie listmsiis listmsnt listmspatch listmsscript listmsvb listmsvc memo ms msde mysql netbeans oraPlsql oracle oracleWiper oraclehelper orafunc other panoramio pear perl personal pgdojo pgdojo_cal pgdojo_holiday pgdojo_idx pgdojo_ref pgdojo_req php phpVarious phpguide plsql postgres ps r205 realC realwebapp regex rgaki ruby rule sboard sc scprint scquest sdb sdbquest seesaa setup sh_Imagick sh_canvas sh_dotnet sh_google sh_tool sh_web shadowbox shgm shjquery shvbs shweb sjscript skadai skywalker smalltech sperl sqlq src systemdoc tcpip tegaki three toolbox twitter typeface usb useXML vb vbdb vbsfunc vbsguide vbsrc vpc wcsignup webanymind webappgen webclass webparts webtool webwsh win8 winofsql wmi work wp youtube