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

Résolu
Utilisateur anonyme - 20 août 2010 à 02:51
 Utilisateur anonyme - 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

9 réponses

NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
20 août 2010 à 13:55
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



3
Utilisateur anonyme
20 août 2010 à 04:16
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...
0
Utilisateur anonyme
20 août 2010 à 04:41
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 !
0
Utilisateur anonyme
20 août 2010 à 04:44
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.
0

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

Posez votre question
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
20 août 2010 à 09:50
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)
0
Utilisateur anonyme
20 août 2010 à 11:56
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+
0
Utilisateur anonyme
20 août 2010 à 12:53
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 ?
0
Utilisateur anonyme
20 août 2010 à 21:08
Salut
Super ! Merci NHenry
J'aurais pas trouvé cela ! Là en plus j'ai tous les attributs. C'est cool !
Encore merci.
0
Utilisateur anonyme
20 août 2010 à 22:29
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 ?
0
Rejoignez-nous