Die Kombination der direktiven reintroduce; overload; virtual;
in einer einzigen Methode mag vielleicht vom Kompiler akzeptiert werden, ergibt aber rein logisch betrachtet wenig Sinn.
Ich habe diese Deklaration 1:1 von TFieldDefs übernommen. Ich schau mal ob Änderungen helfen.
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!
Das ist mir bewusst. Du meinst bestimmt folgende Stelle:
Delphi-Quellcode:
constructor TTestCollection.Create(AOwner: TPersistent);
begin
FParentItem := nil;
bzw.
Delphi-Quellcode:
constructor TTestCollectionItem.Create(Owner: TTestCollection;
const Name: string);
begin
FName := Name;
inherited Create(Owner);
FChilds := TTestCollection.Create(Self);
end;
Auch das habe ich von TFieldDefs kopiert. Wird aber natürlich im "richtigen" Code nicht so gemacht. Ich habe einfach die TFieldDefs als Vorlage benutzt und möglichst viel "Original" belassen.
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;
.
Das wird wohl das Problem sein.
Vielen Dank für eure Antworten
Ich werde den Code überarbeiten und melde mich dann wieder.