PictureBox dynamique

Résolu
cs_JLuc01 Messages postés 206 Date d'inscription samedi 17 janvier 2009 Statut Membre Dernière intervention 5 mars 2013 - 7 avril 2012 à 12:43
cs_JLuc01 Messages postés 206 Date d'inscription samedi 17 janvier 2009 Statut Membre Dernière intervention 5 mars 2013 - 9 avril 2012 à 16:34
Bonjour,

Je reviens sur un probleme que je pensais avoir resolu (voir mon message precedent). En fait, non.

Explication:
- J'ai cree des PictureBox dynamiquement, le nom correspondant s'affiche aussi dans une ListBox

Si j'ajoute 5 ou 6 images et que j'en enleve une, cela semble marcher correctement, mais lorsque j'en enleve une autre, ce qu'il y a dans ma ListBox ne correspond plus a mon image selectionnee.

Je crois que le PROBLEME provient de l'incrementation de pict.Tag. Je ne sais pas comment commencer la boucle FOR EACH CTL... avec ma premiere image (ayant le plus petit index).

Private Sub RemovePictureButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RemovePictureButton.Click
' ...code...
        ' Re-indexing the picture Tag
        ' COMMENT SELECTIONNER LA PREMIERE IMAGE ?????
        For Each ctl In Me.SplitContainer1.Panel2.Controls
            If TypeOf ctl Is PictureBox Then
                pict = CType(ctl, PictureBox)
                iTag = iTag + 1
                pict.Tag = iTag
            End If
        Next
' ...code...


Par exemple, si j'ai 5 images.

Premier cas: Click sur 5, puis Click sur 4 et RemovePictureButton
Resultat: 1 (image) 2 (listbox) , 2 3 , 3 = 4 , 4 = nothing ,5 = 1

Deuxieme cas: Click sur 3, puis Click sur 4 et RemovePictureButton
Resultat: 1 (image) 3 (listbox) , 2 4 , 3 = 1 , 4 = nothing ,5 = 2

C'est a dire que le Click sur l'image precedent l'image enlevee retient le "Focus".
Je voudrais demarrer sur l'image ayant le pict.Tag le plus petit. Comment faire???

En esperant avoir ete assez clair sur ce probleme ambigu.

Probleme de logique ou mauvais code?
Merci,

JLuc01

7 réponses

cs_JLuc01 Messages postés 206 Date d'inscription samedi 17 janvier 2009 Statut Membre Dernière intervention 5 mars 2013 1
9 avril 2012 à 01:33
Bonsoir,

Merci pour vos reponses malgre ma question peut-etre pas aussi claire que je le voulais.
Mais, c'est certainement ici la difficulte dans un forum: poser clairement sa question pour avoir la reponse appropriee.

ucfoutu, desole de t'avoir fait reagir ainsi (mais tu as du lire que la premiere ligne).

cmarcotte, pas sur d'avoir bien compris la reponse.

shayw, j'ai voulu pointer sur un detail precis, mais j'ai probablement mis une parenthese en trop et la ligne que tu soulignes en trop aussi (information apparement pas importante ou trop generale).

J'utilise en fait les lignes suivantes:
                    ' Remove Picture from the Screen
                    RemoveHandler pict.MouseMove, AddressOf imgPictureMouseMove
                    RemoveHandler pict.MouseDown, AddressOf imgPictureMouseDown
                    RemoveHandler pict.MouseClick, AddressOf imgPictureMouseClick
                    SplitContainer1.Panel2.Controls.Remove(pict)
                    ' Remove Picture from the ListBox
                    myIndex = PicturesListBox.SelectedIndex
                    PicturesListBox.Items.RemoveAt(myIndex)
                    ' Remove Picture from the ObjectList
                    myObjectList.RemoveAt(myIndex)


Donc, enlever une PictureBox n'est pas un probleme.

Pour revenir a ma question initiale, j'ai resolu le probleme de la facon suivante:
' To keep the focus of the picture in right order before tagging the picture list 
        For i = PicturesListBox.Items.Count - 1 To 0 Step -1
            PicturesListBox.SetSelected(i, True)
        Next
        ' Re-indexing the picture Tag
        For Each ctl In Me.SplitContainer1.Panel2.Controls
            If TypeOf ctl Is PictureBox Then
                pict = CType(ctl, PictureBox)
                iTag = iTag + 1
                pict.Tag = iTag
            End If
        Next

De cette facon, j'arrive a utiliser ma boucle "For Each ctl..." correctement.
Je veux dire que le premier control PictureBox detecte dans mon Panel2 a l'index 1 (le 0 est reserve pour autre chose). Alors qu'avant, la boucle "For Each ctl..." trouvait le controle PictureBox qui avait ete selectionne avant la selection du PictrureBox que j'enleve (pas necessairement l'index 1).

Bon, j'avoue que mes explications sont peut-etre compliquees.
Mais, en tout cas, cela marche parfaitement, apres l'avoir tester et retester.
De la a dire que c'est du code parfait, certainement pas, je ne suis pas un pro.
A+...

JLuc01
3
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
7 avril 2012 à 12:52
J'aime bien :
voir mon message precedent

il se trouve que j'ai au moins autant de flemme que toi et que (tout comme toi) je n'ai pas envie de chercher , hein ...
Non mais ... et puis quoi, encore ?
Tu es ici sur VBFrance.com et non sur Nombril.com !
sur ce : je vais moi également agir de la même manière : ===>>
Cherchez tous (voir certains de mes messages précédents) où je vais me "caler" pour au moins deux heures ... !

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
cs_JLuc01 Messages postés 206 Date d'inscription samedi 17 janvier 2009 Statut Membre Dernière intervention 5 mars 2013 1
7 avril 2012 à 13:54
Pas bonjour cette fois (J'ai vu que c'etait la mode!)

OK, OK! (Pour info, le message precedent doit se trouver quelques lignes dessous celui la, appelle "Enlever un controle cree dynamiquement"). Je n'aurais pas du mettre cette parenthese (que je pensais informatives), donc oubliez cette parenthese SVP.

Mais, tout est explique (peut-etre mal, a vous de juger!) dans le message ci-dessus, "PictureBox dynamique".
En tout cas, si vous pouvez m'aider, tant mieux, sinon c'est pas la fin du monde.
Je continuerais a m'arracher les cheveux...
A+

JLuc01
0
Utilisateur anonyme
7 avril 2012 à 18:07
Bonjour,

Je te dirais de te faire une table de données avec disons 3 colonnes: "Numéro de l'image", "Identification du PictureBox", "Identification de l'mage".

Ensuite, il suffit de trier la colonne numéro.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
7 avril 2012 à 23:38
Salut

Pas clair du tout
Si j'ajoute 5 ou 6 images et que j'en enleve une


et comment tu enleves une ?
et aussi ce n'est pas image mais picturebox
tu veux retirer un picturebox de ta panel ?
je n'ai pas vu que tu utilises
Panel1.Controls.Removeat
ici
0
Utilisateur anonyme
9 avril 2012 à 03:38
Bonjour,

cmarcotte, pas sur d'avoir bien compris la reponse.

Puisque le Framework permet de gérer des données en mémoire vive, aussi bien te faire un dataset avec une ou plusieurs tables de données. Nul besoin d'enregistrer quelque donnée que ce soit. Dans ta table de données tu pourrais mettre le nom (ou le numéro) d'un PictureBox fraichement créé, l'image (ou le chemin complet du fichier image) que ce PictureBox contient et même le nom, ou le numéro d'index, de cette image dans le ListBox. À chaque modification de la liste, tu ajoutes ou tu retranches la ligne qui correspond à l'image sacrifiée. Ensuite en triant la table, tu aurais l'ordre d'apparition des images dans les PictureBoxes, l'ordre d'affichage des noms dans le ListBox. Même que pour mettre à jour le ListBox, ce serait facile en pas pour rire. Il suffirait de vider le ListBox et de le recharger à partir de la table triée.

Au lieu de devoir bâtir un gestion d'erreur à n'en plus finir pour tenir compte des différences entre les PictureBoxes et le ListBox, tu pourrais les avoir toujours en phase grâce à la table de données.

Et puis, j'ai la conviction que tu n'aurais plus besoin de construire et détruire des PictureBoxes à la volée. Il suffirait de mettre un certain nombre de PictureBoxes sur une feuille et de charger les images selon les données de la table. Ensuite tu n'aurais qu'à cacher (propriété visible à false) les PictureBoxes exédentaires.
0
cs_JLuc01 Messages postés 206 Date d'inscription samedi 17 janvier 2009 Statut Membre Dernière intervention 5 mars 2013 1
9 avril 2012 à 16:34
Re-bonjour,

cmarcotte,
Oui effectivement l'idee d'un DataSet n'est pas a negliger. Il est vrai que j'associe trop vite l'idee du DataSet avec une base de donnee.

Ceci dit, dans mon cas j'utilise une List generique pour garder mes donnees et je peux aussi les trier.
La liste generique etait au depart pour apprendre quelque chose de nouveau a manier (pas facile d'ailleurs). Mais, je peux ainsi sauvegarder mes donnees dans un fichier XML (probablement possible aussi avec un dataset).

Ah! C'est toujours difficile (au moins pour moi) de trouver le meilleur outil pour telle ou telle situation, en terme de stockage de donnees.
Merci toutefois pour les precisions.

A+
JLuc01
0
Rejoignez-nous