Ответ 1
Я обнаружил, что теперь вызов метода TList<T>.Insert
TListHelper.InternalInsertX
зависит от размера данных, в моем случае:
procedure TListHelper.InternalInsertN(AIndex: Integer; const Value);
var
ElemSize: Integer;
begin
CheckInsertRange(AIndex);
InternalGrowCheck(FCount + 1);
ElemSize := ElSize;
if AIndex <> FCount then
Move(PByte(FItems^)[AIndex * ElemSize], PByte(FItems^)[(AIndex * ElemSize) + 1], (FCount - AIndex) * ElemSize);
Move(Value, PByte(FItems^)[AIndex * ElemSize], ElemSize);
Inc(FCount);
FNotify(Value, cnAdded);
end;
Я вижу проблему в первом вызове Move
. Назначение должно быть:
PByte(FItems^)[(AIndex + 1) * ElemSize]
not
PByte(FItems^)[(AIndex * ElemSize) + 1]
Aaargh!
Наконец, я использовал модули System.Generics.Defaults.pas и System.Generics.Collections.pas из Delphi XE7 в своих проектах, и теперь все работает как ожидалось.
Обновление: как я вижу, RTL не затрагивается, так как он не использует TList<T>.Insert
для T с SizeOf > 8 (или, может быть, я что-то пропустил?)