印刷終了後にフォームを非表示にしたい

タグの編集
投稿者 新参者  (社会人) 投稿日時 2021/10/20 17:59:00
vb.netの印刷処理について質問させてください!フォームロード時にPrintDocument1を呼び出し、印刷を行います。その後、PrintDocument1.EndPrintにて開いているフォームを閉じたく下記のコードを記述しましたが、閉じません。どうしたらいいですか?

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

 PrintDocument1.Print()

End Sub

Private Sub PrintDocument1_PrintPage(sender As Object, e As Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage

 印刷内容

End Sub

Private Sub PrintDocument1_EndPrint(sender As Object, e As Printing.PrintEventArgs) Handles PrintDocument1.EndPrint

 Me.Hide()

End Sub






投稿者 るきお  (社会人) 投稿日時 2021/10/20 20:19:44
簡単な方法が2つあります。
1つは、Me.Hide の代わりに Me.Close を使うことです。

Me.Hide はフォームを見えなくしますが、フォームは開いており存在しています。
Me.Close はフォームを閉じます。
既定では、最初のフォームが閉じるとアプリケーションも終了します。

もう1つは、Loadイベントではなく、たとえば、 Shownイベントを使うことです。
ButtonのClickイベントなどの方がもっとふさわしいようにも思います。

Imports System.Drawing.Printing

Public Class Form1

    Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles Me.Shown
        PrintDocument1.Print()
    End Sub

    Private Sub PrintDocument1_PrintPage(sender As Object, e As Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
        Dim rect As New Rectangle(20, 10, 200, 150)
        Dim gradientBrush As New Drawing2D.LinearGradientBrush(rect, Color.Blue, Color.Red, 0)
        e.Graphics.FillRectangle(gradientBrush, 20, 10, 200, 150)
    End Sub

    Private Sub PrintDocument1_EndPrint(sender As Object, e As PrintEventArgs) Handles PrintDocument1.EndPrint
        Me.Hide()
    End Sub

End Class


新参者さんのプログラムがうまくいかない最大の理由は、Loadイベント発生中にMe.Hide を実行している点です。
通常Loadイベント実行中はまだフォームが表示されていないので、Me.Hideを実行しなくてもフォームは非表示なのです。Loadイベント完了後にフォームが自動的に表示されます。この直後にShownイベントが発生します。

新参者さんのプログラムでは、Loadイベントで印刷を実行して、EndPrintイベントが発生して、Me.Hideが実行されフォームが非表示になるように指示されます。
ここまでは予想通りだと思いますが、その後Loadイベントが完了するので、上述したように自動的にフォームが表示されます。結果としてMe.Hideの指示は無意味となります。
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2021/10/20 20:39:08
フォームを「閉じる」のであれば、Hide ではなく Close では無いでしょうか。
Hide だと見えなくなるだけで、メモリ上には残留したままになりますので。

それと、Load 時に Print して、印刷終了時に Hide や Close するのなら、
そもそも Form1 そのものが不要で、直接 PrintDocument を操作するだけで良いのでは…?


> Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
>  PrintDocument1.Print()
> End Sub

Load イベントの End Sub を通過する前に Me.Hide() されてしまい、
その後で End Sub に到達して、そこで表示状態になってしまっているのでは。

たとえば、
 'PrintDocument1.Print()
 BeginInvoke(New Action(AddressOf PrintDocument1.Print))
のようにして、End Sub 通過後に Print されるようにするとか、あるいは
Shown イベントで Print するようにしてみるのはどうでしょうか。