Array - ou List(of T) - à l'intérieur d'une classe

Messages postés
66
Date d'inscription
lundi 23 avril 2007
Statut
Membre
Dernière intervention
26 mars 2019
- - Dernière réponse : NHenry
Messages postés
14594
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
16 novembre 2019
- 14 mai 2011 à 23:16
Bonjour,

Comment dois-je faire pour utiliser un array (ou List(of T)) à l'intérieur d'une classe, svp?

Le code suivant ne fonctionne pas:
Public Class Form1
 Dim prefUser As New Pref()

 Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
  prefUser.val = "false"
  prefUser.pos.Add("true")
  prefUser.pos.Add("false")
  prefUser.butt.Add("A1")
  prefUser.butt.Add("A2")
 End Sub

 Public Class Pref
  Public val As String
  Public pos As List(Of String)
  Public butt As List(Of String)
 End Class

End Class


Celui là non plus:

Public Class Form1
 
 Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
  Dim prefUser As New Pref() With {.val "false", .pos(1) "true", .pos(2)="false", .buttons(1) = "button01", .buttons(2) = "button02")}
  End Sub

 Public Class Pref
  Public val As String
  Public pos(2) As String
  Public butt(2) As String
  End Class

End Class


Comment dois-je m'y prendre, svp? D'avance merci pour votre aide!
Afficher la suite 

7 réponses

Messages postés
95
Date d'inscription
vendredi 7 février 2003
Statut
Membre
Dernière intervention
28 novembre 2017
0
Merci
salut,

gardes ta 1ère solution, elle est bien plus souple que la 2ème. maintenant, le problème vient de tes listes que ne sont pas instanciées.

voici la nouvelle déclaration de ta classe :

 Public Class Pref
  Public val As String
  Public pos As New List(Of String)
  Public butt As New List(Of String)
 End Class


tu peux continuer à utiliser le code tel qu'il est dans ton Form_Load


bonne continuation, alKa
Commenter la réponse de AlKatou
Messages postés
66
Date d'inscription
lundi 23 avril 2007
Statut
Membre
Dernière intervention
26 mars 2019
1
0
Merci
Merci alKa,
Merci pour ta solution...et pour ton conseil quant à la direction à choisir!
Commenter la réponse de Jayme65
Messages postés
14594
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
16 novembre 2019
137
0
Merci
Bonjour,

J'apporte quelques précisions :
Dim MaVariable As New Type(...)
et
Dim MaVariable as Type=New Type(...)

Sont différent, dans le premier cas, MaVariable ne sera jamais à Nothing, mais cela ralenti un peu le programme car à chaque fois il contrôle si la valeur est Nothing et si c'est le cas recréé l'objet.

Sinon, pour ton problème, qui semble plus être un problème de constructeur, voici une proposition (code à ajouter dans ta classe Pref) :
Public Sub New(Byval pVal as String,byval ptPos as string(), ByVal ptButt as string())
val =pVal
pos =new List(Of String)
pos.AddRange(ptPos)
butt=new List(Of String)
butt.AddRange(ptButt)
end sub


Ensuite, tu construit ton objet :
MonObjet=New Pref("Val",new String(){"Chaine1", "Chaine2"},New String(){"Butt1","Butt2"})

Auquel cas, la déclaration et l'assignation peuvent être séparées.

Il est d'usage d'éviter les variables exportées et de préférer les assigner par des propriété (mot clé Property), cela permet d'éviter des modifications hasardeuses.

Sache que les constructeurs paramétrés sont aussi utilisables avec les structures.

Sinon, dans ton exemple, tu mets les valeurs true et false, est-ce qu'un booléen serait plus adapté ?
As-tu vérifié que Option Strict était à On dans les propriétés de ton projet ?

Mon site
Commenter la réponse de NHenry
Messages postés
66
Date d'inscription
lundi 23 avril 2007
Statut
Membre
Dernière intervention
26 mars 2019
1
0
Merci
alKa, NHenry,

Puis-je encore profiter de vos lumière?
En fait, dans cette class Pref() je voudrais reprendre des boutons radio existants.
J'ai donc adapté la classe en fonction (du moins c'est ce que je pensais ;-)
Public Class Pref
    Public val As String
    Public pos As List(Of String)
    Public butt As List(Of RadioButton)
    Public Sub New(ByVal pVal As String, ByVal ptPos As String(), ByVal ptButt As RadioButton())
        val = pVal
        pos = New List(Of String)
        pos.AddRange(ptPos)
        butt = New List(Of RadioButton)
        butt.AddRange(ptButt)
    End Sub
End Class


Mais maintenant, comment dois-je faire pour faire 'rentrer' des boutons radio EXISTANTS?
J'ai essayé (vraiment comme un débutant que je suis)
Dim show_userroms As New Pref("false", New String() {"true", "false"}, {A1, A2})

(A1 et A2 sont les noms des RadioButton)

Mais sans résulat..pouvez vous m'aider svp?
Merci
Commenter la réponse de Jayme65
Messages postés
14594
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
16 novembre 2019
137
0
Merci
Bonjour,

Si tu ne stocke que des booléens, préfères plutôt le type Boolean que String.

Ensuite, tu peux faire une fonction qui te donne l'index (dans une collection, List(of T), de Radiobutton) de l'élément sélectionné.

Et dans ce cas, le type de butt sera Integer et non string().

Mon site
Commenter la réponse de NHenry
Messages postés
66
Date d'inscription
lundi 23 avril 2007
Statut
Membre
Dernière intervention
26 mars 2019
1
0
Merci
Aurais tu par hasard, le temps/l'occasion d'adapter le script selon ce que tu me proposes..c'est un peu obscur pour moi!
D'avance je te remercie :)
Commenter la réponse de Jayme65
Messages postés
14594
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
16 novembre 2019
137
0
Merci
Bonjour,

Public Class Pref
    Public val As Boolean
    Public pos As List(Of Boolean)
    Public butt As Integer
    Public Sub New(ByVal pVal As String, ByVal ptPos As String(), ByVal pButt As Integer)
        val = pVal
        pos = New List(Of Boolean)
        pos.AddRange(ptPos)
        butt=pButt
    End Sub
End Class

Public Class Form1
Dim prefUser As Pref

Dim lLstRadio as list(of RadioButton)=list(of RadioButton)

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
lLstRadio.AddRange(new RadioButton(){RadioButton1,RadioButton2,RadioButton3,RadioButton4,...})

prefUser=New Pref(false,new Boolean(){true,false},GetIndexSelected)
End Sub

Private Function GetIndexSelected() As Integer
For i As Integer=0 To lLstRadio.Count-1
If lLstRadio(i).Checked then Return i
Next
End Function

End Class


A adapter selon tes besoins.

Mon site
Commenter la réponse de NHenry