Pergunta

Estou adicionando imagens a um controle FlowLayOutPanel através do seguinte código

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

O problema é que recebo o seguinte erro The process cannot access the file xxxx because it is being used by another process. Quando tento excluir as imagens que carreguei na etapa anterior.

                    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

Então, o que estou fazendo de errado aqui?

Foi útil?

Solução

Image.FromFile Na verdade, bloqueia o arquivo que ele carrega e apenas libera a trava depois de descartada.

A solução é atrair a imagem para o contexto gráfico de outra imagem (copiando -a efetivamente) e descartar a imagem original.

Outras dicas

AHA! Obrigado Konrad.

Depois de uma leitura, também encontrei outra solução alternativa.

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() 

Atualizar:E aqui está o que Konrad sugeriu. Para todos os novatos por aí, assim como eu :)

 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)

O que é melhor, pois o objeto de imagem não pode ter seu método de salvamento chamado após o fechamento do FileStream.

Descobri que esta solução é a melhor para desbloquear o arquivo de imagem depois de ser carregado no PictureBox:

PictureBoxName.CARREGAR(Nome do arquivo de imagem com caminho completo)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top