Créer des PictureBox à la volée comme dans l'ancien temps. :) [Résolu]

Messages postés
375
Date d'inscription
mardi 1 juillet 2003
Dernière intervention
5 juin 2018
- - Dernière réponse : MicDundee
Messages postés
375
Date d'inscription
mardi 1 juillet 2003
Dernière intervention
5 juin 2018
- 20 août 2010 à 22:29
Salut !
Jadis dans VB6, il était simple de créer des objets à la volée avec "Load". Sous VB 2008, j'y arrive pas. Je peux en faire avec un nom différent par exemple "Picture1", "Picture2" mais je serais intéressé par "Pictures(n)" afin de travailler dans des boucles.
Y a-t-il un moyen ?
Merci
Afficher la suite 

Votre réponse

9 réponses

Meilleure réponse
Messages postés
14319
Date d'inscription
vendredi 14 mars 2003
Dernière intervention
11 décembre 2018
3
Merci
Bonjour,

Rien que le fait que tu écrives :
PictureBox3.Controls.Item(I).BackgroundImage = ImageListNotes.Images.Item(0)

Indique de Option Strict est à Off, mets-le à On
Ensuite change :
directcast(PictureBox3.Controls.Item(I),PictureBox).BackgroundImage = ImageListNotes.Images.Item(0)

Plus propre et tu retrouve tous le membres du PictureBox.

Pour l'histoire de la boucle :
Tu ajoutes la même PictureBox à chaque fois, change légèrement ton code :

        Dim Pics As PictureBox
        Dim I As Integer
        Pics.BorderStyle = BorderStyle.Fixed3D
        Pics.SizeMode = PictureBoxSizeMode.AutoSize
        For I = 0 To 9
            Pics = New PictureBox()
            PictureBox3.Controls.Add(Pics)
            PictureBox3.Controls.Item(I).Left = 150
            PictureBox3.Controls.Item(I).Top = Val(ModuleINI.GetValue("IMAGES_SOLFEGE", I))
            PictureBox3.Controls.Item(I).BackgroundImage = ImageListNotes.Images.Item(0)
        Next


C'est même légèrement simplifiable :
        Dim I As Integer
        For I = 0 To 9
            Pics = New PictureBox()
            PictureBox3.Controls.Add(Pics)
            With DirectCast(PictureBox3.Controls(I),PictureBox)
                .Left = 150
                .Top = Val(ModuleINI.GetValue("IMAGES_SOLFEGE", I))
                .BackgroundImage = ImageListNotes.Images.Item(0)
                .BorderStyle = BorderStyle.Fixed3D
                .SizeMode = PictureBoxSizeMode.AutoSize
            End With
        Next



Merci NHenry 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 101 internautes ce mois-ci

Commenter la réponse de NHenry
Messages postés
375
Date d'inscription
mardi 1 juillet 2003
Dernière intervention
5 juin 2018
0
Merci
Je suis sur la bonne voix car j'ai pu en faire mais il y a un hic.

Voici mes tests :
        Dim Pics As New PictureBox
        PictureBox3.Controls.Add(Pics)

        PictureBox3.Controls.Item(0).Width = 200
        PictureBox3.Controls.Item(0).Height = 200
        PictureBox3.Controls.Item(0).BackgroundImage = ImageListNotes.Images.Item(0)
        AddHandler PictureBox3.Controls.Item(0).Click, AddressOf ButtonD_Click


Ca marche mais je n'ai pas tout ce qu'un vrai PictureBox a après le point. Par exemple, je souhaite un bord 3d mais il n'y a pas ".BorderStyle"
J'ignore si mon Handler fonctionnera. C'est à la volée justement que je l'ai écrit. VB n'a pas rien dit mais...
Commenter la réponse de MicDundee
Messages postés
375
Date d'inscription
mardi 1 juillet 2003
Dernière intervention
5 juin 2018
0
Merci
Bon, j'ai fini par trouver tout seul mais cela pourra servir à quelqu'un !

Quand je dis "J'ai fini par trouver tout seul" ça veut dire quoi ? Ca veut dire que je suis en train d'imiter Sarkozy !

Voici ma trouvaille !
        Dim Pics As New PictureBox
        Pics.BorderStyle = BorderStyle.Fixed3D
        PictureBox3.Controls.Add(Pics)

        PictureBox3.Controls.Item(0).Width = 200
        PictureBox3.Controls.Item(0).Height = 200
        PictureBox3.Controls.Item(0).Left = 10
        PictureBox3.Controls.Item(0).Top = 10
        PictureBox3.Controls.Item(0).BackgroundImage = ImageListNotes.Images.Item(0)
        AddHandler PictureBox3.Controls.Item(0).Click, AddressOf pour

PictureBox3 c'est l'endroit où je veux créer mes images.
Pour obtenir le style de chaque PictureBox créés, il faut modifier le "New PictureBox" avant. Dans mon code, j'ai défini le bord en 3D "Pics.BorderStyle" avant la création. La nouvelle image était créée avec un bord 3D.

J'ignore s'il y a une autre technique mais en tout cas c'est le fruit de beaucoup de cheuveux arrachés depuis tout à l'heure. Bon, 4 h 39, je vais au pieu !
Commenter la réponse de MicDundee
Messages postés
375
Date d'inscription
mardi 1 juillet 2003
Dernière intervention
5 juin 2018
0
Merci
J'ai oublié de préciser que mon handler fonctionne à merveille ! "pour" est une fonction créée pour tester justement. Un clic sur l'image créée et ça marche.
Commenter la réponse de MicDundee
Messages postés
14010
Date d'inscription
samedi 29 décembre 2001
Dernière intervention
28 août 2015
0
Merci
Salut MiciM

Il va falloir qu'on ouvre une section "monologue" ou "auto-démerdage" !

Merci d'avoir partagé.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Commenter la réponse de cs_Jack
Messages postés
375
Date d'inscription
mardi 1 juillet 2003
Dernière intervention
5 juin 2018
0
Merci
Salut Jack !

De rien c'est normal ! Je profite bien des informations postées ici ou là alors, c'est donc à mon tour d'en mettre lorsque je peux. Néanmoins, si quelqu'un a une meilleure solution, qu'il n'hésite pas.

A+
Commenter la réponse de MicDundee
Messages postés
375
Date d'inscription
mardi 1 juillet 2003
Dernière intervention
5 juin 2018
0
Merci
Bon les enfants, c'est pas trop ça où j'ai oublié quelques chose.

Mes tests avaient portés sur une image créée et ça marchais bien mais à la seconde (dans une boucle), ça plante "L'index 1 est hors limites. Nom du paramètre : index".

        Dim Pics As New PictureBox
        Dim I As Integer
        Pics.BorderStyle = BorderStyle.Fixed3D
        Pics.SizeMode = PictureBoxSizeMode.AutoSize
        For I = 0 To 9
            PictureBox3.Controls.Add(Pics)
            PictureBox3.Controls.Item(I).Left = 150
            PictureBox3.Controls.Item(I).Top = Val(ModuleINI.GetValue("IMAGES_SOLFEGE", I))
            PictureBox3.Controls.Item(I).BackgroundImage = ImageListNotes.Images.Item(0)
        Next

Dès que le I passe à 1, Vb affiche l'erreur. Pourtant "PictureBox3.Controls.Add()" a dû créé une nouvelle image non ?
Commenter la réponse de MicDundee
Messages postés
375
Date d'inscription
mardi 1 juillet 2003
Dernière intervention
5 juin 2018
0
Merci
Salut
Super ! Merci NHenry
J'aurais pas trouvé cela ! Là en plus j'ai tous les attributs. C'est cool !
Encore merci.
Commenter la réponse de MicDundee
Messages postés
375
Date d'inscription
mardi 1 juillet 2003
Dernière intervention
5 juin 2018
0
Merci
Pour ceux qui sont intéressés (peut être moi aussi si j'ai faux), une fois les images créées, comment les modifier ?
J'avais essayé « PictureBox3.Controls.Item(I)... » mais impossible de modifier l'image avec ça.

Alors, j'ai eu l'idée de ça (prenant exemple du script de la création) :

            For I = 0 To 9
                With DirectCast(PictureBoxSolfege.Controls(I), PictureBox)
                    .Image = ImageListNotes.Images.Item(I)
                End With
            Next

Ca fonctionne mais est-ce la bonne méthode ?
Commenter la réponse de MicDundee

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.