Probleme de Controls

Loshen54000 Messages postés 1 Date d'inscription samedi 20 janvier 2018 Statut Membre Dernière intervention 20 janvier 2018 - Modifié le 20 janv. 2018 à 00:41
Whismeril Messages postés 19029 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 26 avril 2024 - 20 janv. 2018 à 08:39
Bonjour, je viens pour vous communiquer mon problème, je cherche à faire une succession de modifications de texte de labels (nommés de façon lbl_dice_TYPE DE DES_XXX) qui serraient égaux à un chiffre de dés (contenus dans une variable du type Integer en array) pour un jeu de rôle,

voici le code de base :


For i = 1 To 30
Me.Controls("lbl_dice_atk_" & i).Text = dice_atk(i - 1)
Me.Controls("lbl_dice_def_" & i).Text = dice_def(i - 1)
Me.Controls("lbl_dice_atm_" & i).Text = dice_atm(i - 1)
Me.Controls("lbl_dice_dfm_" & i).Text = dice_dfm(i - 1)
Next


Qui me sort comme erreur : System.NullReferenceException : 'La référence d'objet n'est pas définie à une instance d'un objet.'

alors que par exemple :


lbl_dice_atk_1.Text = dice_atk(0)


Fonctionne à merveille...

Je ne comprends pas trop où est le soucis, si quelqu'un pouvait m'aider, je l'en remercie d'avance, merci.

1 réponse

Whismeril Messages postés 19029 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 26 avril 2024 656
20 janv. 2018 à 08:38
Bonjour



Ceci
lbl_dice_atk_1.Text = dice_atk(0)
appelle l'objet qui s'appelle lbl_dice_atk_, et donc s'utilise comme tout objet instancié (on dit aussi variable).

Ceci
Me.Controls()
appelle une collection d'objets de type Control. Et par conséquent
Me.Controls("un truc ici")
tente d'aller chercher un élément de la collection.

Me.Controls("un truc ici")
n'est pas comparable à
lbl_dice_atk_1.Text = dice_atk(0)
, donc quand tu dis que l'un marche et l'autre pas, c'est un peu comme puisque la voiture rouge est en état de marche, la bleue ne peut pas être en panne. Tu ne parles pas de la même chose.

Tu aurais dit
Me.Controls(0)</code est accepté mais ça change le texte d'un bouton, là tu aurais parlé de chose comparable, l'élément 0 de la collection existe <gras>ET</gras> c'est un bouton.
Tu aurais dit <code basic>Me.Controls("lbl_dice_atk_001")
ça marche mais pas
Me.Controls("lbl_dice_atk_" & i)
là tu aurais vraiment parlé de chose comparable.

Visual basic est trop permissif, il t'autorise à mélanger les torchons et les serviettes. "lbl_dice_atk_" c'est du texte, donc un string, i c'est un entier. En informatique un entier ça ne "s'agglomère" pas avec un string.
VB tolère que tu l'écrives, et essaye de s'en débrouille par-devers toi. Pour ça il utilise la méthode ToString de l'objet. Il agglomère donc bien 2 strings "lbl_dice_atk_" et "1". Le résultat est donc "lbl_dice_atk_1", or plus haut tu marques que le format est lbl_dice_TYPE DE DES_XXX, je suppose que XXX veut dire 3 chiffres.

Première chose à faire, vérifier que "lbl_dice_atk_1" existe vraiment. Si en fait c'est "lbl_dice_atk_001", et bien prend l'habitude de construire correctement tes string
Dim nom as String = "lbl_dice_atk_" & i.ToString("000")
là je force le format de la représentation de l'entier en string. Tu peux aussi utiliser String.Format (c'est son job)
Dim nom as String = String.Format("lbl_dice_atk_{0:000}", i)
Format place le parametre n à la place de {n} (bon pour un c'est sûr, c'est un peu lourd, mais pour des construction complexes c'est très bien), si il y a n:trucmche, il applique le format trucmuche à l'objet.


Voilà, j'ai passé 30 minutes à tapé ça, et je me suis dit,
je vais quand même zoomer sur son image des fois qu'il y ait une info complémentaire utile
et là surprise, le code que tu as mis dans le message n'est pas celui qui plante.....

Donc tant pis, tu vas lire ce que j'ai pris la peine de rédiger... T'avais qu'à poser ta question correctement.
Donc l'objet lbl_dice_atk_1 existe, là y'a 2 options
-Il n'est pas dans Me.Controls, tu l'as par exemple placé dans un groupBox et, par conséquent, il est dans la collection Controls dudit groupBox
-la variable qui représente ton label s'appelle bien lbl_dice_atk_1, mais lbl_dice_atk_1.Name n'est pas "lbl_dice_atk_1" (par exemple, pour tout contrôle instancié par le code, la propriété Name est vide. La propriété peut aussi avoir été modifiée encours de route.) Au moment ou ça plante, regarde le contenu de lbl_dice_atk_1.Name.



0
Whismeril Messages postés 19029 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 26 avril 2024 656
20 janv. 2018 à 08:39
PS t'as vu mon code à vraiment de la couleur contrairement au tient, qui n'as qu'un fond gris. C'est parce que je précise que le langage est du basic.
http://codes-sources.commentcamarche.net/faq/10686-le-nouveau-codes-sources-comment-ca-marche#balises-code
0
Rejoignez-nous