Nach längerer Zeit hat mich dieser Punkt wieder einmal geärgert. Ich habe das Thema in QualityCentral eingestellt (#75853) und einen Verweis auf ein bereits diskutiertes Thema bekommen (#67272) - dort war auch der Grund für die Fehlermeldung und eine Abhilfe zu finden. Falls es jemand interessiert, dann versuche ich es mal mit meinen Worten zu beschreiben:
Der Fehler liegt in der
Unit Generics.Collections im Constructor von TObjectList<T>:
Delphi-Quellcode:
constructor TObjectList<T>.Create(AOwnsObjects: Boolean);
begin
inherited;
FOwnsObjects := AOwnsObjects;
end;
TObjectList<T> ist von TList<T> abgeleitet. In der Klasse TList<T> gibt es aber keinen Constructor mit einem Parameter AOwnsObject. Damit läuft der Aufruf inherited ins Leere (und erzeugt auch keinen Compiler-Fehler !). Das heisst TObjectList wird nicht initialsiert und es wird kein auch keine Comparer erzeugt (dies geschieht eigentlich in TList.Create). Damit erzeugen alle nachfolgenden Aufrufe wie etwa
Delphi-Quellcode:
ObjectList.Extract(Obj)
ObjectList.Remove(Obj)
ObjectList.IndexOf(Obj)
eine
AV.
Lösungen:
- Korrektur in Generics.Collections.pas:
Delphi-Quellcode:
constructor TObjectList<T>.Create(AOwnsObjects: Boolean);
begin
inherited Create();
FOwnsObjects := AOwnsObjects;
end;
oder
- Meiden des Aufrufs
ObjectList := TObjectList<TNewObject>.Create;
stattdessen:
ObjectList := TObjectList<TNewObject>.Create(TComparer<TNewObject>.Default);
Wie schon gesagt, die Lösung kommt nicht von mir, sondern wurde von Anfrey Tsiruljov und Wang Rui (die ich hier zumindest erwähnen möchte) in QualityCentral gestellt.
Mich wundert nur, dass der Fehler nicht in einem Delphi Update behoben wurde, da diese Fehler-Reports schon einige Monate alt sind.