C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: 印刷時のpd_PrintPageメソッドが膨大になる?


(過去ログ 111 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■65650 / inTopicNo.1)  印刷時のpd_PrintPageメソッドが膨大になる?
  
□投稿者/ のぶ (1回)-(2013/03/13(Wed) 11:40:06)

分類:[C#] 

C#で印刷を行おうとする場合、以下のような処理になるかと思います。
private void button1_Click(object sender, EventArgs e)
{
    PrintDocument pd = new PrintDocument();
    pd.PrintPage += new PrintPageEventHandler(pd_PrintPage);
    pd.Print();
}

private void pd_PrintPage(object sender, PrintPageEventArgs e)
{
    //描画処理
}

この際、例えば婚姻届のような表形式&文字列等を描画(印刷)しなければならない場合
pd_PrintPageメソッドの中身が膨大になるかと思います。

膨大になるとどうしても読みづらくなるので回避したいと考えています。
それともそこまで気にせず実装してしまってもいいのでしょうか?
通常皆様ならどの様に実装されるのかお教え下さい。

引用返信 編集キー/
■65651 / inTopicNo.2)  Re[1]: 印刷時のpd_PrintPageメソッドが膨大になる?
□投稿者/ shu (222回)-(2013/03/13(Wed) 11:47:26)
No65650 (のぶ さん) に返信

PrintDocumentの派生クラスまたはラッピングクラスを作成し
描画処理はパート毎にメソッド分けしています。コンポーネントを
使いたいようでしたらクラスに渡すようにしてもよいかもしれません。
引用返信 編集キー/
■65660 / inTopicNo.3)  Re[2]: 印刷時のpd_PrintPageメソッドが膨大になる?
□投稿者/ のぶ (2回)-(2013/03/13(Wed) 15:14:30)
No65651 (shu さん) に返信

早速のご回答ありがとうございます。
PrintDocumentの派生クラスですか。。。
私なりに考えてみたものの、PrintDocumentから派生させてもGraphicsのDraw○○を扱う事になり
結果として同じ状態になりそうです。

== イメージ ==
calss HogePrintDocument : PrintDocument
{
//ここに描画処理(に相当するメソッド?)が実装される?
}
==============
このようなイメージになるのでしょうか?
私の知識が乏しいせいですが、イマイチ理解できないのでよろしければもう少しお教え下さい。
引用返信 編集キー/
■65662 / inTopicNo.4)  Re[3]: 印刷時のpd_PrintPageメソッドが膨大になる?
□投稿者/ shu (223回)-(2013/03/13(Wed) 15:36:50)
No65660 (のぶ さん) に返信
> == イメージ ==
> calss HogePrintDocument : PrintDocument
> {
> //ここに描画処理(に相当するメソッド?)が実装される?
> }
> ==============
> このようなイメージになるのでしょうか?
> 私の知識が乏しいせいですが、イマイチ理解できないのでよろしければもう少しお教え下さい。

ちょっと前のスレの私のレスより。そしてちょっと手を加えてあります。
VBですが同じような感じで出来ると思います。
Font, Brush, PenなどがPrivateで定義されているためセクション毎に処理を分けるのが
楽だと思います。他に現在の印字位置を保持する変数をもうけるとよいかもしれません。
同じ書き方をFormの中に埋め込むという方法もできなくはないですが、印刷処理が
1クラスにまとまっているので分かりやすくなると思います。

Public Class MyReport
    Inherits PrintDocument

    Public データを保存するための変数

    Private fnt1 as font
    Private fnt2 as font
    Private fnt3 as font

    Private brs1 as brush
    Private brs2 as brush
    Private brs3 as brush

    Private pen1 as Pen
    Private pen2 as Pen
    Private pen3 as Pen

    Private grp as Graphic

    Private データ位置を保存する為の変数

    Private Sub MyReport_BeginPrint(sender As Object, e As System.Drawing.Printing.PrintEventArgs) Handles Me.BeginPrint
       font,brush,Pen初期化

       データ開始の為の初期化
    End Sub

    Private Sub MyReport_EndPrint(sender As Object, e As System.Drawing.Printing.PrintEventArgs) Handles Me.EndPrint
       font,brush,Pen破棄
    End Sub

    Private Sub MyReport_PrintPage(sender As Object, e As System.Drawing.Printing.PrintPageEventArgs) Handles Me.PrintPage

        grp = e.Graphic

        If 1ページ目 Then
            PrintReportHead()
        End If
        PrintPageHead()
        PrintDetailPart1()
        PrintDetailPart2()
        PrintDetailPart3()
        PrintPageFoot()

        If ページ継続条件 Then
            e.HasMorePages = True
        Else
            PrintReportFoot
            e.HasMorePages = False
        End If
    End Sub
End Class

引用返信 編集キー/
■65665 / inTopicNo.5)  Re[4]: 印刷時のpd_PrintPageメソッドが膨大になる?
□投稿者/ のぶ (3回)-(2013/03/13(Wed) 17:44:27)
No65662 (shu さん) に返信

ソースコードのご提示ありがとうございます。
イメージは掴むことが出来たと思います。

最後に数点お教え下さい。
・「データを保存するための変数」というのは実際に描画するデータ(例えば自作のUserクラス等々)
・「データ位置を保存する為の変数」というのはPointF等のような描画する位置を保持できるもの
・PrintPageHead()等はgrpを渡してそれぞれメソッド内で描画を行う
以上のように考えましたが、間違ってはいないでしょうか?

何度も聞いてお手数だとは思いますが、よろしくお願いいたします。
引用返信 編集キー/
■65666 / inTopicNo.6)  Re[5]: 印刷時のpd_PrintPageメソッドが膨大になる?
□投稿者/ shu (225回)-(2013/03/13(Wed) 17:58:08)
No65665 (のぶ さん) に返信
> 最後に数点お教え下さい。
> ・「データを保存するための変数」というのは実際に描画するデータ(例えば自作のUserクラス等々)
そうです。

> ・「データ位置を保存する為の変数」というのはPointF等のような描画する位置を保持できるもの
〜Reportなどでデザインするとテキスト位置などをLeft,Top,Width,Height相当のもので表すことが
多いと思いますがそれです。定数でもよいのですが外的要因で位置が可変になることもあると思いますので
変数と書きました。実際は定数+変数になると思います。

> ・PrintPageHead()等はgrpを渡してそれぞれメソッド内で描画を行う
private変数なので渡す必要はないです。



引用返信 編集キー/
■65682 / inTopicNo.7)  Re[6]: 印刷時のpd_PrintPageメソッドが膨大になる?
□投稿者/ のぶ (4回)-(2013/03/14(Thu) 10:29:20)
No65666 (shu さん) に返信

お返事遅くなり申し訳ありません。
おおむね理解できたと思いますので、実際に手を動かしてみたいと思います。

>>・PrintPageHead()等はgrpを渡してそれぞれメソッド内で描画を行う
> private変数なので渡す必要はないです。
お恥ずかしい・・・private変数で保持していましたね。


何度もありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -