Utilisation des property avec tableau de string

megamario Messages postés 67 Date d'inscription mercredi 2 février 2005 Statut Membre Dernière intervention 22 novembre 2018 - Modifié le 2 juil. 2018 à 18:53
Whismeril Messages postés 19024 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 18 avril 2024 - 2 juil. 2018 à 16:04
Bonjour à tous,,

J'ai un petit souci avec des passages de paramètres à un objet que j'ai crée.
Cet objet (MultiRoundLabel) comporte jusqu’à 4 autres objet (créer aussi RoundLabel)

Voila mon RoudLabel:


Et mon MultiRoundLabel:


Mon souci c'est avec le passage de paramètres d'un tableau de string (pour changer les textes des Labels)

    Public Property m_Text() As String()
        Get
            Return _Text
        End Get
        Set(value As String())
            _Text = value
            For i As Integer = 0 To _NbLabelMax
                _MesLabels(i).m_Text = _Text(i)
            Next
            Refresh()
        End Set
    End Property


_MesLabels c'est bien-sur mes RoundLabel x 4


Lorsque je souhaite changer l'un des labels, si je fait cela:

MultiRoundLabel1.m_Text(0) = "Mon nouveau label 0"


Le process ne rentre pas dans le property, Donc je n'est pas la mise à jour de mes labels ou du moins de celui que j'ai besoin de changer.

Pourtant si j’interroge de nouveau:
dim s as string = MultiRoundLabel1.m_Text(0) 


s est bien égale à "Mon nouveau label 0"

Pour que cela fonctionne je suis obligé de faire:
Dim txt() as string
txt = MultiRoundLabel1.m_Text
txt(0) = "Mon Nouveau Label 0"
MultiRoundLabel1.m_Text = txt


Et la je rentre bien dans property avec la mise à jour des RoundLabel.
Suis-je obligé d'en passer par là ou y a t'il une solution.

J'ai le même souci avec toutes mes propriétés avec tableau.

J'ai pas de souci en édition donc tout ce qui est propre à l'édition (mes couleurs, font, taille etc), pas de souci.
Mais par exemple avec la Visibilité des Labels j'ai le même souci:

    Public Property m_Visible() As Boolean()
        Get
            Return _Visible
        End Get
        Set(value As Boolean())
            _Visible = value
            Dim j As Integer = 0
            For i As Integer = 0 To _NbLabelMax
                _myPanel(i).Visible = _Visible(i)
                If _myPanel(i).Visible Then
                    j = j + 1
                End If
                _myPanel(i).Top = (j - 1) * (_Height + _Espace)
            Next
            Me.Height = (j * _Height) + (j * _Espace)
            Refresh()
        End Set
    End Property


Petite explication, j'ai des Panel qui accueil mes RoundLabel (dessin) cela me permet de les rendre invisible si besoin. Et je redimensionne mon MultiRoundLabel en conséquence.

Mais la encore pour que le Property sois exécuté il faut que je lui envoie le tableau complet et pas seulement _visible(0) = true

Cela me fait rajouter par mal de ligne de code.

Si vous avez une solution, je vous remercie.

2 réponses

Whismeril Messages postés 19024 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 18 avril 2024 656
2 juil. 2018 à 13:04
Bonjour,

Ta propriété c’est le tableau entier. Pas le contenu d’un item.
Si je fais une comparaison (un peu tirée par les cheveux, mais parlante je pense) avec Excel.

Ta propriété c’est le chemin du fichier.
Modifier le contenu d’une cellule, n’impacte pas le chemin du fichier.

Tu as plusieurs options qui me viennent en tête:
  • celle que tu as utilisée
  • mettre Refresh publique et l’appeler après chaque modifications
  • écrire un setter avec le texte à saisir et l’index en paramètres, ce setter appelant la méthode Refresh
  • utiliser une ObesrvableCollection plutôt qu’un tableau, et abonner ton objet aux changements de celle-ci.
  • rendre ton objet indexable, la méthode indexée chargeant le bon label et le Resfresh
  • et sans doute d’autres....

0
megamario Messages postés 67 Date d'inscription mercredi 2 février 2005 Statut Membre Dernière intervention 22 novembre 2018
2 juil. 2018 à 13:21
Merci Whismeril,

J’espérais qu'il y aurait eue un mot clef éventuellement à ajouter au property.

Ce qui me surprend c'est que lorsque je rappel la variable que je viens de modifier elle est prise en compte...
D'ailleurs j'ai créé une méthode public dans MultiRoundLabel permettant de faire un update des paramètres et cela fonctionne bien, mon tableau privé dans MultiRoundLabel à bien été mis à jour.

Pour le moment j'ai repris ma solution en la plaçant dans une méthode permettant de traiter le texte, le tooltip, la visibilité. ainsi cela reste concentré dans une méthode et pas éparpillé partout. Se qui me gène c'est que j'ai une quantité variable de RoundLabel, donc pour sauvegarder le tableau avant de le modifier je doit lui donner la dimension. Je fait un Redim mais bon il me semble que c'est lent cette fonction.

Mais je prend note de vos autres propositions et je regarde cela.

Merci beaucoup.
0
Whismeril Messages postés 19024 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 18 avril 2024 656
2 juil. 2018 à 13:57
Une List(of....) est toujours plus pratique à utiliser qu’un tableau, tu ajoutes, ou enlève des items sans problème.
Quite, à changer ton tableau pas une autre collection, dans ton cas, essaye l’observablecollection
0
Whismeril Messages postés 19024 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 18 avril 2024 656
2 juil. 2018 à 13:59
Quand au fait que l’item dans tableau privé soit modifié c’est normal.
Mais comme tu n’as pas modifié le tableau entier, tu n’es pas passé dans la propriété et donc Refresh n’est pas appelé.
0
megamario Messages postés 67 Date d'inscription mercredi 2 février 2005 Statut Membre Dernière intervention 22 novembre 2018 > Whismeril Messages postés 19024 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 18 avril 2024
2 juil. 2018 à 14:18
Merci Whishmeril, c'est bien ce que j'au cru comprendre pour le refresh, mais sur le coup cela m'a perturbé.

je connaissais pas observablecollection, je vais regarder cela. J'utilise beaucoup les dictionnaires et collections, je sais qu'il y en a d'autre comme list(of) que j'ai utilisé pour des classes serialisable pour faire du XML, Mais j’avoue que je mis suis pas trop penchez dessus.

Je m’était cotonné au tableau de string pour avoir l'information en mode édition sur mon objet graphique, mais à vrai dire pour le texte j'en ai pas besoin en édition, d'ailleurs je lui est mis les mêmes textes que dans le constructeur de mon objet graphique MiltiRoundLabel. Je pourrais passer par une simple méthode. Mais cela m'a appris quelques chose.

En tout cas merci beaucoup pour ces explications clair, et je vais regarder ce observablecollection cela m'intrigue.
0
Whismeril Messages postés 19024 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 18 avril 2024 656
2 juil. 2018 à 16:04
de rien
0
Rejoignez-nous