Utilisation des property avec tableau de string

Messages postés
67
Date d'inscription
mercredi 2 février 2005
Dernière intervention
22 novembre 2018
-
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.
Afficher la suite 

Votre réponse

2 réponses

Messages postés
12399
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
15 décembre 2018
0
Merci
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....

megamario
Messages postés
67
Date d'inscription
mercredi 2 février 2005
Dernière intervention
22 novembre 2018
-
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.
Whismeril
Messages postés
12399
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
15 décembre 2018
-
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
Whismeril
Messages postés
12399
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
15 décembre 2018
-
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é.
megamario
Messages postés
67
Date d'inscription
mercredi 2 février 2005
Dernière intervention
22 novembre 2018
> Whismeril
Messages postés
12399
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
15 décembre 2018
-
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.
Commenter la réponse de Whismeril
Messages postés
12399
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
15 décembre 2018
0
Merci
de rien
Commenter la réponse de Whismeril

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.