tagCANDY CGI VBレスキュー(花ちゃん) - 複数ページに渡ってテキストを印刷する(VB.NET) - Visual Basic 6.0 VB2005 VB2010
VB2005用トップページへVBレスキュー(花ちゃん)のトップページVB6.0用のトップページ
複数ページに渡ってテキストを印刷する(VB.NET)
元に戻る スレッド一覧へ 記事閲覧
このページ内の検索ができます。(AND 検索や OR 検索のような複数のキーワードによる検索はできません。)

複数ページに渡ってテキストを印刷する(VB.NET) [No.148の個別表示]
     サンプル投稿用掲示板  VB2005 〜 用トップページ  VB6.0 用 トップページ
日時: 2007/09/16 18:47
名前: 花ちゃん

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

元質問:改ページしても1枚の紙に印刷されて.. - 浦島太郎  2005/07/20-11:05 No.1910

テキストファイルを開いて印刷をしようとしていますが、改ページができません
行間隔を7oとって、20行で改ページのつもりなんですが、1枚の紙に2度打
ちされるばかりです。

-----------------------------------------------------------------------------------
Re^3: 改ページしても1枚の紙に印刷.. - 花ちゃん  2005/07/20-15:48 No.1916
-----------------------------------------------------------------------------------
> 例の実行結果を教えてください。もう一度考えてみます。

サンプルがあるのですから、ご自分で色々設定を変えて見て試して頂いたら、ご理解できるかと
思うのですが、e.HasMorePages は、VB6.0 の改ページ動作とは違います(ヘルプ参照)
従ってPrintDocument1_PrintPage イベントに送るデータは1ページ分づつになり
PrintDocument1_PrintPage イベントを抜けた時に改ページが行れます。その時に
e.HasMorePages =True に設定するともう一度PrintDocument1_PrintPage イベント を呼び出し
残りの文書を印刷できるようになるのです。
下記を一度試して見て下さい。

    Private prpg As Integer         '印字ページのフラグ
    Private count As Integer        '印字済み行数
    Private pgMax As Integer = 45   '印字する総行数
    Private pagno As Integer        '印字ページの番号
    Private kara As Integer
    Private myText(45) As String

    Private Sub Button1_Click(ByVal sender As System.Object, _
                              ByVal e As System.EventArgs) Handles Button1.Click
        Dim i As Integer
    '実際はテキストファイルを行毎に配列に入れて下さい。
        For i = 0 To 45
            myText(i) = i & "  印刷する文書の1行分のデータ"
        Next

        PrintDocument1.Print()

    End Sub

    Private Sub PrintDocument1_PrintPage(ByVal sender As Object, _
        ByVal e As System.Drawing.Printing.PrintPageEventArgs) _
            Handles PrintDocument1.PrintPage

        Dim i As Integer
        Dim g As Graphics = e.Graphics
        Dim ln As Integer = 0

        'ミリメートルを長さの単位に指定します。
        g.PageUnit = GraphicsUnit.Millimeter
        Select Case prpg
            Case 0      '1ページ分のデータを印字

                For i = kara To kara + 9
                    ln += 1
                    g.DrawString(myText(i), _
                            New Font("MS Pゴシック", 12), Brushes.Black, 20, ln * 25)
                    count += 1
                Next i
                e.HasMorePages = True
            Case 1          '残りの行数を印字
                e.HasMorePages = False

                For i = kara To pgMax
                    ln += 1
                    g.DrawString(myText(i), _
                            New Font("MS Pゴシック", 12), Brushes.Black, 20, ln * 25)
                Next i
  '追加分ここから
                '印刷プレビューでもこのイベントは呼び出されるので初期化が必要
                kara = 0
                prpg = 0
                count = 0
                Exit Sub
  '追加分ここまで
        End Select
        If ((pgMax - count) / 10) > 1 Then
            kara = i
            prpg = 0        '次のページを印字
        Else
            kara = i
            prpg = 1        '最後のページを印字
        End If
    End Sub

-----------------------------------------------------------------------------
投稿時間:2005/07/21(Thu) 10:31
投稿者名:花ちゃん

念の為、印刷プレビュー等を表示する場合、再度 PrintDocument3_PrintPage イベントが
呼ばれますので使用したカウント用変数は、PrintDocument3_PrintPage イベント内の最後に
印刷した後でクリアしておいて下さい、でないとプレビューしてから印刷すると印刷物が
ないので印刷されません。
(どちらのサンプル(下記の魔界の仮面弁士さんの投稿コードも)でも必要です)
メンテ

Page: 1 |

複数ページに渡ってテキストを印刷する(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
メンテ

Page: 1 |

 投稿フォーム               スレッド一覧へ
題  名 スレッドをトップへソート
名  前
パスワード (記事メンテ時に使用)
投稿キー (投稿時 投稿キー を入力してください)
コメント

   クッキー保存   
スレッド一覧へ