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

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

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

Re[4]: 印刷における通りのズレについて


(過去ログ 75 を表示中)

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

■44529 / inTopicNo.1)  印刷における通りのズレについて
  
□投稿者/ 裕猫 (56回)-(2009/12/11(Fri) 11:44:56)

分類:[C#] 

開発環境
 OS:WindowsXP SP3
 言語:VisualStudio2008Pro C#で開発をしております。 印刷に辿り着きまして出力はできるのですが文字の縦の通りがずれてしまいます。
0001製品A                         0010        30       100   100    20
0002製品B                         0009        50       200   200    15
0003製品C                         0008        60       300   300    20
0004製品D                         0007        50       120   200    30
0005製品E                         0006        15       150   120    30
0006製品F                         0005       125      1250   190    10
0007製品G                         0004        80       245    40    30
0008製品H                         0003       150       345    34    30
0009製品I                         0002       100       555    56    40
0010製品J                         0001        90       420    60    50
と印刷したいのですがどうしても
0001製品A                         0010        30       100   100    20
0002製品B                         0009        50       200   200    15
0003製品C                         0008        60       300   300    20
0004製品D                         0007        50       120   200    30
0005製品E                         0006        15       150   120    30
0006製品F                         0005       125       1250   190    10
0007製品G                         0004        80       245    40    30
0008製品H                         0003       150       345    34    30
0009製品I                        0002       100       555    56    40
0010製品J                        0001        90       420    60    50
となってしまいます。
                while (dr.Read())
                {
                    for (int c1 = 0; c1 < 6; c1++)
                    {
                        Tenso.OJ[c1] = dr[c1];
                    }
                    hin = Tenso.CSei();
                    印刷.Hontai[YY] = VBStrings.LeftB(hin.品番.PadRight(8), 4) + " " + VBStrings.LeftB(hin.品名.PadRight(60), 30)
                        + "  " + VBStrings.LeftB(hin.発注先.PadRight(8), 4) + "  " + VBStrings.RightB(hin.仕入原価.ToString().PadLeft(20), 10)
                         + " " + VBStrings.RightB(hin.定価.ToString().PadLeft(20), 10) + "  " + VBStrings.RightB(hin.在庫数.ToString().PadLeft(10), 5)
                        + "    " + VBStrings.RightB(hin.最低数.ToString().PadLeft(6), 3);
                    YY++;
                }

でデータを作り
        private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
        {
            for (int i = 0; i < 1000000; i++)
            {
                if (印刷.Hontai[i] == null) { break; }
                if ((i % 印刷.Peeji) == 0)
                {
                    if (i != 0) { e.HasMorePages = false; }
                    e.HasMorePages = true;
                    for (int X = 0; X < 印刷.P_HD; X++)
                    {
                        if (印刷.Hedda[X] == null)
                        {
                            e.Graphics.DrawString("", new Font("MS Pゴシック", 印刷.F_SIZE), Brushes.Black, 0, X * 印刷.M_PITCH);
                        }
                        else
                        {
                            e.Graphics.DrawString(印刷.Hedda[X], new Font("MS Pゴシック", 印刷.F_SIZE), Brushes.Black, 0, X * 印刷.M_PITCH);
                        }
                    }
                }
                e.Graphics.DrawString(印刷.Hontai[i], new Font("MS Pゴシック", 印刷.F_SIZE), Brushes.Black, 0, (i + 印刷.P_HD + 1) * 印刷.M_PITCH);
            }
            e.HasMorePages = false;
        }
で印刷するのですがなぜずれるのかわかりません。半角と全角の文字の大きさがおかしくなるのではないかと思っているのですが。なぜ?
プリンターが持つ文字を使うようにすれば良いと聞きましたが、それってどう設定すればいいのか?MSゴシックだののフォントの設定方法はありますが、プリンターが持つ文字を使うようにする設定方法に辿り着けません。アドバイスをお願いいたします。

引用返信 編集キー/
■44531 / inTopicNo.2)  Re[1]: 印刷における通りのズレについて
□投稿者/ επιστημη (2311回)-(2009/12/11(Fri) 11:56:31)
επιστημη さんの Web サイト
等幅フォントを指定して試してみました?
"MS Pゴシック"の'P'は"プロポーショナル"の意、つまり文字ごとに幅が異なります。

引用返信 編集キー/
■44532 / inTopicNo.3)  Re[1]: 印刷における通りのズレについて
□投稿者/ Jitta on the way (488回)-(2009/12/11(Fri) 12:05:00)
No44529 (裕猫 さん) に返信
> 印刷.Hontai[YY] = VBStrings.LeftB(hin.品番.PadRight(8), 4) + " " + VBStrings.LeftB(hin.品名.PadRight(60), 30)
> + " " + VBStrings.LeftB(hin.発注先.PadRight(8), 4) + " " + VBStrings.RightB(hin.仕入原価.ToString().PadLeft(20), 10)
> + " " + VBStrings.RightB(hin.定価.ToString().PadLeft(20), 10) + " " + VBStrings.RightB(hin.在庫数.ToString().PadLeft(10), 5)
> + " " + VBStrings.RightB(hin.最低数.ToString().PadLeft(6), 3);

StringBuilder か、string.Format を使いましょう。

> for (int i = 0; i < 1000000; i++)

百万の配列は、確保できないことがあるかもしれません。そんなときでも、百万個のデータ領域は、確保できることがあります。List を使いましょう。


> e.Graphics.DrawString("", new Font("MS Pゴシック", 印刷.F_SIZE), Brushes.Black, 0, X * 印刷.M_PITCH);
>
Pの付かない、プロポーショナルでないフォントを使いましょう。
> で印刷するのですがなぜずれるのかわかりません。半角と全角の文字の大きさがおかしくなるのではないかと思っているのですが。なぜ?

プロポーショナル フォントを使っているからです。このフォントは、文字の大きさで、一文字が占める幅が変わります。


> プリンターが持つ文字を使うようにすれば良いと聞きましたが、それってどう設定すればいいのか?

プリンターの仕様を調べて、同じフォントを使います。が、それが有効なのは、PostScript プリンターや、XPS プリンターです。
コードを理解してください。e.Graphics.DrowString は、紙の上に字を描く(漢字に注意)命令です。ここで作ってプリンターに送るのは、絵です。プリンターは、フォントを持つ必要がありません。
引用返信 編集キー/
■44533 / inTopicNo.4)  Re[1]: 印刷における通りのズレについて
□投稿者/ みきぬ (683回)-(2009/12/11(Fri) 12:58:58)
とりあえず、ループの中で毎回 Font オブジェクトを作るのはやめたほうがいいような気がする。
引用返信 編集キー/
■44535 / inTopicNo.5)  Re[2]: 印刷における通りのズレについて
□投稿者/ 裕猫 (57回)-(2009/12/11(Fri) 13:13:40)
No44531 (επιστημη さん) に返信
> 等幅フォントを指定して試してみました?
> "MS Pゴシック"の'P'は"プロポーショナル"の意、つまり文字ごとに幅が異なります。
>
MS 明朝にて試したところうまくいきました。等幅フォントとプロポーショナルは知りませんでした。まだまだ勉強不足です。ありがとうございました。

■44532 (Jitta on the way さん) に返信
>StringBuilder か、string.Format を使いましょう。
>> for (int i = 0; i < 1000000; i++)
>百万の配列は、確保できないことがあるかもしれません。そんなときでも、百万個のデータ領域は、確保できることがあります。List を使い>ましょう。
アドバイスありがとうございます。早速使ってみます。

おかげさまで2日間の悩みがあっというまに解決できました。ご協力ありがとうございました。
解決済み
引用返信 編集キー/
■44537 / inTopicNo.6)  Re[2]: 印刷における通りのズレについて
□投稿者/ 裕猫 (58回)-(2009/12/11(Fri) 13:23:53)
No44533 (みきぬ さん) に返信
> とりあえず、ループの中で毎回 Font オブジェクトを作るのはやめたほうがいいような気がする。
すみません。解決印つけている間に投稿してくださっていたので返事が遅れました。
private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
Font F_font = new Font("MS 明朝", 印刷.F_SIZE);
for (int i = 0; i < 1000000; i++)
{
if (印刷.Hontai[i] == null) { break; }
if ((i % 印刷.Peeji) == 0)
{
if (i != 0) { e.HasMorePages = false; }
e.HasMorePages = true;
for (int X = 0; X < 印刷.P_HD; X++)
{
if (印刷.Hedda[X] == null)
{
e.Graphics.DrawString("", F_font, Brushes.Black, 0, X * 印刷.M_PITCH);
}
else
{
e.Graphics.DrawString(印刷.Hedda[X], F_font, Brushes.Black, 0, X * 印刷.M_PITCH);
}
}
}
e.Graphics.DrawString(印刷.Hontai[i], F_font, Brushes.Black, 0, (i + 印刷.P_HD + 1) * 印刷.M_PITCH);
}
e.HasMorePages = false;
という書き方でよろしいでしょうか?Font 使い始めたばかりなので自信ないですが。
引用返信 編集キー/
■44539 / inTopicNo.7)  Re[3]: 印刷における通りのズレについて
□投稿者/ みきぬ (684回)-(2009/12/11(Fri) 14:19:02)
No44537 (裕猫 さん) に返信
> という書き方でよろしいでしょうか?

私が指摘した意図とはあっています。

> Font 使い始めたばかりなので自信ないですが。

フォントがどうこうというよりは、同じオブジェクトを毎回生成するのは効率が悪いよねってお話です。

引用返信 編集キー/
■44541 / inTopicNo.8)  Re[4]: 印刷における通りのズレについて
□投稿者/ 裕猫 (59回)-(2009/12/11(Fri) 15:03:55)
No44539 (みきぬ さん) に返信
> 私が指摘した意図とはあっています。
>
合っていてよかったです。
>>Font 使い始めたばかりなので自信ないですが。
>
> フォントがどうこうというよりは、同じオブジェクトを毎回生成するのは効率が悪いよねってお話です。
>
ご教授ありがとうございました。m(_ _)m
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -