none
Récupérer une variable de type string pour la réinsérer dans un nom de variable d'un autre type RRS feed

  • Question

  • Bonjour, est-il possible d'avoir une variable de type string et d'utiliser cette dernière pour l'insérer dans un nom de variable d'un autre type? Voici un exemple pour que cela soit plus clair : 

    Dans mon programme j'utilise un comboBox, pour récupérer la valeur de l'item sélectionné aucun souci de ce coté là, je récupère cette valeur sous forme d'un string. Par la suite j'instancie un objet de la classe magasin (classe que j'ai créée). Je créé plusieurs objet de la classe magasin.

    Si l'item sélectionné dans la comboBox vaut "objet1", et que j'enregistre ce dernier dans une variable tampon nommé mon_objet1, est-il possible de faire quelque chose du genre mon_objet1.prix ? Sachant que prix est un attribut de la classe magasin.

    J'aimerai utilisé une méthode de ce genre la pour éviter d'avoir un paquet de if dans mon code.

    J'espère être compris :)


    Cordialement, maxkun ;)

    mercredi 11 juillet 2012 08:05

Réponses

  • Donc je ferais qq chose comme le code ci-dessous. Le principe est que la liste déroulante affiche la propriété Nom d'une liste d'équipements. Au clic sur le bouton on peut récupérer le "SelectedItem" sous forme de l'objet Equipement sélectionné par l'utilisateur et donc le traiter par exemple ici on l'ajoutant ou non à l'inventaire (qui est lui-même une liste d'équipements) du personnage. Le même code restera inchangé au fur et à mesure de l'ajout de nouveaux équipements dans la liste de départ.

    Option Strict On
    Option Explicit On
    Option Infer Off
    Public Class Form1
        Class Equipement
            Public Property Attaque As Integer
            Public Property Nom As String
            Public Property Prix As Integer
        End Class
        Public Class Personnage
            Public Property Inventaire As New List(Of Equipement)
        End Class
        Public perso As New Personnage
        Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load
            Dim Equipements As New List(Of Equipement)
            Equipements.Add(New Equipement With {.Attaque = 5, .Nom = "Epée niveau 1", .Prix = 50})
            Equipements.Add(New Equipement With {.Attaque = 10, .Nom = "Epée niveau 2", .Prix = 50})
            ComboBox1.DisplayMember = "Nom"
            ComboBox1.DataSource = Equipements
        End Sub
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            Dim equipement As Equipement = CType(ComboBox1.SelectedItem, Equipement)
            If perso.Inventaire.Contains(equipement) Then
                MsgBox("Vous avez déjà " & equipement.Nom & ".")
            Else
                perso.Inventaire.Add(equipement)
                MsgBox("Vous êtes maintenant équipé avec " & equipement.Nom & ".")
            End If
        End Sub
    End Class
    Donc j'ai remplacé une variable qui représente chacun des deux équipements par une liste qui me permet de traiter ensuite n'importe quel équipement de la liste de la même façon...


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".


    mercredi 11 juillet 2012 11:41
    Modérateur

Toutes les réponses

  • Bonjour,

    Je crois comprendre que l'on veut créer une variable dont le nom serait calculé à partir d'autre données ? Les noms des variables doivent être connus à la compilation (et comment les manipulerait on dans le code ?).

    Généralement on garde une structure de données comme une liste, un dictionnaire, un tableau dans lequel on va chercher la donnée qui nous intéresse. Le nom de la variable elle-même va juste être la même et représente le magasin sélectionné sans avoir à l'appeler d'un nom qui correspond au magasin sélectionné.

    Par exemple :

        Private Sub Demo()
            Dim Articles As New Dictionary(Of String, Article)
            Articles.Add("A", New Article With {.Nom = "A...", .Prix = 5})
            Articles.Add("B", New Article With {.Nom = "B...", .Prix = 10})
            Dim a As Article = Articles("A")
            MsgBox(a.Prix)
        End Sub
    On a donc un dictionnaire d'article classé par code article, avec le nom et le prix et on peut aller chercher l'article A (ou n'importe quel code qui viendrait d'une liste déroulante par exemple) avant de le manipuler...


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".


    mercredi 11 juillet 2012 08:28
    Modérateur
  • Je ne suis pas sur que cela corresponde a ce que je cherche vraiment, je vais vous fournir des extrait de mon code pour être plus précis.

    Classe magasin : 

    Public Class magasin
    
        Public attaque_physique As Integer = 0
        Public prix As Integer = 0
        Public nom_item As String
    
    
        Sub New(ByVal attaque_phys As Integer, ByVal nom As String, ByVal prix_item As Integer)
            attaque_physique = attaque_phys
            nom_item = nom
            prix = prix_item
        End Sub
    
    End Class


    Voici ici les déclarations de mes objets de la classe magasin : 

            arme_physique_lvl_1 = New magasin(5, "Epée niveau 1", 50)
            arme_physique_lvl_2 = New magasin(10, "Epée niveau 2", 100)

    Et voici comment je récupère mes variables actuellement :

    Private Sub equiper_arme_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles equiper_arme.Click
            If liste_arme1.SelectedItem = Form1.arme_physique_lvl_1.nom_item Then
                If Form1.perso.arme_equipee = Form1.arme_physique_lvl_1.nom_item Then
                    MsgBox("Déjà équipé!")
                    Exit Sub
                End If
                If Form1.perso.bonus_de_force_physique_totale > 0 Then Form1.perso.bonus_de_force_physique_totale = Form1.perso.bonus_de_force_physique_totale - Form1.perso.bonus_de_force_arme_physique 'si il y a déjà un bonus de force physique, on le retire
                If Form1.perso.bonus_de_force_magique_totale > 0 Then Form1.perso.bonus_de_force_magique_totale = Form1.perso.bonus_de_force_magique_totale - Form1.perso.bonus_de_force_arme_magique 'si il y a déjà un bonus de force magique, on le retire
                Form1.perso.bonus_de_force_arme_physique = 0 'on remet le bonus de force à 0 pour ne pas les cumuler
                Form1.perso.bonus_de_force_arme_magique = 0 'on remet le bonus de force à 0 pour ne pas les cumuler
                Form1.perso.bonus_de_force_arme_physique = Form1.perso.bonus_de_force_arme_physique + Form1.arme_physique_lvl_1.attaque_physique 'on ajoute le bonus de force de l'arme à la variable de bonus de force arme totale
                Form1.perso.bonus_de_force_physique_totale = Form1.perso.bonus_de_force_physique_totale + Form1.perso.bonus_de_force_arme_physique ' on attribut le bonus de force de l'arme au bonus totale de force
                bonus_force.Text = Form1.perso.bonus_de_force_physique_totale 'on met à jour la form
                bonus_force_magique.Text = Form1.perso.bonus_de_force_magique_totale 'on met à jour la form
                Form1.perso.arme_equipee = Form1.arme_physique_lvl_1.nom_item 'on met à jour la form
                arme.Text = Form1.perso.arme_equipee 'on met à jour la form
            End If
            '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
            '*****************************************************************************************************************************************************'
            '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
            If liste_arme1.SelectedItem = Form1.arme_physique_lvl_2.nom_item Then
                If Form1.perso.arme_equipee = Form1.arme_physique_lvl_2.nom_item Then
                    MsgBox("Déjà équipé!")
                    Exit Sub
                End If
                If Form1.perso.bonus_de_force_physique_totale > 0 Then Form1.perso.bonus_de_force_physique_totale = Form1.perso.bonus_de_force_physique_totale - Form1.perso.bonus_de_force_arme_physique
                If Form1.perso.bonus_de_force_magique_totale > 0 Then Form1.perso.bonus_de_force_magique_totale = Form1.perso.bonus_de_force_magique_totale - Form1.perso.bonus_de_force_arme_magique
                Form1.perso.bonus_de_force_arme_physique = 0
                Form1.perso.bonus_de_force_arme_magique = 0
                Form1.perso.bonus_de_force_arme_physique = Form1.perso.bonus_de_force_arme_physique + Form1.arme_physique_lvl_2.attaque_physique
                Form1.perso.bonus_de_force_physique_totale = Form1.perso.bonus_de_force_physique_totale + Form1.perso.bonus_de_force_arme_physique
                bonus_force.Text = Form1.perso.bonus_de_force_physique_totale
                bonus_force_magique.Text = Form1.perso.bonus_de_force_magique_totale
                Form1.perso.arme_equipee = Form1.arme_physique_lvl_2.nom_item
                arme.Text = Form1.perso.arme_equipee
            End If
     
        End Sub

    J'ai un comboBox "liste_arme1" pour sélectionner un objet.

    Donc voila le code pour seulement 2 objets de la classe magasin, autant dire que rajouter un objet alourdi pas mal le code...

    Je précise que je travaille sur plusieurs form et que les déclarations des objet magasin sont faites dans la form1.

    Donc ici en fait, j'aimerai avoir quelque chose comme :

    liste_arme1.SelectedItem.attaque_physique
    liste_arme1.SelectedItem.prix
    liste_arme1.SelectedItem.nom_item
    Cela m'éviterai de faire un if pour chaque item, le problème ici c'est que "liste_arme1.SelectedItem" est de type string et je ne sais pas comment permuter cette variable en type magasin.


    Cordialement, maxkun ;)

    mercredi 11 juillet 2012 08:47
  • Donc je ferais qq chose comme le code ci-dessous. Le principe est que la liste déroulante affiche la propriété Nom d'une liste d'équipements. Au clic sur le bouton on peut récupérer le "SelectedItem" sous forme de l'objet Equipement sélectionné par l'utilisateur et donc le traiter par exemple ici on l'ajoutant ou non à l'inventaire (qui est lui-même une liste d'équipements) du personnage. Le même code restera inchangé au fur et à mesure de l'ajout de nouveaux équipements dans la liste de départ.

    Option Strict On
    Option Explicit On
    Option Infer Off
    Public Class Form1
        Class Equipement
            Public Property Attaque As Integer
            Public Property Nom As String
            Public Property Prix As Integer
        End Class
        Public Class Personnage
            Public Property Inventaire As New List(Of Equipement)
        End Class
        Public perso As New Personnage
        Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load
            Dim Equipements As New List(Of Equipement)
            Equipements.Add(New Equipement With {.Attaque = 5, .Nom = "Epée niveau 1", .Prix = 50})
            Equipements.Add(New Equipement With {.Attaque = 10, .Nom = "Epée niveau 2", .Prix = 50})
            ComboBox1.DisplayMember = "Nom"
            ComboBox1.DataSource = Equipements
        End Sub
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            Dim equipement As Equipement = CType(ComboBox1.SelectedItem, Equipement)
            If perso.Inventaire.Contains(equipement) Then
                MsgBox("Vous avez déjà " & equipement.Nom & ".")
            Else
                perso.Inventaire.Add(equipement)
                MsgBox("Vous êtes maintenant équipé avec " & equipement.Nom & ".")
            End If
        End Sub
    End Class
    Donc j'ai remplacé une variable qui représente chacun des deux équipements par une liste qui me permet de traiter ensuite n'importe quel équipement de la liste de la même façon...


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".


    mercredi 11 juillet 2012 11:41
    Modérateur
  • Méthode très intéressante, je vais essayé de mettre ça en place et je vous tiens au courant.



    Cordialement, maxkun ;)



    • Modifié maxkun jeudi 12 juillet 2012 06:32
    mercredi 11 juillet 2012 12:39