Changer une image d'un picturebox en utilisant une variable

Signaler
Messages postés
6
Date d'inscription
vendredi 30 mars 2007
Statut
Membre
Dernière intervention
15 janvier 2010
-
Messages postés
111
Date d'inscription
dimanche 24 décembre 2000
Statut
Membre
Dernière intervention
17 novembre 2012
-
Si vous voulez la question directement, allez plus bas.

j'ai fait un petit programme qui gère le stationnement chez moi pour la proprio de l'immeuble. Il y a plus de 200 espaces de stationnement et j'ai créé autant de picturebox qui sont nommé selon le numéro du stationnement. Il y a 3 "état" pour chaque stationnement: Libre, occupé ou temporaire. Chacun de ses "état" ont une image. À l'ouverture de mon programme, ce dernier parcourt un ficher texte qui contient toutes les informations de chacun des stationnements à la recherche de l'état de ces derniers.

voici le code de cette partie:
_________________________________________
Private Sub frmInterface_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim temp As String
Dim TabTemp() As String

Do Until fichierLecture.Peek = -1

temp = fichierLecture.ReadLine()
TabTemp = Split(temp, "*")

Select Case TabTemp(4)
Case Is = "L"
rbLibre.Checked = True
picS2200_1.Image = stationnement.My.Resources.Resources.actif
Case Is = "O"
rbOccu.Checked = True
picS2200_1.Image = stationnement.My.Resources.Resources.occupe
Case Is = "T"
rbTemp.Checked = True
picS2200_1.Image = stationnement.My.Resources.Resources.temporaire
End Select

Loop

End Sub
__________________________________

Comme il y a une tonne d'image à changer j'aimerais savoir si c'est possible de remplacer exemple "picS2200_1" par une variable qui proviendrais du même tableau (TabTemp(0)). De cette façon la boucle fera tout le travail :).

Si vous connaissez une meilleur façon dites le moi.

merci
Luc
A voir également:

12 réponses

Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
48
salut,

pas tout à fait dans une variable mais pas loin : il faut taper directement dans la collection CONTROLS de la form
tu pourras alors obtenir la picturebox de ton choix depuis son name

with me.controls("picS2200_" & index.tostring)
...

NB : attention, collection de type CONTROL
tu peux être mené à faire un cast vers PICTUREBOX

++

[hr]
Messages postés
6
Date d'inscription
vendredi 30 mars 2007
Statut
Membre
Dernière intervention
15 janvier 2010

Ouf merci de la rapidité !!

j'ai rien compris toute fois... je suis assez nouveau. Je peux faire des trucs de bases mais je sais pas jouer avec les CONTROL.

à quoi pourrais ressembler me ligne: picS2200_1.Image = stationnement.My.Resources.Resources.temporaire

moi au départ je voulais faire:
_________________________________________
Private Sub frmInterface_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim temp As String
Dim TabTemp() As String
Dim stat as string

Do Until fichierLecture.Peek = -1

temp = fichierLecture.ReadLine()
TabTemp = Split(temp, "*")
stat = TabTemp(0)

Select Case TabTemp(4)
Case Is = "L"
rbLibre.Checked = True
stat.Image = stationnement.My.Resources.Resources.actif
Case Is = "O"
rbOccu.Checked = True
stat.Image = stationnement.My.Resources.Resources.occupe
Case Is = "T"
rbTemp.Checked = True
stat.Image = stationnement.My.Resources.Resources.temporaire
End Select

Loop

End Sub
_______________________________

(bon en plus je viens de me rendre compte que les nom de mes pictures box ne correspondront pas avec les variable... youpi 200 nom de picture box a changer ...)

Si tu pourrais me donner plus de précision sur les CONTROL j'aimerai bien

Luc
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
48
comme je t'ai dis : me.controls(stat)

çà ressemble donc à (syntaxe à vérifier) :

Private Sub frmInterface_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim TabTemp() As String

Do Until fichierLecture.Peek = -1

TabTemp = Split(fichierLecture.ReadLine(), "*")

with directcast(me.controls(TabTemp(0)), system.windows.forms.picturebox)

Select Case TabTemp(4)
Case "L"
rbLibre.Checked = True
.Image = stationnement.My.Resources.Resources.actif

Case "O"
rbOccu.Checked = True
.Image = stationnement.My.Resources.Resources.occupe

Case "T"
rbTemp.Checked = True
.Image = stationnement.My.Resources.Resources.temporaire

End Select

end with
erase TabTemp 
Loop

End Sub 



du coup faut les bons noms, évidemment ^^
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
48
d'ailleurs on replacera
TabTemp = Split(fichierLecture.ReadLine(), "*")

par
TabTemp = fichierLecture.ReadLine.split("*".tochararray)

normalement....
Messages postés
6
Date d'inscription
vendredi 30 mars 2007
Statut
Membre
Dernière intervention
15 janvier 2010

ca ne fonctionne pas, il bug quand il arrive a: .Image = stationnement.My.Resources.Resources.actif
Mais merci quand même je vais faire ca à la dure... au moins copier coller marche.
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
48
"il bug"?
soit pas trop technique dans les explications d'erreur surtout, on risquerait de comprendre

tant que les noms dans le fichiers ne sont pas ceux des controls picturebox, y'a des risques que çà bug oui !
Messages postés
6
Date d'inscription
vendredi 30 mars 2007
Statut
Membre
Dernière intervention
15 janvier 2010

dsl...
alors il me donne: Object reference not set to an instance of an object.
j'imagine c parce que ya rien devant le point, mais je sais pas... j'ai modifier mon fichier text pour qu'il inclut le nom des picture box au tabtemp(5). voila ca que j'ai:
________________________________________________________________________________________________________________
Private Sub frmInterface_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim TabTemp() As String
fichierLecture = File.OpenText("C:\GestionStationnement\stationnement.txt")
Do Until fichierLecture.Peek = -1

TabTemp = Split(fichierLecture.ReadLine(), "*")

With DirectCast(Me.Controls(TabTemp(5)), System.Windows.Forms.PictureBox)

Select Case TabTemp(4)
Case "L"
rbLibre.Checked = True
.Image = stationnement.My.Resources.Resources.actif

Case "O"
rbOccu.Checked = True
.Image = stationnement.My.Resources.Resources.occupe

Case "T"
rbTemp.Checked = True
.Image = stationnement.My.Resources.Resources.temporaire

End Select

End With
Erase TabTemp
Loop

End Sub
______________________________

j'ai aucune idée c quoi qui marche pas, mais bon...
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
48
y'a rien devant le POINT parce qu'on est dans le WITH

sous
TabTemp = Split....

ajoute :
console.writeline("valeur 0 ={0},  valeur 4 ={1},  valeur 5 ={2}", TabTemp(0), TabTemp(4), TabTemp(5)) 
stop


ensuite lis dans la console, est-ce que la valeur4 (ou 5 maintenant?) est bien un NAME d'une de tes 200 pictureboxes existantes


la réponse est sans doute NON, comme l'indique le message d'erreur :
Object reference not set to an instance of an object
qui veut dire qu'on essaye de récupérer un nom NON-EXISTANT dans ME.CONTROLS


mais bon!!!
Messages postés
6
Date d'inscription
vendredi 30 mars 2007
Statut
Membre
Dernière intervention
15 janvier 2010

oui, dans 5 il y a bien le nom du picBox dans la console, mais .... ca marche pas ...

voici ce qu'il y a dans la console:
valeur 0 =s2200n1, valeur 4 =L, valeur 5 =picS2200_1
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
48
remplace
With DirectCast(Me.Controls(TabTemp(5)), System.Windows.Forms.PictureBox)

par
with picS2200_1

??

ps : prochain "ca marche pas" sans aucune explication (erreur exacte, ligne d'arrêt, etc), faudra trouver quelqu'un d'autre...
Messages postés
6
Date d'inscription
vendredi 30 mars 2007
Statut
Membre
Dernière intervention
15 janvier 2010

la ca marche, mais comment changer le picS2200_1 au _2 ... et ensuite les nom deviennent picS2220_1, picGA_1, picGB_1, picGC_1 ...

Mais je veux pas trop te déranger, je peux m'arranger tout seul. tu m'as vraiment beaucoup aidé et je t'en remerci.
Messages postés
111
Date d'inscription
dimanche 24 décembre 2000
Statut
Membre
Dernière intervention
17 novembre 2012
6
Bonjour,
N'as-tu pas pensé à créer tes picturebox dynamiquement au démarrage de la Form et à les stocker dans une liste

Public Class Form1

    Private PctPlaces As New List(Of PictureBox)

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'Initialisation de la form
        Me.Size = New Size(1024, 768)
        Me.StartPosition = FormStartPosition.CenterScreen
        'Création de 200 PictureBoxes
        Dim pctBox As PictureBox
        For j = 1 To 8
            For i = 1 To 25
                pctBox = New PictureBox
                pctBox.Size = New Size(35, 45)
                pctBox.Location = New Point(i * 40 - 35, j * 50 - 45)
                pctBox.BorderStyle = BorderStyle.FixedSingle
                pctBox.SizeMode = PictureBoxSizeMode.StretchImage
                'Le PictureBox est ajouté dans la List
                PctPlaces.Add(pctBox)
                'Il est aussi intégré aux Controls de la Form
                Me.Controls.Add(pctBox)
            Next
        Next
        'Mise à jour de l'état de chaque place (ton code)
        'Le numéro du PictureBox est récupéré dans le champ tabTemp(5)
        'Attention la première place porte le numéro 0
        Dim fichierLecture As System.IO.StreamReader = System.IO.File.OpenText("C:\GestionStationnement\stationnement.txt")
        Do Until fichierLecture.Peek = -1
            Dim tabTemp() As String = Split(fichierLecture.ReadLine(), "*")
            With PctPlaces(Integer.Parse(tabTemp(5)))
                Select Case tabTemp(4)
                    Case "L" : .Image = My.Resources.Resources.s01
                    Case "O" : .Image = My.Resources.Resources.s02
                    Case "T" : .Image = My.Resources.Resources.s03
                End Select
            End With
        Loop
    End Sub

End Class