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

投稿で使用できる特殊コードの説明。(別タブで開きます。)
本名は入力しないようにしましょう。
投稿した後で削除するときに使うパスワードです。返答があった後は削除できません。
返答する人が目安にします。相手が小学生か社会人かで返答の仕方も変わります。
最初の投稿が質問の場合、質問者が解決時にチェックしてください。(以降も追加書き込み・返信は可能です。)
※「過去ログ」について書くときはその過去ログのURLも書いてください。

以下の返答は逆順(新しい順)に並んでいます。

投稿者 魔界の仮面弁士  (社会人) 投稿日時 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 するようにしてみるのはどうでしょうか。
投稿者 るきお  (社会人) 投稿日時 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 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