Bonjour,

Je souhaiterai connaître votre avis et vos conseils concernant une affectation qui me semblait toute simple mais qui me donne du fil à retordre.
J'ai un code de ce genre :
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
 
unit Unit1;
 
interface
 
uses
  Winapi.Windows, Winapi.Messages,
  System.SysUtils, System.Variants, System.Classes,
  Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Label1: TLabel;
    Edit1: TEdit;
    Label2: TLabel;
    Edit2: TEdit;
    Button3: TButton;
    Label3: TLabel;
    Label4: TLabel;
    Edit3: TEdit;
    Edit4: TEdit;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    Button7: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
  private
    { Déclarations privées }
  public
    { Déclarations publiques }
    procedure affedit;
  end;
 
var
  Form1: TForm1;
 
type
   t3=record
      s3: string;
      i3: integer;
      j3: integer;
      a3: array of variant;
      end;
 
   t2=record
      s2: string;
      i2: integer;
      a2: array of t3;
      end;
 
   t1=record
      s1: string;
      i1: integer;
      a1: array of t2;
      end;
 
var
   b, b2: t1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.affedit;
begin
edit1.text:=b.s1;
edit2.text:=b2.s1;
edit3.text:=b.a1[0].a2[1].j3.tostring;
edit4.text:=b2.a1[0].a2[1].j3.tostring;
end;
 
// remplissage de la variable b1 avec des valeurs
procedure TForm1.Button1Click(Sender: TObject);
var
   i, j, k, x, y, z: integer;
begin
// raz b et b2
b.s1:='';
b.i1:=0;
setlength(b.a1, 0);
b2.s1:='';
b2.i1:=0;
setlength(b2.a1, 0);
edit1.text:='';
edit2.text:='';
edit3.text:='';
edit4.text:='';
// on peut mettre les valeurs que l'on veut pour x, y et z
x:=5;
y:=10;
z:=15;
// remplissage de tous les niveaux
b.s1:='chaine';
b.i1:=x;
// en définissant bien la taille des array avant de les remplir
setlength(b.a1, b.i1);
for i:=0 to b.i1-1 do
   begin
   b.a1[i].s2:='chaine_i_'+i.tostring;
   b.a1[i].i2:=y;
   setlength(b.a1[i].a2, b.a1[i].i2);
   for j:=0 to b.i1-1 do
      begin
      b.a1[i].a2[j].s3:='chaine_j_'+j.tostring;
      b.a1[i].a2[j].i3:=z;
      b.a1[i].a2[j].j3:=z-3;
      setlength(b.a1[i].a2[j].a3, b.a1[i].a2[j].i3);
      for k:=0 to b.a1[i].a2[j].i3-1 do
         begin
         b.a1[i].a2[j].a3[k]:='chaine_k_'+k.tostring;
         end;
      end;
   end;
edit1.text:=b.s1;
edit3.text:=b.a1[0].a2[1].j3.tostring;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
// affectation des valeurs de b à b2
b2:=b;
affedit;
end;
 
procedure TForm1.Button3Click(Sender: TObject);
begin
// modification valeur de b.s1
b.s1:='autre nom';
// pas de répercussion sur b2.s1
affedit;
end;
 
procedure TForm1.Button4Click(Sender: TObject);
begin
// modification valeur de b.a1[0].a2[1].j3
b.a1[0].a2[1].j3:=20;
// répercussion sur b2.a1[0].a2[1].j3
affedit;
end;
 
procedure TForm1.Button5Click(Sender: TObject);
var
   i, j, k: integer;
begin
b2.s1:=b.s1;
b2.i1:=b.i1;
setlength(b2.a1, b.i1);
for i:=0 to b.i1-1 do
   begin
   b2.a1[i].s2:=b.a1[i].s2;
   b2.a1[i].i2:=b.a1[i].i2;
   setlength(b2.a1[i].a2, b.a1[i].i2);
   for j:=0 to b.a1[i].i2-1 do
      begin
      b2.a1[i].a2[j].s3:=b.a1[i].a2[j].s3;
      b2.a1[i].a2[j].i3:=b.a1[i].a2[j].i3;
      b2.a1[i].a2[j].j3:=b.a1[i].a2[j].j3;
      setlength(b2.a1[i].a2[j].a3, b.a1[i].a2[j].i3);
      for k:=0 to b.a1[i].a2[j].i3-1 do
         b2.a1[i].a2[j].a3[k]:=b.a1[i].a2[j].a3[k];
      end;
   end;
affedit;
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
Button1Click(sender);
end;
 
end.
Lorsque j'affecte b2:=b (button2) et que je modifie b.s1 en 'autre nom' (button3), il n'y a pas de répercussion sur b2.s1
Mais si je modifie la valeur de b.a1[0].a2[1].j3 (button4), cette modification se répercute dans b2.a1[0].a2[1].j3, alors que en faisant b2:=b je pensais affecter une nouvelle variable et non un pointeur ?
On dirait que le array a1 n'est pas copié, mais que c'est uniquement le pointeur sur b.a1 qui est copié dans b2.a1.

En revanche quand je fait l'affectation des valeurs comprises dans b à b2 par affectation de tous les éléments un par un (button5), la modification de la valeur de b.a1[0].a2[1].j3 (button4), ne se répercute pas dans b2.a1[0].a2[1].j3.
Y aurait-il une manière plus élégante et surtout plus rapide de de procéder ?

Merci d'avance de vos réponses et conseils. Bien cordialement