Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#9

AW: nach inherited Create ist self=nil

  Alt 11. Apr 2015, 23:53
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)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (12. Apr 2015 um 00:06 Uhr)
  Mit Zitat antworten Zitat