印刷終了後にフォームを非表示にしたい への返答
投稿で使用できる特殊コードの説明。(別タブで開きます。)
以下の返答は逆順(新しい順)に並んでいます。
投稿者 るきお  (社会人)
投稿日時
2021/10/20 20:19:44
簡単な方法が2つあります。
1つは、Me.Hide の代わりに Me.Close を使うことです。
Me.Hide はフォームを見えなくしますが、フォームは開いており存在しています。
Me.Close はフォームを閉じます。
既定では、最初のフォームが閉じるとアプリケーションも終了します。
もう1つは、Loadイベントではなく、たとえば、 Shownイベントを使うことです。
ButtonのClickイベントなどの方がもっとふさわしいようにも思います。
新参者さんのプログラムがうまくいかない最大の理由は、Loadイベント発生中にMe.Hide を実行している点です。
通常Loadイベント実行中はまだフォームが表示されていないので、Me.Hideを実行しなくてもフォームは非表示なのです。Loadイベント完了後にフォームが自動的に表示されます。この直後にShownイベントが発生します。
新参者さんのプログラムでは、Loadイベントで印刷を実行して、EndPrintイベントが発生して、Me.Hideが実行されフォームが非表示になるように指示されます。
ここまでは予想通りだと思いますが、その後Loadイベントが完了するので、上述したように自動的にフォームが表示されます。結果としてMe.Hideの指示は無意味となります。
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
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 するようにしてみるのはどうでしょうか。