tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
[ツリー表示へ]  [ワード検索]  [Home]

タイトル Re: 改ページしても1枚の紙に印刷されてしまいます。
投稿日: 2005/07/20(Wed) 16:13
投稿者魔界の仮面弁士
# う。既に回答が付いていたようで……。でも、折角書いたので投稿しておこう。(^^;


> 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

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。