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

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

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

Re[2]: PrintDocumentの実装方法


(過去ログ 113 を表示中)

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

■66998 / inTopicNo.1)  PrintDocumentの実装方法
  
□投稿者/ のぶ (29回)-(2013/06/17(Mon) 15:17:16)

分類:[C#] 

現在C#で、印刷を行うものを作成中です。
その中でほぼ同じ内容の帳票を2種類印刷しなくてはならず、その実装方法で悩んでいます。
2種類の違いは罫線の色と、文字列が多少違うという程度です。
なので、PrintDocumentを継承した共通部分を描画するクラス(PrintDocumentBaseクラス)を作成し、
それを継承したRedPrintDocumentクラス、BluePrintDocumentクラスを作成してみました。

それぞれ以下のようにしてみました。

public class PrintDocumentBase : PrintDocument
{
Color borderColor;
Font fntMincho;
Pen borderPen;
Brush brush;
Graphics grp;

protected PrintDocumentBase(Color borderColor)
{
this.borderColor = borderColor;
}

protected override void OnBeginPrint(PrintEventArgs e)
{
base.OnBeginPrint(e);
fntMincho = new Font("MS 明朝", 25);
borderPen = new Pen(borderColor);
brush = Brushes.Black;
}

protected override void OnEndPrint(PrintEventArgs e)
{
base.OnEndPrint(e);
fntMincho.Dispose();
borderPen.Dispose();
brush.Dispose();
grp.Dispose();
}

protected override void OnPrintPage(PrintPageEventArgs e)
{
base.OnPrintPage(e);
grp = e.Graphics;
DrawBorder();
DrawCommonString();
}

private void DrawCommonString()
{
grp.DrawString("てst", fntMincho, brush, 10, 10);
}

private void DrawBorder()
{
grp.DrawRectangle(borderPen, 10, 10, 100, 100);
grp.DrawRectangle(borderPen, 110, 10, 100, 100);
}
}



public class RedPrintDocument : PrintDocumentBase
{
private RedPrintDocument(Color color):base(color)
{
}
}


public class BluePrintDocument : PrintDocumentBase
{
private BluePrintDocument(Color color) : base(color)
{

}
}

しかしこれではRed、Blueを扱う際に
new RedPrintDocument(Color.Red)
と書かなければならず、ものすごく気持ち悪い実装(RedPrintDocumentクラスなのにコンストラクタで赤を指定)になってしまいます。

そこでPrintDocumentBaseクラスに
abstract static PrintDocument CreateInstance()
というようなメソッドが定義できれば私のやりたい事(コンストラクタでColorを指定する事の隠ぺい)が達成されるかと思いましたが、
当然のようにエラーになりました。

また、Factoryパターンを適用できればいいのかも?と思いましたが
デザインパターンを適用した経験がなく、実装できませんでした。

どのようにするのが良いのかが全く見えなくなってしまったので、どなたかご教示頂きたいと思います。
引用返信 編集キー/
■66999 / inTopicNo.2)  Re[1]: PrintDocumentの実装方法
□投稿者/ ハワーイ (1回)-(2013/06/17(Mon) 15:35:58)
2013/06/17(Mon) 15:39:05 編集(投稿者)

多分、こうしたいのではないでしょうか。
これならばRed(Blue)PrintDocumentコンストラクタに引数を割り当てる必要はありません。

public class RedPrintDocument : PrintDocumentBase
{
public RedPrintDocument():base(Color.Red)
{
}
}


引用返信 編集キー/
■67000 / inTopicNo.3)  Re[2]: PrintDocumentの実装方法
□投稿者/ のぶ (30回)-(2013/06/17(Mon) 15:50:37)
2013/06/17(Mon) 16:37:39 編集(投稿者)

No66999 (ハワーイ さん) に返信

ご回答ありがとうございます。
また、コード量が多いのに図表モードになっていなくてすみませんでした。

> 多分、こうしたいのではないでしょうか。
> これならばRed(Blue)PrintDocumentコンストラクタに引数を割り当てる必要はありません。
>
> public class RedPrintDocument : PrintDocumentBase
> {
> public RedPrintDocument():base(Color.Red)
> {
> }
> }

この方法で全く問題ありませんでした。
一番最初にこの方法で書いた時に「0個の引数を指定できません」というようなエラーが出て
じゃあ引数書かないといけないのか・・・と思ってそれぞれ書いていました。

しかし、いま確認するとなんのエラーも表示されませんでした。
こんなにもお早くご回答いただけてうれしい限りです!
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -