Nein, Create ist eine Funktion (mit Zusatzfuntion, wenn als Klassenmethode aufgerufen) und das ist auch richtig so, aber es wäre besser, wenn der Compiler endlich mal den Functionsaufruf "melden/hinweisen" würde, aber natürlich abschaltbar, so wie z.B. das reintroduce beim Verdecken.
Hier mal die Kurzfassung einer bekannten Delphiprozedur, die den Fehler behebt, daß Idioten im Create auf die globale Form-Variable zugreifen, welche ja eigentlich erst nach dem Erstellen zugewiesen würde.
NewInstance erstellt die Instanz (Self <> nil) und der Constructor initialisiert nur den Inhalt.
Delphi-Quellcode:
procedure TApplication.CreateForm(InstanceClass: TComponentClass; var Reference);
var
Instance: TComponent;
begin
Instance := TComponent(InstanceClass.NewInstance);
TComponent(Reference) := Instance;
try
Instance.Create(Self);
except
TComponent(Reference) := nil;
Instance := nil;
raise;
end;
end;
Ich würde mir wünschen, wenn auch der Form-Loader (TReader) das nutzen würde, damit man im Create bereits den ComponentState und da vorallem csLoading, csReading und csDesigning direkt benutzen könnte und sich nicht über den Owner das raussuchen müsste.
Und hier mal das, was Delphi in Wirklichkeit bei Constructor, Destructor und Free macht.
Delphi-Quellcode:
// O := TObject.Create(...);
{ System._ClassCreate System._AfterConstruction }
Temp := TObject.NewInstance;
try
Temp.Create(...); // Methodenaufruf
Temp.AfterConstruction;
except
Temp.Destroy;
raise;
end;
O := Temp;
Delphi-Quellcode:
// O.Free;
if Assigned(O) then // O = Self
O.Destroy;
Delphi-Quellcode:
// O.Destroy;
{ System._ClassDestroy System._BeforeDestruction }
try
O.BeforeDestruction;
O.Destroy; // Methodenaufruf
finally
O.FreeInstance;
end;
Gezeigte Codes sind die Kurzfassungen der Hauptfunktion der genannten Beispiele. (außer beim Free, welches wirklich den kompletten Code darstellt)