tagCANDY CGI VBレスキュー(花ちゃん) - VBレスキュー(花ちゃん)の投稿サンプル用掲示板 - Visual Basic 6.0 VB2005 VB2010
VB2005用トップページへVBレスキュー(花ちゃん)のトップページVB6.0用のトップページ
VBレスキュー(花ちゃん)の投稿サンプル用掲示板
     サンプル投稿用掲示板  VB2005 〜 用トップページ  VB6.0 用 トップページ
複数ページに渡ってテキストを印刷する(VB.NET)_1 ( No.1 )  [親スレッドへ]
日時: 2011/04/05 11:01
名前: 花ちゃん

***********************************************************************************
* カテゴリー:[印刷関係][][]                                                      *
* キーワード:改ページ処理,,,,,                                                   *
***********************************************************************************

-----------------------------------------------------------------------------------
Re: 改ページしても1枚の紙に印刷さ.. - 魔界の仮面弁士  2005/07/20-16:13 No.1917
-----------------------------------------------------------------------------------
# う。既に回答が付いていたようで……。でも、折角書いたので投稿しておこう。(^^;


> VB4.0 を少しやっていましたが、まったくの初心者です。

VB.NETの印刷処理は、VB4の時とは全く異なります。

そもそも、VB.NET においては、
 PrintPreviewDialog1.Document = PrintDocument1
 PrintPreviewDialog1.ShowDialog()
のような処理によって、
 Private Sub PrintDocument1_PrintPage〜〜〜
というイベントが呼び出される、という点までは理解されていますでしょうか。

まず、[PrintDocument] が、印刷処理の核となるオブジェクトです。
このオブジェクトの『PrintPageイベント』に、印刷内容を描画するための
処理を記述する事になります。

この PrintDocumentオブジェクトを、[PrintPreviewDialog] に割り当てれば、
印刷プレビュー画面が表示されますし、[PrintPreviewControl]に割り当てれば、
フォーム上にてプレビューを行うことができます。


そして、この『PrintPageイベント』は、印刷の各ページごとに呼び出されます。
また、PrintPageイベント内で『e.HasMorePages』を設定している部分が、
PrintDocumentに、改ページを指示する処理に当たります。

e.HasMorePages = True とすれば、『まだ、印刷したページが残っているので、
もう一回、PrintPageイベントを処理してください』という意味になりますし、
e.HasMorePages = False とすれば、『もう、印刷するページは残っていない』
という意味になります。


たとえば、VB4 で 3ページの文書を印刷する場合は、
 Private Sub Command1_Click()
  Printer.Print "1ページ目"
  Printer.NewPage   '改ページ
  Printer.Print "2ページ目"
  Printer.NewPage   '改ページ
  Printer.Print "3ページ目"
  Printer.EndDoc    '描画終了→印刷開始
 End Sub
のように、1回の呼び出しで、3ページ分の印刷処理を行っていました。

しかし、VB.NETの場合は異なります。
3ページの文書を印刷するなら、PrintPage自体が 3 回呼ばれます。
1回のPrintPageイベントで、3ページ分の印刷処理を行うわけではありません。


最初の1回目のPrintPageイベントの呼び出しでは、1ページ目の描画処理を
行う事になります。この時、「e.HasMorePages = True」と指定することで、
『まだページが残っているので、もう一回、イベントを呼び出してください』
という指示が送られる事になります。

これにより、2回目のPrintPageイベントの呼び出しが発生します。
ここで、2ページ目の描画処理を行います。さらに、3ページ目のデータを
印刷させるために、もう一度「e.HasMorePages = True」と指定しておきます。

3回目のPrintPageイベントの呼び出しが、最後の3ページ目の印刷処理です。
最後のページなので、今度は「e.HasMorePages = False」と指定し、印刷完了です。


> 行間隔を7oとって、20行で改ページのつもりなんですが、1枚の紙に2度打
> ちされるばかりです。
2度打ちされるのは、1回のイベントで、複数ページを印刷しようとしているからでしょうね。
上記に書いたように、1回のイベントでは、1ページ分の印刷処理だけを記述するようにします。


もし、ページ辺りの行数を20行にして印刷したいなら、たとえば、こんな感じでしょうか。

下記は、TextBox1の内容を印刷するサンプルです。
処理の流れがわかる様に、ページ数と行番号も印刷してみました。
# 折り返し・余白・行間等の制御は行っていません。細かい点は、適宜、書き換えてください。

Private Const MaxLine As Short = 20
Private CurrentPage As Short
Private CurrentLine As Short
Private TextLines() As String

Private Sub Button1_Click(ByVal sender As Object, _
             ByVal e As EventArgs) Handles Button1.Click
  TextLines = TextBox1.Lines
  PrintPreviewDialog1.Document = PrintDocument1
  CurrentLine = 0
  CurrentPage = 0
  PrintPreviewDialog1.ShowDialog()
End Sub

Private Sub PrintDocument1_PrintPage(ByVal sender As Object, _
        ByVal e As Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
  Dim g As Graphics = e.Graphics
  g.PageUnit = GraphicsUnit.Point
  e.HasMorePages = True
  CurrentPage += 1
  g.DrawString(CStr(CurrentPage) & "ページ", Me.Font, Brushes.Blue, 1, 1)
  For Line As Short = 1 To MaxLine
    CurrentLine += 1
    If CurrentLine > UBound(TextLines) Then
      '全てのデータを印刷し終わった場合
      e.HasMorePages = False
      Exit For
    Else
      g.DrawString(CStr(CurrentLine) & ": " & TextLines(CurrentLine), _
        Me.Font, Brushes.Black, 20, Line * 20)
    End If
  Next
End Sub



 [スレッド一覧へ] [親スレッドへ]