IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Supprimer une image d'un UserForm après l'avoir chargée [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Membre Expert
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Par défaut Supprimer une image d'un UserForm après l'avoir chargée
    Bonjour,

    C'est encore moi avec mes images !
    Bon... J'ai un UserForm dans lequel je charge 32 images.
    Par la suite, je souhaite pouvoir les "retirer" quand je clique dessus.

    Ainsi, grâce à l'aide de Robert et Patrick, j'initialise mon UserForm de la sorte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Option Explicit
     
    Dim MesImages(1 To 32) As New Classe1
     
    Private Sub UserForm_Initialize()
    Dim i As Byte
     
    For i = 1 To 32
        Set MesImages(i).Bt = Me.Controls("Image" & i)
        MesImages(i).Id_Joueur = Int((i - 1) / 8 + 1)
    Next i
     
    Call Load_image
     
    End Sub
    Je charge mes images (dans un module) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub Load_image()
    Dim i As Byte, j As Byte
     
    For j = LBound(oJoueur, 1) To UBound(oJoueur, 1)
        For i = LBound(oJoueur, 2) To UBound(oJoueur, 2)
            UserForm1.Controls("Image" & (j - 1) * 8 + i).Picture = LoadPicture("mon_chemin" & oJoueur(j, i).Nombre & "_" & oJoueur(j, i).Couleur & ".jpg")
            UserForm1.Controls("Image" & (j - 1) * 8 + i).Tag = oJoueur(j, i).Nombre & "_" & oJoueur(j, i).Couleur
            UserForm1.Controls("Image" & (j - 1) * 8 + i).PictureSizeMode = 1
        Next i
    Next j
     
    End Sub
    Et quand je clique dessus (dans un module de classe) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    Public WithEvents Bt As MSForms.Image
    Public Id_Joueur As Byte
     
    Private Sub Bt_Click()
    Dim oStr() As String
     
    'Bt.Picture = LoadPicture()
    MsgBox Bt.Picture 'Premier point
    Bt.Picture = Nothing
    MsgBox Bt.Picture 'Second point
    Bt.PictureSizeMode = 0
    oStr = Split(Bt.Tag, "_")
     
    UserForm1.Controls("Carte_J" & Id_Joueur).Picture = LoadPicture("mon_chemin" & oStr(LBound(oStr)) & "_" & oStr(UBound(oStr)) & ".jpg")
    UserForm1.Controls("Carte_J" & Id_Joueur).PictureSizeMode = 1
     
    Call Poser_carte(oStr(LBound(oStr)), oStr(UBound(oStr)), Id_Joueur)
     
    'MsgBox Id_Joueur
     
    End Sub
    Or, quand j'applique la méthode Bt.Picture = LoadPicture("") ou Bt.Picture = LoadPicture() ou Bt.Picture = Nothing l'image ne disparaît pas "physiquement"... J'entend par là que je peux toujours la voir... Cependant, il semble que le lien entre mon image et le UserForm soit bien supprimé...

    Dans le code précédent, j'ai précisé deux commentaires.
    Le 'Premier point me permet de récupérer une valeur pour m'assurer que l'image est bien sétée :
    Nom : exe1.png
Affichages : 1524
Taille : 2,5 Ko
    Ensuite, je tente de supprimer l'image et là, erreur :
    Nom : exe2.png
Affichages : 1705
Taille : 4,8 Ko
    ... sur la ligne :
    Nom : exe3.png
Affichages : 1515
Taille : 3,6 Ko

    Donc je pense bien que l'image n'est plus liée mais... elle est toujours visible...
    Nom : exe4.png
Affichages : 1578
Taille : 9,8 Ko
    Qu'est-ce que je fais de mal ?

    Par avance, je vous remercie et reste disponible pour tout complément !

    Cordialement,
    Kimy

  2. #2
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut
    essaie un repaint, des fois c'est simplement une surcharge de memoire graphique

    cpendant ceci me gene un peu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MesImages(i).Id_Joueur = Int((i - 1) / 8 + 1)
    c'est .bt qu'il devrait y avoir
    c'est peut etre ce qui explique l'errer ici
    Or, quand j'applique la méthode Bt.Picture = LoadPicture("") ou Bt.Picture = LoadPicture() ou Bt.Picture = Nothing l'image ne disparaît pas
    puisque tu charge pas mesimages(x).bt mais mesimages(x).idjoueur ce qui est dépourvu de sens donc ta classcontrol"bt" n'est pas instancier tout du moins correctement
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 652
    Par défaut
    Bonjour,

    Une astuce en créant une image vide (Image3).
    Essayez le code suivant (UserForm1, Image1, Image2, Image3). Dans mon exemple, les images sont stockés dans le UserForm mais on peut tout aussi bien les stocker ailleurs et les monter avec LoadPicture.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Private Sub Image1_Click()
    Static passe% 'pour illustrer l'exemple
     
    If passe% = 0 Then
      Image1.Picture = Image3.Picture
      passe% = 1
    Else
      Image1.Picture = Image2.Picture
      passe% = 0
    End If
     
    Me.Repaint
    End Sub
     
    Private Sub UserForm_Initialize()
    Image1.Picture = Image2.Picture
    End Sub
    Fichiers attachés Fichiers attachés

  4. #4
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    unload Bt
    Set Bt = Nothing
    !

    Ou

    Dernière modification par Invité ; 25/09/2015 à 23h59.

  5. #5
    Membre Expert
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Par défaut
    Bonjour à tous !

    Comme d'habitude, je vous remercie vivement pour vos réponses !

    @Patrick : le Repaint fonctionne parfaitement ! Je pensais bien que c'était une histoire de cache et ne connaissait pas cette propriété.
    En revanche, je ne comprends pas ta remarque concernant MesImages(i).Id_Joueur = Int((i - 1) / 8 + 1).
    En effet, dans mon module de classe j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Public WithEvents Bt As MSForms.Image
    Public Id_Joueur As Byte
    Sauf, si j'ai très mal compris (ce qui n'est ABSOLUMENT pas à exclure ! ), j'ai bien deux variables, Bt As MSForms.Image, avec les événements et Id_Joueur As Byte.
    Donc, je pense que c'est bon. Ca fonctionne bien comme ça, mais... peut-être un coup de bol !

    @PMO2017 : c'est la méthode Repaint qui me fallait principalement que tu utilises également, d'ailleurs. Je te remercie pour tes conseils !

    @Robert : La méthode Unload ne fonctionne pas. Autant sur Bt que sur Bt.Picture.
    Saurais-tu pourquoi ?

    Merci encore à tous ! Sujet !

    Cordialement,
    Kimy

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour

    J'ai trouvé ça, pas testé:picBox.clear

  7. #7
    Membre Expert
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Par défaut
    Bonjour Robert,

    Merci pour ton investissement. Pas mieux pour autant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Bt.Picture.clear
    'ou
    Bt.Clear
    ... ne fonctionnent pas.

    Cordialement,
    Kimy

  8. #8
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut
    @Patrick : le Repaint fonctionne parfaitement ! Je pensais bien que c'était une histoire de cache et ne connaissait pas cette propriété.
    En revanche, je ne comprends pas ta remarque concernant MesImages(i).Id_Joueur = Int((i - 1) / 8 + 1).
    En effet, dans mon module de classe j'ai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Public WithEvents Bt As MSForms.Image
    Public Id_Joueur As Byte
    oui c'est un coup de bol
    si id_joueur est en byte
    sa voudrais dire que :
    mes images(x).x=quelques choses le 2 x devrait etre une classe et non pas un numeric
    donc conclusion si ca fonctionne c'est qu'il y a une mauvaise interprétation de la variable
    résultat peut etre qu'un jour tu aura un bug sans comprendre ce qu'il t'arrive et tu saura pas ou chercher

    dans la classe une image c'est
    images(x).bt
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  9. #9
    Membre Expert
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Par défaut
    Bonjour Patrick,

    Je suis désolé de t'embêter, mais je ne comprends vraiment pas...
    Quand je déclare mon tableau Dim MesImages(1 To 32) As New Classe1 avec comme Classe1 ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Public WithEvents Bt As MSForms.Image
    Public Id_Joueur As Byte
    ... pour moi, Classe1 contient une variable Bt et une autre Id_Joueur.
    Ainsi, sur mon tableau de 32 valeurs, je set, l'une et l'autre des variables de la sorte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    For i = 1 To 32
        'Ici, on set Bt comme MSForms.Image
        Set MesImages(i).Bt = Me.Controls("Image" & i)
        'Ici, on set Id_Joueur comme Byte
        MesImages(i).Id_Joueur = Int((i - 1) / 8 + 1)
    Next i
    Donc je ne vois pas où je fais une erreur.

    Cordialement,
    Kimy

  10. #10
    Invité
    Invité(e)
    Par défaut
    kimy, j'ai l'impression que tu te complique la vie!

    tu dispose d'un tapis de jeux avec disons 4 joueurs; ton tapis es donc divisé en 5 partie, le joueurs au 4 coins du tapis et la pioche (je suppose à voir dans le contexte) au milieux! nous pouvons déduire a qui appartiennent les cartes en fonction de leur position!

    tu dispose d'un jeu de 32 carte. c'est un fait et c'est immuable, donc je dessine mes 32 cartes, je voulais utiliser un liste image mais excel me parle de la registration alors au lieu de faire le nécessaire qui est souvent fastidieuse et à refaire en cas de distribution de l'application, j'ai utilisé des images (Carte1 à 32)! l'avantage tes images sont dans le userform pas de lien vers un répertoire! , j'ai un carte0 qui contiens un image transparente, quand je click sur un image je ne la décharge pas mais je place limage transparent!


    j'ai donc un jeux de 33 carte non visible que je distribue sur 32 images visible!

    je peux faire un classe pour les cartes et un classe pour les joueurs, avec un méthode click différente sur la carte je masque l'imagne, sur le joueur je compte ses points!

    Attention, vue que les images sont rattachées à la fois à class1 et class2, je ne métrise pas l'ordre de du déclanchement ses évènements click!
    Fichiers attachés Fichiers attachés
    Dernière modification par Invité ; 28/09/2015 à 13h59.

  11. #11
    Membre Expert
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Par défaut
    Robert,

    Je te remercie pour ces éléments.
    J'ai déjà mes 32 cartes de disposés dans mon UserForm. Je les distribue de manière aléatoire, 8 à chaque joueur. Mon objectif actuelle est donc de pouvoir cliquer sur les cartes et que ces dernières "se déplace" au centre de la "table".
    J'imagine bien qu'il y a des manières plus simple que celle que j'utilise. Ce que je retiens de ce que tu viens de me dire est le faire que je pourrais créer une pile de carte que je dispatche entre les différents joueurs à la distribution.

    Mon objectif final, est de faire algorithme d'IA, ce qui m’intéresse le plus, au final. Je dois donc connaitre le numéro et la couleur de chacune des cartes dans mon programme afin de gérer leur hiérarchie.
    Dans tous les cas, j'apprends, ce qui est le but absolu ! ^^

    Merci encore.

    Cordialement,
    Kimy

  12. #12
    Invité
    Invité(e)
    Par défaut
    Pour connaitre la couleur et le poids de la carte tu as le tag!
    me.image(i).tag="R;C;10" Roi de carreau valeur 10,point!

    Bien sur je spécule on dirait plus le poker que la belotte!

    Si tu veux garder le chargement via une image,tu peux les renommé RC;RP carreau,Pic pour redéfinir ton tag directement!

    En ce qui concerne le trie de cartes, tu peux battre le carte de façon aléatoire et fournir une a une les cartes au joueurs jusqu'à concurrence de 8!

    Grâce à un dictionnairary tu connais les cartes que tu as donné à chaque joueur!

    Je dis peut-être des âneries mais le cartes j'y connais pas grand chose sauf belotte et taureau!
    Dernière modification par Invité ; 28/09/2015 à 15h35.

  13. #13
    Membre Expert
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Par défaut
    Robert,

    Je suis content de voir que j'ai eu la même idée ! (pour une fois ! )
    Quand je charge mes image, je set bien le tag.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub Load_image()
    Dim i As Byte, j As Byte
     
    For j = LBound(oJoueur, 1) To UBound(oJoueur, 1)
        For i = LBound(oJoueur, 2) To UBound(oJoueur, 2)
            UserForm1.Controls("Image" & (j - 1) * 8 + i).Picture = LoadPicture("C:\chemin" & oJoueur(j, i).Nombre & "_" & oJoueur(j, i).Couleur & ".jpg")
            UserForm1.Controls("Image" & (j - 1) * 8 + i).Tag = oJoueur(j, i).Nombre & "_" & oJoueur(j, i).Couleur
            UserForm1.Controls("Image" & (j - 1) * 8 + i).PictureSizeMode = 1
        Next i
    Next j
     
    End Sub
    Je n'ai plus qu'à repensé mon chargement et c'est gagné.
    Pour le moment, je gère la partie validation des cartes (de la belote - ou coinche exactement ).
    Je reviendrais sur la partie initialisation un peu plus tard puisque ce que j'ai pour le moment fonctionne (mais peut-être pas optimisé, j'en conviens).

    Merci à toi !

    Cordialement,
    Kimy

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 20/09/2008, 12h27
  2. Réponses: 3
    Dernier message: 09/11/2006, 18h22
  3. impossible de supprimer une image!
    Par pierrot67 dans le forum Bases de données
    Réponses: 2
    Dernier message: 08/09/2006, 15h03
  4. Réponses: 2
    Dernier message: 26/06/2006, 15h34
  5. comment supprimer une image ?
    Par Death83 dans le forum Langage
    Réponses: 4
    Dernier message: 30/01/2006, 11h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo