tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルPrintPreviewDialogでの印刷ボタン
記事No6994
投稿日: 2008/02/12(Tue) 15:02
投稿者ひでと
PrintPreviewDialogで印刷のボタンを押すとページの最後のページだけが
印刷されます。(表示は複数ページがされています)
表示されているすべてのページはPrintPreviewDialogの印刷ボタンからは
印刷できないのでしょうか?
また、もし印刷できないのならば、「印刷」ボタンを非表示に設定できないのでしょうか?

    Private Sub Button3_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button3.Click
        Dim Ret As DialogResult
        PrintPreviewDialog1.Document = Me.PrintDocument1
        Ret = PrintPreviewDialog1.ShowDialog()
    End Sub

[ツリー表示へ]
タイトルRe: PrintPreviewDialogでの印刷ボタン
記事No6995
投稿日: 2008/02/12(Tue) 15:23
投稿者花ちゃん
まず、ここのサンプル等を試して動作を確認(理解)して見て下さい。
複数のページに渡ってテキストを印刷する も掲載している事だし、前回の件でも
そうだし、

# 質問して、レスをもらったら速やかに返事をするようにしないと、今後、何方からも
 レスがつきませんよ。
 都合が悪くてレスが遅れるようなら、その旨を質問時に書き添えるとか。

[ツリー表示へ]
タイトルRe^2: PrintPreviewDialogでの印刷ボタン
記事No6996
投稿日: 2008/02/12(Tue) 15:44
投稿者ひでと
申し訳ありません。
> まず、ここのサンプル等を試して動作を確認(理解)して見て下さい。
> 複数のページに渡ってテキストを印刷する も掲載している事だし、前回の件でも
> そうだし、
VB.NET Tips一覧 からたどる 複数ページの項目がエラーとなりまして
内容がみれません。
どのように表示すればよいでしょうか?

> # 質問して、レスをもらったら速やかに返事をするようにしないと、今後、何方からも
>  レスがつきませんよ。
>  都合が悪くてレスが遅れるようなら、その旨を質問時に書き添えるとか。

申し訳ありません。仕事場からお伺いしておりますので、
休日が入りますとアクセスでません。
週末にはお伺いしないように気をつけますので、これからもよろしくお願いします。

[ツリー表示へ]
タイトルRe^3: PrintPreviewDialogでの印刷ボタン
記事No6997
投稿日: 2008/02/12(Tue) 15:55
投稿者ひでと
補足します。
実際の印刷(プリンター EPSON Offirio LP6100)
では 思うように複数ページ(DataGridViewに内容を書いてます)が印刷できていますので、
プレビューダイアログの関係だと思います。

[ツリー表示へ]
タイトルRe^3: PrintPreviewDialogでの印刷ボタン
記事No6998
投稿日: 2008/02/12(Tue) 16:09
投稿者花ちゃん
> VB.NET Tips一覧 からたどる 複数ページの項目がエラーとなりまして
> 内容がみれません。
> どのように表示すればよいでしょうか?

どこを見ているのですか?

http://hanatyan.sakura.ne.jp/bbs/wforum.cgi?mode=allread&no=1910

の No.1916 と No.1917 にそれぞれ私の投稿分と魔界の仮面弁士さんの投稿コードが
ありませんか?

# リンクは旧のサイトの掲示板なので、リンクの最後の数字は、投稿サンプルNo.に
 なっているので、この掲示板のそのNo.(1244)になりますし、
  PrintDocument−改頁について - 花ちゃん 12/29-18:22 No.1244  のように
 記載されているので、タイトルなり、投稿No. で調べれば済む事ではないですか?

[ツリー表示へ]
タイトルRe^4: PrintPreviewDialogでの印刷ボタン
記事No7001
投稿日: 2008/02/12(Tue) 16:42
投稿者ひでと
たびたび申し訳ありません。
> どこを見ているのですか?
>
> http://hanatyan.sakura.ne.jp/bbs/wforum.cgi?mode=allread&no=1910
>
> の No.1916 と No.1917 にそれぞれ私の投稿分と魔界の仮面弁士さんの投稿コードが
> ありませんか?
>
> # リンクは旧のサイトの掲示板なので、リンクの最後の数字は、投稿サンプルNo.に
>  なっているので、この掲示板のそのNo.(1244)になりますし、
>   PrintDocument−改頁について - 花ちゃん 12/29-18:22 No.1244  のように
>  記載されているので、タイトルなり、投稿No. で調べれば済む事ではないですか?
上記のリンク先ですが
「掲示板への直接アクセスは禁止です。メニューから表示して下さい。」
となり表示できません。Noを教えていただいたのでそちらか調べられました。

ただ ダイアログボックスの「印刷」ボタンに関しての記載では無いと思いますが...。
現状、プレビュー画面にはすべてのページが表示できます。
また、ダイアログボックスのページ移動のコントロールで、
ページの切り替えも出来ています。
ダイアログボックスを閉じて、別のボタンから印刷させると1ページ目から、
正常に印刷できています。
したがって印刷プレビュー、そして 印刷の中でのページ変数の初期化は
出来ていると思います。

印刷プレビューでページを移動した場合でも、
印刷プレビュー内にあります「印刷」ボタンから印刷しようとすると、
移動したページでは無く、Documet1で記載した最後のページ
だけが印刷されてしまうようなのです。
「印刷」ボタン(プレビュー内)を押したときに印刷するページの範囲を
制御する方法は無いでしょうか?

[ツリー表示へ]
タイトルRe^5: PrintPreviewDialogでの印刷ボタン
記事No7003
投稿日: 2008/02/12(Tue) 17:14
投稿者魔界の仮面弁士
> 「掲示板への直接アクセスは禁止です。メニューから表示して下さい。」
あぁ、出ますよねコレ。

<ひとりごと>
# このメッセージ、システム側の都合が前面に押し出されているように見えてしまい、
# あまり印象が良くないなぁ…。
# 利用者としては、過去ログや google 等から誘導されてきた、正当な URL にアクセスした
# だけなのに、理由も明記せずに(こちらが悪者であるかのような)「禁止」「エラー」の
# 表示があるというのは、あまりにも利用者に優しくないし。
</ひとりごと>


> また、もし印刷できないのならば、
流石に、それは無いと思いますよ。
まともに印刷もできないようなボタンを、あそこに用意しておくハズは無いですし。


> 「印刷」ボタンを非表示に設定できないのでしょうか?
できますよ。undocumented ですけれども。

Dim ts As ToolStrip = TryCast(PrintPreviewDialog1.Controls("toolStrip1"), ToolStrip)
If ts IsNot Nothing Then
 ts.Items("printToolStripButton").Visible = False
End If

[ツリー表示へ]
タイトルRe^6: PrintPreviewDialogでの印刷ボタン
記事No7005
投稿日: 2008/02/12(Tue) 17:31
投稿者花ちゃん
> <ひとりごと>
> # このメッセージ、システム側の都合が前面に押し出されているように見えてしまい、
> # あまり印象が良くないなぁ…。
> # 利用者としては、過去ログや google 等から誘導されてきた、正当な URL にアクセスした
> # だけなのに、理由も明記せずに(こちらが悪者であるかのような)「禁止」「エラー」の
> # 表示があるというのは、あまりにも利用者に優しくないし。
> </ひとりごと>

以前の掲示板の一部の時期だけの設定だったはずですが、現在でもそのような
表示がでるのでしょうか?

[ツリー表示へ]
タイトルRe^7: PrintPreviewDialogでの印刷ボタン
記事No7006
投稿日: 2008/02/12(Tue) 18:00
投稿者魔界の仮面弁士
> 現在でもそのような表示がでるのでしょうか?
そりゃまぁ、出ないなら書きません。(^^;

今日、No.6998 で提示された URL を開いた時に、そのエラーが出ましたね。
(出ない時もありますが、再現手順は不明…)

[ツリー表示へ]
タイトルRe^8: PrintPreviewDialogでの印刷ボタン
記事No7007
投稿日: 2008/02/12(Tue) 18:22
投稿者花ちゃん
> > 現在でもそのような表示がでるのでしょうか?
> そりゃまぁ、出ないなら書きません。(^^;
>
> 今日、No.6998 で提示された URL を開いた時に、そのエラーが出ましたね。
> (出ない時もありますが、再現手順は不明…)

ご迷惑をお掛けしました。
以前、魔界の仮面弁士さんから指摘があった時、外したのですが、今、CGI関係をすべて
DLして調べたら、旧の掲示板のCGIに2カ所見つかりましたので、外しました。

今後もでるようでしたら、教えて頂けませんか?

私は、フレームで使っているので、出た事がないので気が付きませんでした。

[ツリー表示へ]
タイトルRe^5: PrintPreviewDialogでの印刷ボタン
記事No7004
投稿日: 2008/02/12(Tue) 17:28
投稿者花ちゃん
> 上記のリンク先ですが
> 「掲示板への直接アクセスは禁止です。メニューから表示して下さい。」
> となり表示できません。Noを教えていただいたのでそちらか調べられました。

どのリンクをどのような状態でクリックされたのでしょうか?
そのような設定は、していない筈なんですが。

[ツリー表示へ]
タイトルRe: PrintPreviewDialogでの印刷ボタン
記事No7000
投稿日: 2008/02/12(Tue) 16:34
投稿者魔界の仮面弁士
当方では現象を再現できませんでした。(全ページ、期待通りに出力されました)

> PrintPreviewDialogで印刷のボタンを押すとページの最後のページだけが
> 印刷されます。(表示は複数ページがされています)

通常であれば、そのような結果にはならない筈なので、現段階においては、
ひでとさんが書かれたコード自体に問題がある可能性が高いと予想します。

実際に現象を再現可能な、最小限のソースコードを提示できますでしょうか?
再現可能なコードがあれば、それがコード上のバグなのか、それとも、環境側の問題なのか
あるいは .NET Framework の不具合なのかを検証しやすくなります。


なお、当方で検証したコードは下記になります。

Imports System.Drawing.Printing
Public Class Form1
 Private sample As List(Of String)
 Private currentPage As Integer
 Private minPage As Integer
 Private maxPage As Integer

 Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
  Button1.Text = "プレビュー"
  Button2.Text = "直接印刷"

  PrintPreviewDialog1.Document = PrintDocument1

  sample = New List(Of String)
  sample.Add("これは最初のページです。")
  sample.Add("これは2ページ目です。")
  sample.Add("これは3ページ目です。")
  sample.Add("これは4ページ目です。")
  sample.Add("これは最後のページです。")
  currentPage = 0
  minPage = 1
  maxPage = 5
 End Sub

 Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) _
  Handles Button1.Click
  currentPage = 0
  Enabled = False
  PrintPreviewDialog1.ShowDialog()
 End Sub

 Sub Button2_Click(ByVal sender As Object, ByVal e As EventArgs) _
  Handles Button2.Click
  currentPage = 0
  Enabled = False
  PrintDocument1.Print()
 End Sub

 Sub PrintDocument1_PrintPage(ByVal sender As Object, _
  ByVal e As PrintPageEventArgs) Handles PrintDocument1.PrintPage
  currentPage += 1
  Using F As New Font("MS P Gothic", 21), B As New SolidBrush(Color.Blue)
   Dim index As Integer = currentPage - 1
   e.Graphics.DrawString(sample(index), F, B, 0, 0)
  End Using
  If currentPage < maxPage Then
   e.HasMorePages = True
  Else
   e.HasMorePages = False
   currentPage = 0
   Enabled = True
  End If
 End Sub
End Class

[ツリー表示へ]
タイトルRe^2: PrintPreviewDialogでの印刷ボタン
記事No7002
投稿日: 2008/02/12(Tue) 16:57
投稿者ひでと
ありがとうございます。
PrintDocument1_PrintPageの中に記載されたコードが怪しいわけですね。
現状のコードを簡略化して、サンプルをつくってみます。
申し訳ありませんが、明日投稿させていただきます。
よろしくお願いします。

[ツリー表示へ]
タイトルRe^3: PrintPreviewDialogでの印刷ボタン
記事No7010
投稿日: 2008/02/13(Wed) 10:02
投稿者ひでと
遅くなりまして申し訳ありません。
> PrintDocument1_PrintPageの中に記載されたコードが怪しいわけですね。
> 現状のコードを簡略化して、サンプルをつくってみます。

すいません。簡略化したコードを作成中に駄目なところがわかりました。
誤解していたのは、プレビューダイアログの「印刷」ボタンが、
ダイアログに取り込まれたデータを印刷するのではないかと思っていたところでした。
実際は「印刷」ボタンは PrintDocument1.Printを呼び出すだけなのですね。
したがって ページの初期化の処理はPrintDocument_PrintPage内でどうしても
完了させないといけないと言う事が、ようやく理解できました。
ご迷惑をおかけしました。

以下に修正した簡略化コードをいれます。
フォームにDataGridを置いてあり、その内容を印刷しようとしています。
Public Class Form1
    Dim BgnRow As Integer
    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Dim i As Integer
        With DataGridView1
            .ColumnCount = 1
            For i = 0 To 50
                .Rows.Add() : DataGridView1(0, i).Value = "test" & i + 1
            Next
        End With
        With PrintDocument1.DefaultPageSettings.Margins '1mm=39.37*0.01in
            .Left = 20 * 39.37 / 10 '左端を20mmに設定
            .Right = 10 * 39.37 / 10
            .Top = 10 * 39.37 / 10
            .Bottom = 200 * 39.37 / 10 '印刷域を小さく設定
        End With
    End Sub

    Private Sub PrintDocument1_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
        Dim left, top, width, height
        Dim i As Integer
        Dim x, y As Integer
        Dim dy As Integer
        Dim Maxdy As Integer
        Dim 出力文字 As String
        Dim Obj As DataGridView
        Dim nFont
        nFont = New Font("MS 明朝", 10)
        Obj = DataGridView1
        Left = e.MarginBounds.Left
        Top = e.MarginBounds.Top
        Width = e.MarginBounds.Width
        Height = e.MarginBounds.Height
        y = y + Maxdy

        For i = BgnRow To Obj.Rows.Count - 2
            出力文字 = Obj(0, i).Value.ToString
            dy = 0
            e.Graphics.DrawString(出力文字, nFont, Brushes.Black, left + x, top + y + dy)
            dy = e.Graphics.MeasureString(出力文字, nFont).Height
            If Maxdy < dy Then Maxdy = dy
            If y > height Then
                e.HasMorePages = True
                BgnRow = i + 1
                Exit Sub
            End If
            y = y + Maxdy
        Next
    'ページの初期化はここで絶対必要
        BgnRow = 0
        e.HasMorePages = False
    End Sub

    Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
        BgnRow = 0
        PrintDocument1.Print()
    End Sub

    Private Sub Button2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button2.Click
        BgnRow = 0
        PrintPreviewDialog1.Document = PrintDocument1
        PrintPreviewDialog1.ShowDialog()
    End Sub
End Class

[ツリー表示へ]