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

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

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

Re[2]: 印刷プレビューで2ページ分が重なるバグを解決したい


(過去ログ 88 を表示中)

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

■52716 / inTopicNo.1)  印刷プレビューで2ページ分が重なるバグを解決したい
  
□投稿者/ さんかく (12回)-(2010/08/23(Mon) 11:45:07)

分類:[ASP.NET (C#)] 

2010/08/23(Mon) 12:10:49 編集(投稿者)
いつもお世話になっています。

複数ページの印刷ドキュメントを、プレビューを表示してから印刷したいと考えています。
しかし、プレビュー画面では、「1ページと2ページ」、「3ページと4ページ」、「5ページと6ページ」・・・
というように、2ページ分が重なってしまいます。

この現象は、プレビューを用いなければ発生せず、正常に印刷することができました。

以下がソースになります。
動きとしては、新規プロジェクトからフォーム上にボタンを1つ置いて、ボタンを押すとプレビューを表示します。
ボタンを押すとプレビューを表示して10ページ作成し、各ページに「文字列0」「文字列1」と表示させるつもりで作成しました。

まずプレビューを用いない正常なソースです。
【プレビュー無し正常ソース】
    public partial class Form1 : Form
    {
        int i;

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            printDocument1.Print();
        }

        private void printDocument1_PrintPage
            (object sender, System.Drawing.Printing.PrintPageEventArgs e)
        {
            e.Graphics.DrawString("文字列"+i
                , new Font("MS Pゴシック", 20.0F), Brushes.Red, new Point(100, 100));

            if (i < 10)
            {
                e.HasMorePages = true;
            }
            else
            {
                e.HasMorePages = false;
            }
            i++;
        }

そして、プレビューがあって文字が重なるエラーが出るソースです。
【プレビュー有りエラーソース】
    public partial class Form1 : Form
    {
        int i;

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            printDocument1.PrintPage
                += new System.Drawing.Printing.PrintPageEventHandler(printDocument1_PrintPage);
            printPreviewDialog1.Document = printDocument1;
            printPreviewDialog1.ShowDialog();
        }

        private void printDocument1_PrintPage
            (object sender, System.Drawing.Printing.PrintPageEventArgs e)
        {
            e.Graphics.DrawString("文字列"+i
                , new Font("MS Pゴシック", 20.0F), Brushes.Red, new Point(100, 100));

            if (i < 10)
            {
                e.HasMorePages = true;
            }
            else
            {
                e.HasMorePages = false;
            }
            i++;
        }
    }

プレビュー画面からの印刷結果は違います(変数iをリセットしていない為)。
このエラープログラムを実行してみると、計6ページ作成され、各ページに「文字列0」と「文字列1」が重なったもの、
「文字列2」と「文字列3」が重なったもの・・・(中略)「文字列10」と「文字列11」が重なったものが作成されました。
『printDocument1_PrintPage』メソッドは11回呼び出されました。

試しに、

            if (i < 10)
            {
                e.HasMorePages = true;
            }

の部分の true を false に変更し、1ページのみ出力しようとすると、
計1ページ作成され、「文字列0」と「文字列1」が重なったものが作成されました。
『printDocument1_PrintPage』メソッドは2回呼び出されました。

どこかプログラムに不備があると思うのですが、わかりません。ご教授をお願いします。


参考サイトは以下を利用しました。

http://www.atmarkit.co.jp/fdotnet/dotnettips/397printmoredoc/printmoredoc.html (@IT の印刷方法)
http://www.atmarkit.co.jp/fdotnet/dotnettips/625printpreviewdlg/printpreviewdlg.html (@IT の印刷プレビュー)

よろしくお願いします。</pre></pre>

引用返信 編集キー/
■52723 / inTopicNo.2)  Re[1]: 印刷プレビューで2ページ分が重なるバグを解決したい
□投稿者/ さんかく (13回)-(2010/08/23(Mon) 14:17:42)
少し進展がありました。

根本的な原因特定と解決には至っていませんが、制御フラグを利用して意図した印刷プレビューと印刷が行えました。
以下がソースです。

    public partial class Form1 : Form
    {
        int i;
        const int MAXPAGE = 10;
        bool seigyoFlg;
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            seigyoFlg = false;
            printDocument1.PrintPage
                += new System.Drawing.Printing.PrintPageEventHandler(printDocument1_PrintPage);
            printPreviewDialog1.Document = printDocument1;
            printPreviewDialog1.ShowDialog();
        }

        private void printDocument1_PrintPage
            (object sender, System.Drawing.Printing.PrintPageEventArgs e)
        {
            if (seigyoFlg)
            {
                seigyoFlg = false;
                if (i >= MAXPAGE)
                {
                    i = 0;
                }
                return;
            }

            e.Graphics.DrawString("文字列" + i
                , new Font("MS Pゴシック", 20.0F), Brushes.Red, new Point(100, 100));

            if (i < MAXPAGE - 1)
            {
                e.HasMorePages = true;
            }
            else
            {
                e.HasMorePages = false;
            }
            i++;

            seigyoFlg = true;
        }
    }

「seigyoFlg」で原因のわからない2つ目の印刷を強制的に無かったことにして印刷しています。

【エラー】
「01」 ← ループ01[0] ループ02[1] (意味:1ページ目に、文字列0と、謎のループ後の文字列1が表示(印字))
「02」 ← ループ03[2] ループ04[3]
「03」 ← ループ05[4] ループ06[5]
「04」 ← ループ07[6] ループ08[7]
「05」 ← ループ09[8] ループ10[9]
「06」 ← ループ11[10] ループ12[11]

【苦肉の策でとりあえず正常印刷】

「01」 ← ループ01[0] ループ02[] (意味:1ページ目に、文字列0が印字され、謎のループの時には制御フラグにより、何もGraphicsに追加しない無駄な処理を行わせ文字列0のみが表示(印字))
「02」 ← ループ03[1] ループ04[]
「03」 ← ループ05[2] ループ06[]
「04」 ← ループ07[3] ループ08[]
「05」 ← ループ09[4] ループ10[]
「06」 ← ループ11[5] ループ12[]
「07」 ← ループ13[6] ループ14[]
「08」 ← ループ15[7] ループ16[]
「09」 ← ループ17[8] ループ18[]
「10」 ← ループ19[9] ループ20[]


どうしてこのように2回読み込まれるような動きになるのでしょうか。。
逆アセンブラでも無駄なループの読み出し部は追えませんでした。(力量不足もあります)

宜しくお願いします。

引用返信 編集キー/
■52725 / inTopicNo.3)  Re[2]: 印刷プレビューで2ページ分が重なるバグを解決したい
□投稿者/ さんかく (14回)-(2010/08/23(Mon) 14:51:48)
自己解決しました!!!!!

原因は、ハンドルの二重追加でした。

デザインビューより「printDocument1.PrintPage」を生成した際に、自動的に

>printDocument1.PrintPage
>                += new System.Drawing.Printing.PrintPageEventHandler(printDocument1_PrintPage);

が「Form1.Design.cs」に作られたことに気付かず、「Form1.cs」に同じ物を手動で追加していました。

サイトを参考にしたのはいいのですが、ハンドルの追加などの根本が疎かになってました。精進します。

また宜しくお願いします。

解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -