Image qui demeure en mémoire

Résolu
cs_eklips Messages postés 7 Date d'inscription vendredi 25 janvier 2008 Statut Membre Dernière intervention 8 novembre 2008 - 8 nov. 2008 à 16:53
jmf0 Messages postés 1566 Date d'inscription mardi 26 décembre 2000 Statut Membre Dernière intervention 5 avril 2013 - 9 nov. 2008 à 08:04
Bonjour à tous!
J'ai un problème avec la manipulation d'image!  Je dois conçevoir un programme d'exercice à partir d'une banque d'image.  L'usager sélectionne une image à partir d'un treeview, elle apparaît dans un picturebox et s'il la choisis elle est transférée dans un listview.
Pour ce faire j'utilise un array pour stocker le chemin des images affichées dans le picturebox.  Mon problême est que lorsque le programme d'exercice est complété je dois pouvoir en faire une version papier à l'aide de crystal report.  Lorsque je tente d'envoyer les images a crystal report j'obtiens une erreur: les images sont ouvertes donc impossible de les lire.  Ça fait déjà quelques jours que je tente de trouver le moyen de contourner le problême mais je manque d'informations.
Premièrement je ne suis pas certain où exactement dans l'application l'image demeure ouverte? est-ce lorsque je remplis le treeview, ou alors lorsque j'affiche l'image dans le picturebox?
Biensur j'ai trouver de l'information sur .clone et sur l'utilisation des thumbnails mais comme je ne sais pas comment vérifier si l'image est ouverte à un moment x du déroullement de l'application j'ai de la difficulté à tester ces conctions.

Bon puisqu'une "image" :P vaut milles mots voici mon code:
#Region "Creation du programme d'entrainement"
    Private Sub initialiserTreeview()
        Dim z As TreeNode
        tvExercice.ImageList = icones
        z = tvExercice.Nodes.Add("..\Exercices")
        Explor(z)
        z.ImageIndex = 0
        z.SelectedImageIndex = 0

    End Sub

    Private Sub Explor(ByVal Node As TreeNode)
        Try
            Dim s As String
            For Each s In Directory.GetDirectories(Node.FullPath)
                Node.Nodes.Add(Path.GetFileName(s))
                Node.ImageIndex = 1
                Node.SelectedImageIndex = 2
            Next s
        Catch ex As IOException
        End Try

        Try
            For Each f As String In Directory.GetFiles(Node.FullPath)
                Node.Nodes.Add(Path.GetFileName(f))
                Node.ImageIndex = 3
                Node.SelectedImageIndex = 3
            Next f
        Catch e As IOException
        End Try

    End Sub

    Private Sub tvExercice_AfterCollapse(ByVal sender As Object, ByVal e As System.Windows.Forms.TreeViewEventArgs) Handles tvExercice.AfterCollapse
        pbImage.Image = Image.FromFile("..\blank.bmp").Clone
    End Sub

    Private Sub tvExercice_AfterExpand(ByVal sender As Object, ByVal e As System.Windows.Forms.TreeViewEventArgs) Handles tvExercice.AfterExpand
        Dim z As TreeNode
        For Each z In e.Node.Nodes

            Explor(z)
            If z.FullPath.EndsWith("bmp") Then
                z.ImageIndex = 3
                z.SelectedImageIndex = 3
            Else
                z.ImageIndex = 2
                z.SelectedImageIndex = 2
            End If
        Next z

    End Sub

    Private Sub tvExercice_AfterSelect(ByVal sender As Object, ByVal e As System.Windows.Forms.TreeViewEventArgs) Handles tvExercice.AfterSelect
        chargerPhoto()
    End Sub

    Private Sub chargerPhoto()
        Try
            pbImage.Image = Image.FromFile(tvExercice.SelectedNode.FullPath).Clone
            pbImage.Refresh()
            selectionne = tvExercice.SelectedNode.FullPath
        Catch e As Exception
        End Try
    End Sub

    Private Sub tvExercice_NodeMouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.TreeNodeMouseClickEventArgs) Handles tvExercice.NodeMouseClick
        If Not e.Node.FullPath.EndsWith("bmp") Then
            pbImage.Image = Image.FromFile("..\blank.bmp").Clone
            btnAjout.Enabled = False
        Else
            btnAjout.Enabled = True
            btnEnleve.Enabled = False
        End If
    End Sub

    Private Sub btnAjout_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAjout.Click
        ajoutAuProg()
        btnAjout.Enabled = False
        btnEnleve.Enabled = True
        btnRapportEntrainement.Enabled = True
    End Sub
    Private Sub tvExercice_NodeMouseDoubleClick(ByVal sender As Object, ByVal e As System.Windows.Forms.TreeNodeMouseClickEventArgs) Handles tvExercice.NodeMouseDoubleClick
        If Not e.Node.ImageIndex = 1 Then
            pbImage.Image = Image.FromFile("..\blank.bmp").Clone
            btnAjout.Enabled = False
        Else
            ajoutAuProg()
            btnAjout.Enabled = False
            btnEnregistrer.Enabled = True
        End If

    End Sub

    Private Sub ajoutAuProg()
        Try
            For i As Int16 = 0 To posArray
                If selectionne = chemin(i) Then
                    If selectionne.ToString <> "!" Then
                        MsgBox("l'exercice " &amp; nomFichier(chemin(i)) &amp; " se trouve déjà dans le programme d'entraînement.")
                        Exit Sub
                    End If
                End If
            Next

            chemin(posArray) = selectionne
            ListGrand.Images.Add(Image.FromFile(chemin(posArray)).Clone)
            lvEntrainement.LargeImageList = ListGrand
            posArray += 1

            Dim j As Int16 = posArray - 1
            Dim path As String = chemin(posArray - 1)
            lvEntrainement.Items.Add(nomFichier(path), posArray - 1)
            btnEnregistrer.Enabled = True
        Catch ex As Exception
        End Try
    End Sub

    Private Sub lvEntrainement_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles lvEntrainement.Click
        btnEnleve.Enabled = True
        btnAjout.Enabled = False
    End Sub

    Private Sub lvEntrainement_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles lvEntrainement.DoubleClick
        enleveAuProg()
        btnEnleve.Enabled = False
        btnEnregistrer.Enabled = True

    End Sub
    Private Sub btnEnleve_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnEnleve.Click
        enleveAuProg()
        btnEnleve.Enabled = False
        btnEnregistrer.Enabled = True
        modifie = True
       
    End Sub

    Public Sub enleveAuProg()

        Dim temp(0 To 9) As String
        Dim k As Int16 = 0

        For i As Int16 = 0 To posArray - 1
            If lvEntrainement.SelectedItems(0).Text = nomFichier(chemin(i)) Then
                lvEntrainement.Items.RemoveAt(lvEntrainement.SelectedItems(0).Index)
                chemin(i) = Nothing
                If lvEntrainement.Items.Count = 0 Then
                    btnRapportEntrainement.Enabled = False
                End If
                Exit Sub
            End If
        Next
        posArray -= 1
        btnEnregistrer.Enabled = True
        If lvEntrainement.Items.Count = 0 Then
            btnRapportEntrainement.Enabled = False
        End If
    End Sub

    Private Function nomFichier(ByVal path)
        Try
            Return path.Substring(path.LastIndexOf("") + 1, path.Length - path.LastIndexOf("") - 5)
        Catch ex As Exception
            Return "!"
        End Try
    End Function


Alors pour résumer mes questions sont:
1. Comment vérifier à l'aide de code, si une image est ouverte
2. Comment cloner une image ou alors comment charger l'image en mémoire sans qu'elle demeure ouverte
3. Où exactement le problême est causé (treeview, picturebox ou listview)

Merci d'avance

4 réponses

NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
8 nov. 2008 à 21:37
Bonjour,

VB6 ?? "#Region "Creation du programme d'entrainement"" .NET plutot.

Ensuite, pour libérer une ressource utilises Dispose sur l'image, cela devrait t'aider. Ensuite, tu peux utiliser System.GC.Collect afin de forcer l'execution du GarbageCollector. Si ça ne fonctionne pas, utilises alors l'image (sciemment gardée en mémoire) et fais un .Save(...).

http://nhen0039.chez-alice.fr/index.php
3
jmf0 Messages postés 1566 Date d'inscription mardi 26 décembre 2000 Statut Membre Dernière intervention 5 avril 2013 8
8 nov. 2008 à 18:33
Bonjour,

Je dois vraiment être débutant de chez débutant en  Thèmes / Visual Basic 6, car beaucoup de choses sont encore totalement inconnues de moi...
Ceci, par exemple :
pbImage.Image = Image.FromFile(tvExercice.SelectedNode.FullPath).Clone

Plus grave encore, j'ai beau fouiller dans mon aide en ligne pour VB6 (MSDN/VB6), je ne trouve rien concernant Clone, FromFile, etc...
Tu me fiches beaucoup de complexes ...
0
jmf0 Messages postés 1566 Date d'inscription mardi 26 décembre 2000 Statut Membre Dernière intervention 5 avril 2013 8
8 nov. 2008 à 18:40
Non...
Sérieux, là ...
J'apprends beaucoup (comme tout débutant) en regardant sur ce forum les solutions proposées pour des problèmes VB6...
Mais là, je suis totalement perdu ...et mon aide en ligne ne m'aide pas sur ces points ...
Où les as-tu appris ? As_tu un livre à recommander pour acquérir ces notions VB6 supplémentaires ?
Y a-t-il sur ce forum un tuto spécial pour ces notions complémentaires ?
Aidez-moi...
0
jmf0 Messages postés 1566 Date d'inscription mardi 26 décembre 2000 Statut Membre Dernière intervention 5 avril 2013 8
9 nov. 2008 à 08:04
Bonjour, NHenry,
Merci d'avoir ainsi tranquilisé le pauvre débutant que je suis et qui commençait à s'inquiéter sérieusement !
Ta précision aura sans doute permis d'en tranquiliser d'autres (de débutants) qui, comme moi, sont venus lire les discussions de ce forum pour apprendre et se perfectionner... et pas pour être effrayés par des syntaxes totalement inconnues  !!!
MERCI ENCORE ...
Ouf !
0
Rejoignez-nous