3

次のコードを使用して FlowLayoutPanel コントロールに画像を追加しています

Dim WithEvents Pedit As DevExpress.XtraEditors.PictureEdit

Private Sub LoadImagesCommon(ByVal fi As FileInfo)
        Pedit = New DevExpress.XtraEditors.PictureEdit
        Pedit.Width = 133
        Pedit.Height = 98
        Pedit.Image = Image.FromFile(fi.FullName)
        Pedit.Properties.SizeMode = DevExpress.XtraEditors.Controls.PictureSizeMode.Zoom
        Pedit.ToolTip = fi.Name
        AddHandler Pedit.MouseClick, AddressOf Pedit_MouseClick
        AddHandler Pedit.MouseEnter, AddressOf Pedit_MouseEnter
        AddHandler Pedit.MouseLeave, AddressOf Pedit_MouseLeave
        FlowLayoutPanel1.Controls.Add(Pedit)
    End Sub

The process cannot access the file xxxx because it is being used by another process.問題は、前の手順で読み込んだ画像を削除しようとすると、次のエラーが発生することです。

                    FlowLayoutPanel1.Controls.Clear()
                    FlowLayoutPanel1.Refresh()
                    For Each fi As FileInfo In New DirectoryInfo(My.Settings.TempDirectory).GetFiles
                        RemoveHandler Pedit.MouseClick, AddressOf Pedit_MouseClick
                        RemoveHandler Pedit.MouseEnter, AddressOf Pedit_MouseEnter
                        RemoveHandler Pedit.MouseLeave, AddressOf Pedit_MouseLeave
                        File.Delete(fi.FullName)
                    Next

それで、私はここで何が間違っていますか?

4

3 に答える 3

5

Image.FromFileロードしたファイルを実際にロックし、破棄された後にのみロックを解放します。

解決策は、画像を別の画像のグラフィックス コンテキストに描画し (したがって、効果的にコピーする)、元の画像を破棄することです。

于 2010-10-24T19:36:18.167 に答える
5

あはは!ありがとうコンラッド。

いくつか読んだ後、別の回避策も見つけました。

Dim fs As System.IO.FileStream
fs = New System.IO.FileStream(fi.FullName, IO.FileMode.Open, IO.FileAccess.Read)
Pedit.Image = System.Drawing.Image.FromStream(fs)
fs.Close() 

更新: そして、これがKonradが提案したものです。私と同じように、そこにいるすべての初心者のために:)

 Dim imgTemp As System.Drawing.Image  
 imgTemp = System.Drawing.Image.FromFile(strFilename, True)  
 Pedit.Image = New System.Drawing.Bitmap(imgTemp)  
 imgTemp.Dispose()  
 Pedit.Image.Save(strFilename)

これは、FileStream が閉じられた後に Image オブジェクトの Save メソッドを呼び出すことができないため、より優れています。

于 2010-10-24T20:00:56.313 に答える
0

PictureBoxにロードされた後、このソリューションが画像ファイルのロックを解除するのに最適であることがわかりました。

PictureBoxName .LOAD(フルパスの画像ファイル名

于 2012-12-25T06:54:31.843 に答える