Delphi 1 a 16 bit (sì è vecchio, ma funziona bene)TStringList - strano comportamento
Alcuni codice di esempio:
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;
Sto utilizzando il campo oggetto per memorizzare longints (un hack sì, ma ha fatto il lavoro). Ad ogni modo, alla riga A sopra mi aspetto che ShowMessage mostri 100, invece mostri 999 (anche se dupIgnore è impostato). Mi sto perdendo qualcosa qui? O dovrebbe funzionare in questo modo (mi aspettavo che la lista di stringhe ignorasse la 999)?
[La documentazione di Delphi XE] (http://docwiki.embarcadero.com/VCL/en/Classes.TStringList.AddObject) non dice nulla al riguardo. Dice solo che le stringhe * duplicate sono ignorate. Non dice nulla su ciò che accade all'oggetto legato alla stringa duplicata. –
@Rob Kennedy - dupIgnore blocca i tentativi di aggiungere stringhe duplicate (con o senza oggetti) all'elenco ordinato. L'indice restituito non ha importanza in questo caso: la stringa non viene aggiunta all'elenco. – kludg
Rob non sta parlando della stringa, ma sicuramente non viene aggiunta. Parla di * oggetto * legato alla stringa del dupe. I documenti non dicono cosa succede all'oggetto. Con le versioni precedenti di Delphi, mentre la stringa dupe non viene aggiunta, l'oggetto associato sostituisce l'oggetto precedente. Dovrebbe essere considerata una scelta progettuale invece di un bug, probabilmente una cattiva scelta dal momento della loro modifica (ho visto un post che si lamentava del 2004, quindi il comportamento probabilmente è cambiato dopo D7). –