Einzelnen Beitrag anzeigen

Andreas L.

Registriert seit: 23. Mai 2011
Ort: Furth im Wald
308 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: TCollectionItem mit einer Collection - Wie?

  Alt 1. Mär 2019, 10:34
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.
Andreas Lauß
Blog

Geändert von Andreas L. ( 1. Mär 2019 um 10:44 Uhr)
  Mit Zitat antworten Zitat