Bonjour,
Voici une petite synthèse concernant les différents opérateurs d'affectation, en complément des informations de la documentation de PC-Soft accessible ici : http://doc.pcsoft.fr/fr-FR/?utilisation-des-objets.
Depuis la version 14 de Windev de nouveaux opérateurs d'affectation sont apparus (<- et <=).
Ces opérateurs permettent de copier ou de cloner des objets (instances de classe) entre eux.
Je part du principe arbitraire que :
-"Copier par valeur" un objet vers un autre consiste à dire que la valeur des membres de l'objet de destination sera identique à celle de l'objet source de la copie.
Dans ce cas, les deux objets sont indépendants l'un de l'autre.
Si vous modifiez la valeur d'un membre de l'objet A, cette valeur ne sera pas modifiée dans l'objet B.
-"Copier par adresse" un objet vers un autre consiste à dire que l'adresse des membres de l'objet de destination sera identique à celle de l'objet source de la copie (Il s'agit d'une prise de référence).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 Cla_Test iVal est un entier objA est un Cla_Test objB est un Cla_Test objA:iVal = 10 objB:iVal = 20 //Copie par valeur objA <= objB //La valeur de objA:iVal est 20 objA:iVal = 40 //La valeur de objA:iVal est désormais 40 //La valeur de objB:iVal est toujours 20
Dans ce cas, les deux objets sont en fait un seul et même objet.
Si vous modifiez la valeur d'un membre de l'objet A, cette valeur sera aussi modifiée dans l'objet B.
L'utilisation des opérateurs =, <= ou <- pour "copier par valeur" ou "copier par adresse" des objets peut paraître simple de prime abord mais cela ce complique lorsque l'objet d'un côté ou de l'autre de l'opérateur d'affectation est de type "simple" ou de type dynamique, en particulier concernant l'opérateur =.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 Cla_Test iVal est un entier objA est un Cla_Test objB est un Cla_Test objA:iVal = 10 objB:iVal = 20 //Copie par adresse objA <- objB //La valeur de objA:iVal est 20 objA:iVal = 40 //La valeur de objA:iVal est désormais 40 //La valeur de objB:iVal est désormais 40
La copie par valeur ou par adresse d'un membre d'un objet dépend aussi du type de ce membre, en plus du type d'opérateur utilisé, comme démontré dans le tableau ci-dessous (cliquez une fois sur l'image puis une seconde fois pour l'agrandir) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 //Objet dynamique : ObjA est un Cla_Test dynamique ObjA = allouer un Cla_Test //Objet simple : objB est un Cla_Test objA:iVal = 10 objB:iVal = 20 objA = objB objA:iVal = 40 //objB:iVal vaut désormais 40 //Si ObjA avait été un objet simple, objB:iVal vaudrait toujours 20
L'opération ObjA <= ObjB ou ObjA = ObjB peut ainsi aboutir à deux objets dont certains membres représentent en fait un seul et même membre partagé entre les deux instances et dont d'autres membres ont simplement une valeur identique.
De manière plus synthétique, on peut dire que :
Quelquesoit le type (dynamique ou non) des objets de part et d'autre de l'opérateur et le type de leurs membres, l'opérateur <- va :
-"Copier l'adresse" TOUT les membres de ces deux objets.
Quelquesoit le type (dynamique ou non) des objets de part et d'autre de l'opérateur, l'opérateur <= va :
-"Copier la valeur" de TOUT les membres de type primitif, objet simple, tableau local et tableau associatif de primitifs, de structures ou d'objets simples.
-"Copier l'adresse" de TOUT les membres de type objet dynamique, tableau, tableau dynamique et tableau associatif d'objets dynamiques (En gros des tableaux et tableaux de pointeurs).
Pour conclure, pour être certain de bien pouvoir copier par valeur ou par adresse (l'un ou l'autre) l'intégralité des membres d'un objet, le plus simple est de se servir de l'opérateur <= ou de l'opérateur <- (et non de l'opérateur =) et de toujours utiliser dans vos objets des membres de type objet simple, tableau local ou tableau associatif de primitifs, de structures ou d'objets simples (non dynamiques).
Notez qu'il est possible de charger un objet dynamique dans un membre de type objet simple sans qu'il n'y ai d'impact sur les règles d'affectation ci-dessus (A condition que cet objet soit lui même composé de membres non dynamiques ) :
Bonne prog
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 Cla_Test //Membres iVal est un entier oTruc est un Cla_Truc toTruc est un tableau local de Cla_Truc tAssooTruc est un tableau associatif de Cla_Truc Cla_Truc //Membres iVal est un entier oTest est un Cla_Test oTruc est un Cla_Truc dynamique oTruc = allouer un Cla_Truc oTruc:iVal = 10 oTest:oTruc <- oTruc oTest2 est un Cla_Test oTest2 <= oTest oTest2:oTruc:iVal = 20 //oTest:oTruc:iVal vaut toujours 10 //L'utilisation d'un objet dynamique oTruc permet ce type de syntaxe oTruc:iVal = 30 //oTest:oTruc:iVal vaut désormais 30 //oTest2:oTruc:iVal vaut toujours 20
Partager