Property get let d'un tableau de structure [Résolu]

Signaler
Messages postés
1098
Date d'inscription
mercredi 22 mars 2006
Statut
Membre
Dernière intervention
22 octobre 2019
-
Polack77
Messages postés
1098
Date d'inscription
mercredi 22 mars 2006
Statut
Membre
Dernière intervention
22 octobre 2019
-
Bonjour ,
    Je suis sure que cette question à déjà été posée mais je n'arrive pas à mettre la main sur le topic correspondant DZL (si vous avez un lient vers le topic se seras parfait comme réponse Merci par avance)

    Je développe actuellement des classes à fin de faire évolué un programme déjà existant. Tout est presque terminer mais je voudrais maintenant pouvoir accéder au données contenue dans mes objets par porperty get et let (à fin de ne pas avoir à modifier l'ensemble du programme qui est TRES long, TRES vieux, et VRAIMENT pas lisible pas endroits).

    Je défini une structure de données (dans un module, je vais sans doute la faire passé dans ma classe en public, mais on verra sa plus tard). J'ai dans ma classe un tableau basé sur cette structure. Je veut pouvoir lire et écrire dans ce dit tableau depuis l'extérieur de mon objet comme si ce tableau étais déclarer en public (sauf que je ne veut pas qu'on pusse mettre tout et n'importe quoi comme données donc je veut passé par get/let, la validation des données viendras plus tard).

    Mon code (qui ne fonctionne pas) :
8<-----------------------------------------------------
'Ici à priori pas de problèmes
Friend Property Get DATA(ByVal Index As Integer) As S_DATA
    DATA = V_Donnees(Index)
End Property

'Heeee la sa coince
Friend Property Let DATA(ByRef NewDATA As S_DATA)
    V_Donnees(Index) = NewDATA
End Property
----------------------------------------------------->8

    Forcément le compilo (VB6) me retourne une erreur :
8<-----------------------------------------------------
Compile error:

Definitions of property procedures for the same property are inconsistent, or property procedure has an optional parameter, a ParamArray, or an invalid Set final parameter
----------------------------------------------------->8

    Je ne sait pas comment déclarer ma property let... L'index je le met ou??? (SVP ne me dite pas qu'il me faut un let par donnée dans ma structure, c'est une GROSSE structure)

En final je veut que mon objet fonctionne comme sa :
Avec le get (sa pas de problèmes sa fonctionne) :
Tata = ObjData.DATA(Index).Toto

Avec le let (c'est là que je coince) :
ObjData.DATA(Index).Toto = Tata

Sachant que Toto et Tata sont du type string par exemple




Amicalement



Pensez "Réponse acceptée"

13 réponses

Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
61
'Ici à priori pas de problèmes
Friend Property Get DATA(ByVal Index As Integer) As S_DATA
DATA = V_Donnees(Index)
End Property

'Heeee la sa coince
Friend Property Let DATA(ByVal Index As Integer,ByRef NewDATA As S_DATA)
V_Donnees(Index) = NewDATA
End Property
Messages postés
1098
Date d'inscription
mercredi 22 mars 2006
Statut
Membre
Dernière intervention
22 octobre 2019

Ok ça j'avais compris (enfin je crois) mais c'est possible d'éviter de faire ça dans le code du bouton ?

Private Sub Command1_Click()
    Dim t As New Class1
    Dim Temp As S_Test
    Temp = t.Test(0)
    Temp.b = "Sa fonctionne"
    t.Test(0) = Temp
    MsgBox t.Test(0).b
End Sub

Amicalement
Pensez "Réponse acceptée"
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
61
plusieurs solutions...

1=> Permière solution, se passer de Class1 et manipuler simplement ton tableau de structures

2=> utiliser une Classe pour S_Test :

dans un module de classe nommé S_Test, ajoutes :

'+++++++++++++ S_Test ++++++++++++++
Option Explicit

Public a As Integer
Public b As String
'+++++++++++++++


Class1 change un peu lui aussi. je n'y ai volontairement pas mis de Property Set Test (pas utile ici)

'+++++++++++ Class1 +++++++++
Option Explicit

Private V_Test(0 To 10) As S_Test

Private Sub Class_Initialize()
Dim i As Long
For i = 0 To 10
Set V_Test(i) = New S_Test
V_Test(i).b = "Ne fonctionne pas"
Next i
End Sub

Friend Property Get Test(ByVal Index As Integer) As S_Test
Set Test = V_Test(Index)
End Property
'++++++++++++++++++++++++++++++++


et dans ta Form, tu peux faire :

Option Explicit

Private Sub Form_Load()
Dim t As New Class1
t.Test(0).b = "Ca fonctionne"
MsgBox t.Test(0).b
End Sub
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
61
n copies, c'est bien ça...

possible de faire alors:

With Test(0)
Me.Text1(0).Text = .a 'Ligne
Me.Text1(1).Text = .b 'Ligne 2
Me.Text1(2).Text = .c 'Ligne 3
End With

et oui, With n'est pas qu'une facilité d'ecriture, ca permet d'optimiser ce genre de choses
Messages postés
1098
Date d'inscription
mercredi 22 mars 2006
Statut
Membre
Dernière intervention
22 octobre 2019

C'est tout !?!?!?
Bà oui c'est tout sa fonctionne (encore une fois je cherche midi à 14 heures) ....

MERCI bien

Amicalement
Pensez "Réponse acceptée"
Messages postés
1098
Date d'inscription
mercredi 22 mars 2006
Statut
Membre
Dernière intervention
22 octobre 2019

Heeeeeeeee en faite je remarque que sa ne fonctionne pas exactement comme je l'aurais voulut...
Je m'explique grâce à un exemple :

J'ai dans un module :
Public Type S_Test
    a As Integer
    b As String
End Type

Dans un module de classe :
Private V_Test(0 to 10) as S_Test
Private Sub Class_Initialize()
    V_Test(0).b = "Ne fonctionne pas"
End Sub
Friend Property Get Test(ByVal Index As Integer) As S_Test
    Test = V_Test(Index)
End Property
Friend Property Let Test(ByVal Index As Integer, ByRef NewTest As S_Test)
    V_Test(Index) = NewTest
End Property

Dans une form (contenant un bouton nommé "Command1") :
Private Sub Command1_Click()
    Dim t As New Class1
    t.Test(0).b = "Sa fonctionne"
    MsgBox t.Test(0).b
End Sub

Quand je clique sur le bouton de ma form un message box contenant "Ne fonctionne pas"....

Comment faire pour que sa m'affiche (pour mon exemple) "Sa fonctionne" ?
Amicalement
Pensez "Réponse acceptée"
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
61
Type fonctionne par valeur et non par reference
Messages postés
1098
Date d'inscription
mercredi 22 mars 2006
Statut
Membre
Dernière intervention
22 octobre 2019

Ce qui veut dire ????
Je suis obligé de faire des seteurs pour chaqu'une des variables de mon type ( C'est que j'en es pas mal quand même et que j'ai maintenant plusieurs classe fonctionnant de cette façon )

Amicalement
Pensez "Réponse acceptée"
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
61
quand tu fais
t.Test(0).b = "Sa fonctionne"

t.Test(0)
appelle ton Property Get Test
lequel te renvoie une COPIE de ton S_Test

donc le .b= "Ca fonctionne" modifie cette copie...
Messages postés
1098
Date d'inscription
mercredi 22 mars 2006
Statut
Membre
Dernière intervention
22 octobre 2019

Parce qu'en faite je modifie un programme qui utilisais des tableaux de variables global. Et dans ce dit programme il y à BEAUCOUP d'accès au données (en gros j'en es pour un mois à mettre en place l'exemple de mon post précédant..... Et j'ai pas que sa à faire.... )

Amicalement
Pensez "Réponse acceptée"
Messages postés
1098
Date d'inscription
mercredi 22 mars 2006
Statut
Membre
Dernière intervention
22 octobre 2019

Bon je fait des testes depuis 9H00 et aucune des deux solution que tu m'a apporté ne me conviens . (Je réfléchie encore à comment faire autrement)

    Les données sont lut dans des fichiers binaire et toute les données "chaine de caractère" sont donc formaté (or je ne peut pas déclarer une chaine de caractère formaté en public dans une classe... Merci Microsoft ).
    De plus à plusieurs endroits du programme que je modifie, il y à des copies d'un index du tableau dans une variable, ou les valeurs seront modifiées, mais pas forcément ré-envoilé à ma classe (soit pas de sauvegarde systématique des modifications) or avec le passage par référence les modification de la variable n'impacteront tout seul à ma classe (à moins d'ajouté une fonction "copie" ou "clone", sa fait partie de mes réflections).

Pas si simple quoi...........
( Mais c'est pourtant pas si compliqué ce que je veut faire, £$%#& à la fin )
    Je crois que je vais prendre la solution de copier mes données dans une variable local et une fois les modifications apportées, envoilé cette variable à mon objet (même si sa me fait chier et que sa vas prendre un temps fous à mettre en place  j'expliquerais pourquoi mon projet prend du retard à ma hiérarchie a cause d'une connerie pareil.... Sa vas pas leur plaire . Mais pour l'instant je ne voie pas vraiment comment faire autrement).
    VB6 et la gestion d'objet.... bà c'est pas si bien (et encore là, c'est juste un problème de geteur/seteur... Je ne parle pas des problèmes d'héritage ou autre polymorphisme, et j'oublie complètement la sur-définition.... Ce qui est quand même SUPER pratique)
    Bon bà si je ne trouve rien d'autre je ferais avec....

En tout cas MERCI bien Renfield
Amicalement
Pensez "Réponse acceptée"
Messages postés
1098
Date d'inscription
mercredi 22 mars 2006
Statut
Membre
Dernière intervention
22 octobre 2019

Heeeeee je m'éloigne un peut du sujet mais sa reste fortement lié :
Tu m'a dit "[...]lequel te renvoie une COPIE de ton S_Test[...]"
Or dans certain cas mon programme fait des truc du genre de :
8<---------------
Me.Text1(0).Text = Test(0).a 'Ligne 1
Me.Text1(1).Text = Test(0).b 'Ligne 2
Me.Text1(2).Text = Test(0).c 'Ligne 3
...
--------------->8
    Ce qui veut dire que dans ce cas là mon programme une fois compilé vas crée une copie de ma structure en ligne 1, récupérer la valeur de 'a' depuis cette copie, libérer la mémoire, puis faire de même avec 'b' la ligne 2 et 'c' la ligne 3.... Sa risque d'être sacrément lent comme façon de faire (à moins que je ne raconte des conneries , ce qui m'arrangerais bien en faite ). Pour ce genre de chose il vaudrais peut être mieux faire :
8<---------------
Dim Tempon as S_Test
Tempon = Test(0)

Me.Text1(0).Text = Tempon.a 'Ligne 1

Me.Text1(1).Text = Tempon.b 'Ligne 2

Me.Text1(2).Text = Tempon.c 'Ligne 3
...

--------------->8
    Quel est votre havie là dessus ?
Amicalement
Pensez "Réponse acceptée"
Messages postés
1098
Date d'inscription
mercredi 22 mars 2006
Statut
Membre
Dernière intervention
22 octobre 2019

Hoooooooo que c'est jolie.
MERCI
Pour moi "With" n'étais qu'une facilité d'écriture...
Comme quoi on en apprend tout les jours

Amicalement
Pensez "Réponse acceptée"