Bonjour à tous,
voila j'ai eu un petit problème que j'ai réussi à surmonter, mais je ne comprends pas le comportement du compilateur, et je ne trouve aucune info dans la doc à ce sujet.
Je m'explique.
Soit dans un texte stocké dans un TMemoryStream, par ex: '###ABCD###'
je veux récupérer le texte entre les #.
Je lis caractère par caractère.
Soit B, la variable Buffer qui contient chaque caractère lu dans TMemoryStream.
Le résultat serait 'BBCD' au lieu de 'ABCD'
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 ... var ... Cache: TMemoryStream; ... begin ... while Cache.Position < Cache.Size do begin F := ''; Cache.ReadBuffer(Pointer(B)^, 1); if B = '#' then begin while B = '#' do begin Cache.ReadBuffer(Pointer(B)^, 1); end; while B <> '#' do begin F := F + B Cache.ReadBuffer(Pointer(B)^, 1); // <== Lorsque B recoit la nouvelle valeur, F aussi ! end; ShowMessage(F); end; end;
voila le code fonctionnant :
Si je comprends bien, lors d'une affectation d'une string par ex:
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 ... var ... Cache: TMemoryStream; ... begin ... while Cache.Position < Cache.Size do begin F := ''; Cache.ReadBuffer(Pointer(B)^, 1); if B = '#' then begin while B = '#' do begin Cache.ReadBuffer(Pointer(B)^, 1); end; while B <> '#' do begin if F <> '' then F := F + B else F := Copy(B, 0, 1); // <== Cela résout le problème Cache.ReadBuffer(Pointer(B)^, 1); end; ShowMessage(F); end; end;
j'ai l'impression que comme T est "vide" lors de l'affectation, le compilateur ne copie pas le contenu mais stocke juste l'adresse du string copié, mais lors de la 2ème itération, T n'étant plus vide, cette fois-ci le contenu est bel et bien copié.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 T := ''; Z := 'B': T := T + Z; Z := 'J'; // <= Lorsque Z reçoit 'J', T aussi !?
Le fait d'utiliser la fonction Copy résout le problème.
Quelqu'un pourrait m'apporter des précisions svp ?
Merci à vous,
Fred
Partager