Bonjour à vous,

J'ai un objet TCoupeDeveloppee qui contient une propriété FListeDesBranches de type TList.

Le FListeDesBranches contient des objets de type TBrancheCoupeDeveloppee.

Je suis confronté à ce qui semble être un bug du TList, à savoir, un segfault lors de la modification d'un item de FListeDesBranches.

Voici les fonctions d'ajout, d'extraction et de modif:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
 
procedure TCoupeDeveloppee.AddBranche(const S: TBrancheCoupeDeveloppee);
var
  pB : ^TBrancheCoupeDeveloppee;
begin
  AfficherMessageErreur(Format('%s.AddBranche: %s', [ClassName, S.NomBranche]));
  New(pB);
  pB^ := S;
  FListeDesBranches.Add(pB);
end;
La fonction AddBranche fonctionne très bien

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
 
function TCoupeDeveloppee.GetBranche(const Idx: integer): TBrancheCoupeDeveloppee;
var
  pB : ^TBrancheCoupeDeveloppee;
begin
  AfficherMessageErreur(Format('%s.GetBranche: %d', [ClassName, Idx]));
  pB := FListeDesBranches.Items[Idx];
  result := pB^;
  AfficherMessageErreur(Format('%s.GetBranche: %d - %s', [ClassName, Idx, result.NomBranche]));
end;
Aucun problème pour GetBranche

Le modificateur qui pose problème:
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
 
procedure TCoupeDeveloppee.PutBranche(const Idx: integer; const S: TBrancheCoupeDeveloppee);
var
  pB : ^TBrancheCoupeDeveloppee;
begin
  AfficherMessageErreur(Format('%s.PutBranche: %d / %d - %s', [ClassName, Idx, FListeDesBranches.Count-1, S.NomBranche]));
  pB  := self.FListeDesBranches.Items[Idx];
  // affectation de la nouvelle valeur
  pB^ := S;
  // ici, on est OK 
  AfficherMessageErreur(Format('002: %d - %s - %d', [pB^.NumeroBranche, pB^.NomBranche, pB^.GetNbVisees]));
  AfficherMessageErreur(Format(' -- %d / %d', [Idx, self.FListeDesBranches.Count]));
  // L'affectation ci-dessous provoque le segfault
  // même avec un Idx valide
  self.FListeDesBranches.Items[Idx] := pB; // segfault incompréhensible
end;
J'ai plein d'autres listes qui contiennent des objets et je ne rencontre aucun problème

Je ne comprends pas pourquoi je peux accéder à un item d'un TList et ne pas pouvoir le modifier.
Ce genre de bug exaspérant est de nature à faire abandonner la programmation.