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

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

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

Re[3]: 印刷用ツールの使い方について


(過去ログ 141 を表示中)

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

■82759 / inTopicNo.1)  印刷用ツールの使い方について
  
□投稿者/ 夜叉丸 (43回)-(2017/02/02(Thu) 10:21:56)

分類:[.NET 全般] 

PrintDocument pdoc が1つと
PrintPreviewControl ppcMain, ppcSub の2つがあります。

ppcMain.InvalidatePrevie();
ppcSub.InvalidatePrevie();

で現在同じものが表示され所まではいいのですが、
もともと、ppcMainと, ppcSubで表示内容を変えて表示したいので
private void pdoc_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
の中でどちらを描画するのか判断できればいいのですがその方法がわかりません。

このような時いつもなら、((Control)sender).Name == "ppcMain" 又は "ppcSub" で判断するのですが
今回の場合は ((Control)sender).Name がエラーになります。
もし取得できたとしても sender は pdoc だと思います。

試しに以下もやってみました。
ppcMain.CreateGraphics() == e.Graphics
ppcSub.CreateGraphics() == e.Graphics

やっぱり駄目でした。

もちろん方法としてはそれぞれ対の2組という方法ですが
pdocMain, ppcMain
pdocSub, ppcSub

これしか方法はないのでしょうか?

引用返信 編集キー/
■82761 / inTopicNo.2)  Re[1]: 印刷用ツールの使い方について
□投稿者/ shu (956回)-(2017/02/02(Thu) 12:29:06)
No82759 (夜叉丸 さん) に返信
> PrintDocument pdoc が1つと
> PrintPreviewControl ppcMain, ppcSub の2つがあります。
>
PrintPreviewControlが2つある意味は何でしょうか?


印刷処理が違うならPrintDocumentのオブジェクトはそれぞれ
用意された方がよいかと思います。
実装例として印刷用のクラスReport1, Report2などを用意して
PrintDocumentからの派生またはPrintDocumentのフィールドを
持つようにして印刷処理を分離するのもよいかもしれません。



引用返信 編集キー/
■82763 / inTopicNo.3)  Re[1]: 印刷用ツールの使い方について
□投稿者/ 魔界の仮面弁士 (1104回)-(2017/02/02(Thu) 13:33:28)
No82759 (夜叉丸 さん) に返信
> ppcMain.InvalidatePrevie();
> ppcSub.InvalidatePrevie();
× InvalidatePrevie
○ InvalidatePreview


> PrintPreviewControl ppcMain, ppcSub の2つがあります。
この 2 つは、どのような目的で使い分けられているのでしょうか?


> もちろん方法としてはそれぞれ対の2組という方法ですが
> pdocMain, ppcMain
> pdocSub, ppcSub
それぞれ別の内容を印刷したいのでは無いですか?

別帳票なのであれば、PrintDocument を 2 つ用意するべきかと思います。
フォームだって、別の画面なら Form1 と Form2 を別々に用意しますよね。


> もし取得できたとしても sender は pdoc だと思います。
PrintDocument を個別に用意していれば、もしもイベントハンドラが一つでも
 private void pdoc_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
 {
  var pd = (PrintDocument)sender;
  if(pdが帳票Aの場合) …
  if(pdが帳票Bの場合) …
 }
のようにまとめられます。(もちろん、イベントハンドラを個別に用意しても OK です)



> これしか方法はないのでしょうか?
PrintDocument が pdoc のみ、ということになりますと、pdoc_PrintPage 内では
ppcMain からなのか ppcSub からなのかは、判断できないと思います。

pdoc.Print(); で呼ばれた場合と区別するぐらいならできますが…。
引用返信 編集キー/
■82766 / inTopicNo.4)  Re[2]: 印刷用ツールの使い方について
□投稿者/ 夜叉丸 (44回)-(2017/02/02(Thu) 16:32:56)
No82763 (魔界の仮面弁士 さん) に返信

>>PrintPreviewControl ppcMain, ppcSub の2つがあります。
> この 2 つは、どのような目的で使い分けられているのでしょうか?

一部表示が違うだけの2種類の印刷をしたいのです。

> 別帳票なのであれば、PrintDocument を 2 つ用意するべきかと思います。
> フォームだって、別の画面なら Form1 と Form2 を別々に用意しますよね。

フォームのコンストラクタに引数で表示するデータを変えるのと同じ考えで。
こうなりました。

pdoc を2つ作ったら、pdocMain, pdocSub の両方を同じ設定にする必要が
有りますよね。
と、すれば

pdocSub = pdocMain; ← Main と同じ印刷状態にして
ppcSub.InvalidatePreview(); ← ビュー画面を表示


PrintPage は同じにして、表示の違うところだけ以下の方法を使うということですね?

  var pd = (PrintDocument)sender;
  if(pdが帳票Aの場合) …
  if(pdが帳票Bの場合) …

引用返信 編集キー/
■82767 / inTopicNo.5)  Re[3]: 印刷用ツールの使い方について
□投稿者/ 魔界の仮面弁士 (1106回)-(2017/02/02(Thu) 17:02:00)
2017/02/02(Thu) 18:00:20 編集(投稿者)

No82766 (夜叉丸 さん) に返信
> フォームのコンストラクタに引数で表示するデータを変えるのと同じ考えで。
> こうなりました。

その場合でも、
 Form2 f1 = new Form2(arg1, arg2);
 Form2 f2 = new Form2(arg3, arg4);
のように、フォームのインスタンスは 2 つ用意されますよね?

PrintDocument のインスタンスが 2 つ必要なのも、それと同じ理由です。


印刷処理の共通化、という点に関しては、たとえば
 pdocMain.PrintPage += (o, arg) => 印刷処理( main用引数, arg );
 pdocSub.PrintPage += (o, arg) => 印刷処理( sub用引数, arg );
のように、引数で動作を変える印刷処理メソッドやクラスを用意すれば OK。

あるいは No82763 で示したように、両インスタンスに対して
同じイベント実装を割り当て、sender で判定するのも手です。


> pdocSub = pdocMain; ← Main と同じ印刷状態にして
これでは意味がありません。

上記の場合、PrintDocument のインスタンスは一つだけであり、
それを「pdocMain」と「pdocSub」の二箇所から
参照している形になってしまいます。
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -