|
2019/09/12(Thu) 11:39:56 編集(投稿者)
■No92354 (EN さん) に返信 > PictureBox1.Image.Dispose 使用中のリソースを Dispose してはいけません。
> 型 'System.ArgumentException' のハンドルされていない例外が > というエラーが出るのですが、なぜなのでしょうか? CenterImage で表示するためには、処理手続き的に、 「Image プロパティが持つ画像のサイズ」を調べる処理が必要となります。
具体的には Private ReadOnly Property ImageRectangle As Rectangle への アクセスが行われているわけですが、細かい点を省略すれば、 Dim w As Integer = PictureBox1.Image.Width のような感じの処理が行われているということです。
しかし、Image オブジェクトが既に破棄されているため、 処分済みオブジェクトのプロパティへのアクセスが失敗し、ArgumentException が発生します。
> PictureBox1.Image.Dispose > PictureBox1.Image = Nothing > は同じなのでしょうか?
Nothing 代入と Dispose() 呼び出しは、意味がまったく異なります。
たとえば下記のコードを見てください。 Load 時に example.jpg を読み取り、それを表示するコードです。
この場合、画像ファイルがロックされるため、 フォームを閉じるまでの間、example.jpg をリネームしたり 削除したりすることができないはずです。
Private bmp As Image
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load bmp = Image.FromFile("C:\TEMP\example.jpg") 'ここは実在するファイルを指定して下さい PictureBox1.Image = bmp End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click PictureBox1.Image.Dispose() End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click PictureBox1.Image = Nothing End Sub
Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click bmp.Dispose() End Sub
Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click bmp = Nothing End Sub
この場合、Button1 と Button3 は同じ意味を持ちます。 どちらのコードでも、example.jpg ファイルをロックしていた Image オブジェクトのインスタンスが Dispose されます。 Image オブジェクトが破棄されれば、example.jpg も解放され、 ファイルのリネームが可能な状態となります。 (Image が破棄されているので、PictureBox1 には表示できなくなる)
一方、Button4 については、変数 bmp が参照していた情報が、 「example.jpg な画像への参照」ではなく「Nothing」になっただけなので、 PictureBox1.Image に対しては影響がありません。 PictureBox1 には画像が表示されたままですし、 example.jpg はリネームできないままです。
Button2 も同様です。 PictureBox1 の表示はクリアされますが、変数 bmp が Image インスタンスexample.jpg への参照を保持したままなので、 example.jpg はリネームできないままです。
また、Button2 と Button4 の両方を押した場合、 example.jpg はどこからも参照されていない状態となりますが、 この場合も Dispose() されてはいないため、 ファイルは暫くロックされたままです。 ガベージコレクトが発動して自動的に Dispose されたり、 アプリを終了したりすれば、ファイルのロックは解除されますが。
|