Anmerkung von Stefan Glienke, die ich ehrlich gesagt nicht ganz verstehe
Die Änderung hat das Delete vor dem if weggenommen und es nur in den einen Branch verschoben und in dem anderen Branch das InsertObject mit einem S[Index] := Value; ersetzt.
Wenn man nun schaut, was diese neue Zeile macht, wird einem klar, dass die Änderung nutzlos ist, da der setter genau das macht.
Die Änderung, die du selbst in Post #36 vorgeschlagen hast, sieht am ehesten richtig aus, wobei das noch zu testen wäre, ob das wegfallende IndexOfObject immer dasselbe liefert wie AddObject.