コメント |
@HTML
<TABLE class="LboxTable" border="0" cellspacing="1" bgcolor="#000000">
<TR class="LboxTr"><TH class="LboxTh" bgcolor="#C0C0C0" nowrap></TH><TH class="LboxTh" bgcolor="#C0C0C0" nowrap>列名</TH><TH class="LboxTh" bgcolor="#C0C0C0" nowrap>型値</TH><TH class="LboxTh" bgcolor="#C0C0C0" nowrap>型定数</TH><TH class="LboxTh" bgcolor="#C0C0C0" nowrap>型名</TH><TH class="LboxTh" bgcolor="#C0C0C0" nowrap>最大桁</TH><TH class="LboxTh" bgcolor="#C0C0C0" nowrap>精度</TH><TH class="LboxTh" bgcolor="#C0C0C0" nowrap>主キー</TH><TH class="LboxTh" bgcolor="#C0C0C0" nowrap>デフォルト</TH><TH class="LboxTh" bgcolor="#C0C0C0" nowrap>型説明</TH></TR>
<TR class="LboxTr"><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>1</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>社員コード</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>130</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>adWChar</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>VARCHAR</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>4</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap></TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>1</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap></TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>Null で終了する Unicode 文字列</TD></TR>
<TR class="LboxTr"><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>2</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>氏名</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>130</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>adWChar</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>VARCHAR</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>50</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap></TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap></TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap></TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>Null で終了する Unicode 文字列</TD></TR>
<TR class="LboxTr"><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>3</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>フリガナ</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>130</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>adWChar</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>VARCHAR</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>50</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap></TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap></TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap></TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>Null で終了する Unicode 文字列</TD></TR>
<TR class="LboxTr"><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>4</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>所属</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>130</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>adWChar</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>VARCHAR</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>4</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap></TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap></TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap></TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>Null で終了する Unicode 文字列</TD></TR>
<TR class="LboxTr"><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>5</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>性別</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>3</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>adInteger</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>INT</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap></TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>10</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap></TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap></TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>4 バイトの符号付き整数</TD></TR>
<TR class="LboxTr"><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>6</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>作成日</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>7</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>adDate</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>DATETIME</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap></TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap></TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap></TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap></TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>日付値</TD></TR>
<TR class="LboxTr"><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>7</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>更新日</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>7</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>adDate</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>DATETIME</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap></TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap></TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap></TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap></TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>日付値</TD></TR>
<TR class="LboxTr"><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>8</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>給与</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>3</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>adInteger</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>INT</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap></TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>10</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap></TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap></TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>4 バイトの符号付き整数</TD></TR>
<TR class="LboxTr"><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>9</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>手当</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>3</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>adInteger</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>INT</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap></TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>10</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap></TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap></TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>4 バイトの符号付き整数</TD></TR>
<TR class="LboxTr"><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>10</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>管理者</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>130</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>adWChar</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>VARCHAR</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>4</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap></TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap></TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap></TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>Null で終了する Unicode 文字列</TD></TR>
<TR class="LboxTr"><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>11</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>生年月日</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>7</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>adDate</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>DATETIME</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap></TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap></TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap></TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap></TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>日付値</TD></TR>
</TABLE>
@HEND
↓ブラウザでダウンロード
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
↓印刷で使用している画像
http://lightbox.on.coocan.jp/image/title.png
http://lightbox.cocolog-nifty.com/photos/app/printsample2.jpg
↓B4 設定
@DIV
pd.DefaultPageSettings.PaperSize = New PaperSize("B4", 1012, 1433)
@END
↓画像と横罫線メソッド
@DIV
' ******************************************************
' 横罫線を行の真ん中に引く
' ******************************************************
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
↓画像と横罫線の呼び出し
@DIV
PrImage(title, 1, 100, -4)
PrHline(4, 0, 800)
@END
@DIV
' /////////////////////////////////////////////////////////////////////
' 印刷処理
' /////////////////////////////////////////////////////////////////////
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
@END
|