Enlever une image (2) [Résolu]

Signaler
Messages postés
206
Date d'inscription
samedi 17 janvier 2009
Statut
Membre
Dernière intervention
5 mars 2013
-
Messages postés
206
Date d'inscription
samedi 17 janvier 2009
Statut
Membre
Dernière intervention
5 mars 2013
-
Re-re-bonjour,

Desole de revenir sur le meme probleme, mais cela ne marche pas exactement comme je le voulais.

En fait le code suivant, enleve les images, mais pas le conteneur (PictureBox):

        Dim ctl As Control
        Dim pict As PictureBox
        For Each ctl In Me.SplitContainer1.Panel2.Controls
            If TypeOf ctl Is PictureBox Then
                pict = CType(ctl, PictureBox)
                'CType(ctl, PictureBox).Image = Nothing
                pict.Image = Nothing
                RemoveHandler pict.MouseMove, AddressOf imgPictureMouseMove
                RemoveHandler pict.MouseDown, AddressOf imgPictureMouseDown
                RemoveHandler pict.MouseClick, AddressOf imgPictureMouseClick
            End If
        Next


Et, je desire enlever le PictureBox plus que l'image en elle-meme (d'ou un titre pas assez precis).
Ah! Poser la bonne question dans un forum est toujours la principale difficultee.

Enfin, bref, j'ai essaye ceci, mais sans succes:

        For i = Me.SplitContainer1.Panel2.Controls.Count To 0 Step -1
            If TypeOf ctl Is PictureBox Then
                SplitContainer1.Panel2.Controls.RemoveAt(i)
            End If
        Next


Ce bout de code semble etre ignore. En fait, en Debug mode, la ligne avec RemoveAt(i) n'est jamais accedee.
Si vous avez d'autres idees...

Merci,
A+
JLuc01

9 réponses

Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
232
Toujours en te rappelant que, n'étant pas VB.Nettiste, je peux me tromper :
Essaye quand même ceci, pour voir :
For i = Me.SplitContainer1.Panel2.Controls.Count To 0 Step -1
  If TypeOf(Me.SplitContainer1.Panel2.Controls(i)) Is PictureBox Then
     SplitContainer1.Panel2.Controls.RemoveAt(i)
  End If
Next


Et pardonne-moi si je suis à côté de la plaque, mais j'essaye, puisque pas de VB.Nettiste en vue.
Si ceci marche ===W>> devrait être largement amélioré (subsituer une fois pour toutes un objet déclaré à Me.SplitContainer1.Panel2 ou utiliser un bloc With, si VB.Net le permet. Mais ça, tu dois probablement le savoir, toi !)

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développer sur ses bases.
Messages postés
14738
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
23 novembre 2020
148
Bonjour,

Dans ton code :
For i =  Me.SplitContainer1.Panel2.Controls.Count - 1 To 0 Step -1
      If TypeOf (Me.Controls(i)) Is PictureBox Then
             SplitContainer1.Panel2.Controls.RemoveAt(i)
      End If
Next


Tu regardes le nombre de contrôle contenu dans SplitContainer1.Panel2 et tu accèdes aux contrôle contenus dans Me.Controls pour vérifier si c'est des PictureBox, il y a une incohérence.

---------------------------------------------------------------------
[list =ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualVasic (onglet Références dans les propriétés du projet).
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Mon site
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
232
Bonjour,

Je ne suis pas VB.Nettiste.
Je ne sais donc que ce que je peux lire dans MSDN à propos de RemoveAt, qui permet l'utilisation de l'index dans la collection Controls. Cette Méthode me parait bonne, elle.
Mais ton code ne me parait pas bon, lui, dès lors que Ctl ne veut rien dire dans ta boucle For ... to ...
Je doute donc très fort que cette expression conditionnelle :
If TypeOf ctl Is PictureBox Then
   SplitContainer1.Panel2.Controls.RemoveAt(i)
End If

soit vérifiée ! ctl n'y est jamais quoi que ce soit !

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développer sur ses bases.
Messages postés
14738
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
23 novembre 2020
148
Bonjour,

        For i = Me.SplitContainer1.Panel2.Controls.Count To 0 Step -1
            If TypeOf ctl Is PictureBox Then
                SplitContainer1.Panel2.Controls.RemoveAt(i)
            End If
        Next


Où initialises-tu ctl dans ta boucle ?

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualVasic (onglet Références dans les propriétés du projet).
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Mon site
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
232
puisque pas de VB.Nettiste en vue.

Ah ! En voilà un. NHenry qui a "vu" d'ailleurs la même erreur.
Content et soulagé de lui laisser la place


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développer sur ses bases.
Messages postés
206
Date d'inscription
samedi 17 janvier 2009
Statut
Membre
Dernière intervention
5 mars 2013
1
Bonjour,

En effet, ctl est declare comme Control (en fait, les 2 bouts de code se suivent). Pas bon du tout.

Tres interessant!
"Controls" fait parti de System.Windows.Form.Control.ControlCollection, donc je suppose qu'on peut l'indexer.
Et, ca marche (j'ai ajoute un -1 que j'avais oublie au depart). Merci ucfoutu, sans etre VBnettiste, la logique est toujours la et tu sais surement mieux lire ou interpreter MSDN que moi.

For i =  Me.SplitContainer1.Panel2.Controls.Count - 1 To 0 Step -1
      If TypeOf (Me.Controls(i)) Is PictureBox Then
             SplitContainer1.Panel2.Controls.RemoveAt(i)
      End If
Next


Merci a tous les deux.

MAIS, en fait ca marche et cela ne marche pas.
Et, c'est peut-etre parce que je n'ai pas tout dit (ou du moins pas clairement).

En fait, j'ai fait un modele pour essayer de comprendre comment ca marche. Cependant mon modele utilise des PictureBox mises en Design. Et le code ci-dessus marche tres bien.

Par contre, mon probleme de depart doit gerer des PictureBox introduites dynamiquement. Et dans ce cas la, il y a une erreur: Index 10 is out of range, Index 9 is out of range... jusqu'a 0.

=> Cela veut-il dire que les controles ajoutes dynamiquement ne sont pas indexes?

Si c'est le cas, je vais peut-etre chercher a utiliser la propriete Tag pour enlever mes PictureBox, car mes PicturesBox sont deja "indexes" avec la propriete Tag.
A moins qu'il y a de meilleures idees...

A+
JLuc01
Messages postés
14738
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
23 novembre 2020
148
Bonjour,

Il faut faire attention, les conteneurs peuvent être mis en cascade, il faut donc accéder au bon conteneur.

Me.SplitContainer1.Panel2.Controls
n'est pas le même conteneur que :
Me.Controls

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualVasic (onglet Références dans les propriétés du projet).
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Mon site
Messages postés
206
Date d'inscription
samedi 17 janvier 2009
Statut
Membre
Dernière intervention
5 mars 2013
1
Bonsoir NHenry,

Je n'ai pas de probleme de conteneur, mais d'images creees dynamiquement.

En fait , peux-tu repondre a cette question: est-ce que les images creees dynamiquement sont indexees?
En d'autres termes, peut-on ecrire la ligne suivante lorsque les images (je veux dire les controles PictureBox) ont ete creees dynamiquement:

If TypeOf (Me.Controls(i)) Is PictureBox Then


JLuc01
Messages postés
206
Date d'inscription
samedi 17 janvier 2009
Statut
Membre
Dernière intervention
5 mars 2013
1
Bonsoir,

Merci beaucoup, ca marche maintenant.
je pensais vraiment trop a un probleme d'index, cela me rendait aveugle.

Merci encore pour ton aide et ta patience.

A+
JLuc01