|
' /////////////////////////////////////////////////////////////////////
' 印刷処理
'
' 社員マスタメンテダイアログの処理メニューより実行されます
' 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
| |