印刷終了後にフォームを非表示にしたい
投稿者 新参者  (社会人)
投稿日時
2021/10/20 17:59:00
vb.netの印刷処理について質問させてください!フォームロード時にPrintDocument1を呼び出し、印刷を行います。その後、PrintDocument1.EndPrintにて開いているフォームを閉じたく下記のコードを記述しましたが、閉じません。どうしたらいいですか?
投稿者 るきお  (社会人)
投稿日時
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 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 するようにしてみるのはどうでしょうか。
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 するようにしてみるのはどうでしょうか。