Einzelnen Beitrag anzeigen

Dennis07

Registriert seit: 19. Sep 2011
Ort: Deutschland
488 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: TCollectionItem mit einer Collection - Wie?

  Alt 28. Feb 2019, 22:50
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.
Dennis

Geändert von Dennis07 (28. Feb 2019 um 22:53 Uhr)
  Mit Zitat antworten Zitat