Changer une image d'un picturebox en utilisant une variable

lucrobi1 Messages postés 6 Date d'inscription vendredi 30 mars 2007 Statut Membre Dernière intervention 15 janvier 2010 - 14 janv. 2010 à 23:16
mdevaux62 Messages postés 111 Date d'inscription dimanche 24 décembre 2000 Statut Membre Dernière intervention 17 novembre 2012 - 19 janv. 2010 à 17:09
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

12 réponses

PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
14 janv. 2010 à 23:33
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]
0
lucrobi1 Messages postés 6 Date d'inscription vendredi 30 mars 2007 Statut Membre Dernière intervention 15 janvier 2010
15 janv. 2010 à 00:10
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
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
15 janv. 2010 à 00:56
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 ^^
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
15 janv. 2010 à 00:59
d'ailleurs on replacera
TabTemp = Split(fichierLecture.ReadLine(), "*")

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

normalement....
0

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

Posez votre question
lucrobi1 Messages postés 6 Date d'inscription vendredi 30 mars 2007 Statut Membre Dernière intervention 15 janvier 2010
15 janv. 2010 à 01:18
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.
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
15 janv. 2010 à 01:26
"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 !
0
lucrobi1 Messages postés 6 Date d'inscription vendredi 30 mars 2007 Statut Membre Dernière intervention 15 janvier 2010
15 janv. 2010 à 01:34
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...
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
15 janv. 2010 à 01:46
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!!!
0
lucrobi1 Messages postés 6 Date d'inscription vendredi 30 mars 2007 Statut Membre Dernière intervention 15 janvier 2010
15 janv. 2010 à 01:54
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
0
lucrobi1 Messages postés 6 Date d'inscription vendredi 30 mars 2007 Statut Membre Dernière intervention 15 janvier 2010
15 janv. 2010 à 02:26
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.
0
mdevaux62 Messages postés 111 Date d'inscription dimanche 24 décembre 2000 Statut Membre Dernière intervention 17 novembre 2012 7
19 janv. 2010 à 17:09
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
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
15 janv. 2010 à 02:18
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...
-1
Rejoignez-nous