AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

nach inherited Create ist self=nil

Ein Thema von Captnemo · begonnen am 11. Apr 2015 · letzter Beitrag vom 11. Apr 2015
 
Benutzerbild von himitsu
himitsu

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

AW: nach inherited Create ist self=nil

  Alt 11. Apr 2015, 22: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)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

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


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:56 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz