まだ改良の余地がありそうだ。
Public Class PrintForm送り状
Const PrintParamItemCount As Integer = 9 'フォーマットのパラメータ項目数
'
' 記載項目:印字項目の名称 主に判読性をあげるためのもの
' PrintOut:印刷するかどうか(0を指定すると印字されない項目)
' Font:印字に使う書体を指定する
' FontSize:文字の大きさ
' Rectangle:1を指定すると文字を矩形(Rectangle)の中に書く
' X1:印字開始位置(X)または矩形の座標点1
' Y1:印字開始位置(Y)または矩形の座標点2
' X2:矩形の座標点3
' Y2:矩形の座標点4
'
Const PrintElementItemCount As Integer = 10 '印字項目数
'
' 送付先_住所
' 送付先_会社名
' 送付先_部署担当
' 送付先_TEL
' 依頼主_住所
' 依頼主_会社名
' 依頼主_部署担当
' 依頼主_TEL
' 品名
' 印刷枚数
'
Public _PrintDocument As System.Drawing.Printing.PrintDocument
Dim PrintParam()() As String = New String(PrintParamItemCount)() {}
Dim PrintElement(PrintElementItemCount) As String
Private _送付先住所 As String
WriteOnly Property 送付先住所() As String
Set(ByVal value As String)
_送付先住所 = value
End Set
End Property
Private _送付先会社名 As String
WriteOnly Property 送付先会社名() As String
Set(ByVal value As String)
_送付先会社名 = value
End Set
End Property
Private _送付先部署担当 As String
WriteOnly Property 送付先部署担当() As String
Set(ByVal value As String)
_送付先部署担当 = value
End Set
End Property
Private _送付先TEL As String
WriteOnly Property 送付先TEL() As String
Set(ByVal value As String)
_送付先TEL = value
End Set
End Property
Private _依頼主住所 As String
WriteOnly Property 依頼主住所() As String
Set(ByVal value As String)
_依頼主住所 = value
End Set
End Property
Private _依頼主会社名 As String
WriteOnly Property 依頼主会社名() As String
Set(ByVal value As String)
_依頼主会社名 = value
End Set
End Property
Private _依頼主部署担当 As String
WriteOnly Property 依頼主部署担当() As String
Set(ByVal value As String)
_依頼主部署担当 = value
End Set
End Property
Private _依頼主TEL As String
WriteOnly Property 依頼主TEL() As String
Set(ByVal value As String)
_依頼主TEL = value
End Set
End Property
Private _品名 As String
WriteOnly Property 品名() As String
Set(ByVal value As String)
_品名 = value
End Set
End Property
Private _印刷枚数 As Integer
WriteOnly Property 印刷枚数() As Integer
Set(ByVal value As Integer)
_印刷枚数 = value
End Set
End Property
Public Sub New(ByVal PrinterSettings As Printing.PrinterSettings)
_PrintDocument = New System.Drawing.Printing.PrintDocument
_PrintDocument.PrinterSettings = PrinterSettings
_PrintDocument.DefaultPageSettings.PaperSize = New System.Drawing.Printing.PaperSize("送り状", 1000, 450)
AddHandler _PrintDocument.PrintPage, AddressOf PrintPage_送り状
Call initParam()
PageCounter = 1 'カウンタを初期値にする
End Sub
Private Sub initParam()
'パラメータファイル読み込みの設定
Dim ParamFileName As String = My.Application.Info.DirectoryPath.ToString() & "\PrintParam.ini"
Dim reader As New IO.StreamReader(ParamFileName, System.Text.Encoding.GetEncoding(932))
Try
Dim line As String
For LineCount As Integer = 0 To PrintParamItemCount
line = reader.ReadLine
If IsNothing(line) Then
Else
Dim param() As String
param = line.Split(",")
PrintParam(LineCount) = New String() {param(0), param(1), param(2), param(3), param(4), param(5), param(6), param(7), param(8), param(9)}
LineCount += 1
Application.DoEvents()
End If
Next
Catch ex As Exception
MsgBox("印刷用パラメータの設定時にエラーが発生しました。" & vbNewLine & ex.Message)
Finally
reader.Close()
End Try
End Sub
Private PageCounter As Integer '何枚分のデータを作成したかカウント
Private Sub PrintPage_送り状(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs)
'印刷する要素の設定:PrintParamのカウンタと一緒に処理するため1からはじめる。PrintParam(0)は印字項目の名称のため
PrintElement(1) = _送付先住所
PrintElement(2) = _送付先会社名
PrintElement(3) = _送付先部署担当
PrintElement(4) = _送付先TEL
PrintElement(5) = _依頼主住所
PrintElement(6) = _依頼主会社名
PrintElement(7) = _依頼主部署担当
PrintElement(8) = _依頼主TEL
PrintElement(9) = _品名
e.Graphics.PageUnit = GraphicsUnit.Millimeter
'印刷する要素の生成
For i As Integer = 1 To PrintElementItemCount - 1
If CInt(PrintParam(i)(1)) = 1 Then '要素を印刷するかどうか?(PrintOut)
If CInt(PrintParam(i)(4)) = 0 Then '要素を矩形内で折り返すかどうか?(Rectangle)
e.Graphics.DrawString(PrintElement(i), New Font(PrintParam(i)(2), CInt(PrintParam(i)(3))), Brushes.Black, CInt(PrintParam(i)(5)), CInt(PrintParam(i)(6)))
Else
'矩形内に文字を書く
e.Graphics.DrawString(PrintElement(i), New Font(PrintParam(i)(2), CInt(PrintParam(i)(3))), Brushes.Black, New Rectangle(CInt(PrintParam(i)(5)), CInt(PrintParam(i)(6)), CInt(PrintParam(i)(7)), CInt(PrintParam(i)(8))))
End If
End If
Next
If PageCounter = _印刷枚数 Then '複数枚印字するときに次のページが必要か?
e.HasMorePages = False
PageCounter = 1 'カウンタを初期値にする
Else
e.HasMorePages = True
PageCounter += 1
End If
End Sub
End Class
ふーっ 疲れた