Ein paar Kleinigkeiten vorweg:
- Es heißt korrekterweise "Children" und nicht "Childs" im Englischen.
- Nach dem inherited
brauchst du nur den Methodennamen schreiben, wenn sich die Parameterliste der Methoden unterscheidet. Auch brauchst du es überhaupt nicht anzugeben, wenn eine Methode überhaupt nicht überschrieben oder neu eingeführt wurde.
- Die Kombination der direktiven reintroduce; overload; virtual;
in einer einzigen Methode mag vielleicht vom Kompiler akzeptiert werden, ergibt aber rein logisch betrachtet wenig Sinn.
- Klassen-und Recordfelder sowie Arrayelemente oder Strings brauchen nicht initialisiert zu werden (genau wie globale Variablen), wenn sie den Standardwert Default(DataType)
haben sollen.
- Nenne Parameter oder lokale Variablen niemals gleich wie Objekt-oder Klassenbezeichner!
So, nun aber zu deinem Problem, das auch mit dem 3. Punkt zusammen hängt:
Der Design Editor erzeugt Collection-Items immer über den virtuellen Konstruktor
constructor Create(Collection: TCollection);
.
Wenn du diesen überschreibst, dann weiß die Collection immer, wie sie ein neues Item erzeugen kann (nämlich mit genau jenem Konstruktor). Wenn du ihn allerdings nicht überschreibst (
override
), sondern neu einführst (
reintroduce
oder nichts explizites) oder überlädst (
overload
), dann kann die Collection diesen ja nicht aufrufen, weil sie ihn (und seine Parameter) nicht kennt. Somit wird er nicht aufgerufen, was dazu führt, dass die Collection für
Childs
niemals erzeugt wird und somit auch im
OI nicht zur Verfügung steht. Du musst die Methode
TTestCollectionItem.Create
also überschreiben. Deshalb darfst du ihre Signatur nicht ändern, sie muss also folgendermaßen deklariert werden:
constructor Create(Collection: TCollection); override;
.
Wenn du das unter keinen Umständen willst, musst du die Collectionklasse so abändern, dass sie den neuen Konstruktor anstelle des alten verwendet.