Delphi 1 16 bits (ouais il est vieux, mais il fonctionne bien)TStringList - comportement étrange
Quelques exemples de code:
procedure TForm1.Button1Click(Sender: TObject);
var
SL: TStringList;
begin
SL := TStringList.Create;
SL.Sorted := True;
SL.Duplicates := dupIgnore;
SL.AddObject('A', TObject(100));
SL.AddObject('A', TObject(999));
ShowMessage(IntToStr(LongInt(SL.Objects[0]))); {A}
SL.Free;
end;
J'utilise le champ objet pour stocker Entiers (un hack , oui mais ça fait le boulot). Quoi qu'il en soit, à la ligne A ci-dessus, je m'attendrais à ShowMessage à montrer 100, à la place, il montre 999 (même si dupIgnore est défini). Est-ce que j'ai râté quelque chose? Ou devrait-il fonctionner de cette façon (je m'attendais à ce que la liste de chaînes ignore le 999)?
[La documentation Delphi XE] (http://docwiki.embarcadero.com/VCL/fr/Classes.TStringList.AddObject) ne dit rien à ce sujet. Il dit seulement que les * chaînes * en double sont ignorées. Il ne dit rien sur ce qui arrive à l'objet lié à la chaîne en double. –
@Rob Kennedy - dupIgnore bloque les tentatives d'ajout de chaînes dupliquées (avec ou sans objets) à la liste triée. L'index retourné n'a pas d'importance dans ce cas - la chaîne n'est pas ajoutée à la liste. – kludg
Rob ne parle pas de la chaîne - elle n'est certainement pas ajoutée. Il parle de l'objet * lié à la chaîne de dupe. Le document ne dit pas ce qui arrive à l'objet. Avec les versions antérieures de Delphi, alors que la chaîne de dupe n'est pas ajoutée, l'objet lié à celle-ci remplace l'objet précédent. Cela devrait être considéré comme un choix de conception au lieu d'un bug, probablement un mauvais car ils l'ont changé (j'ai vu un post en 2004, donc le comportement a probablement changé après D7). –