「宅配便 送り状」を印刷する専用のクラスをつくる(その3)

「宅配便 送り状」を印刷する専用のクラスのコードを書いてみた。
まだ改良の余地がありそうだ。

  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
ふーっ 疲れた