Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Vererbung, Create und co (https://www.delphipraxis.net/195287-vererbung-create-und-co.html)

Marco Steinebach 16. Feb 2018 18:31

Vererbung, Create und co
 
Hallo zusammen,
irgendwas essenzielles hab ich offensichtlich nicht verstanden.
Ich habe eine Basisklasse, von der weitere Formulare abgeleitet werden.

Code:
type
  TBaseClass = Class (TForm)
    constructor create (aOwner: TComponent); override;
  protected
    test: integer;
  end;

constructor TBaseClass.create (aOwner: TComponent);
begin
  inherited create (aOwner);
  test := -1;
end;
Nun habe ich in der von TBaseClass abgeleiteten Klasse ein onCreate definiert:
Code:
type
  TMainClass = Class (TBaseClass)
    procedure FormCreate (Sender: TObject);
end;

procedure TMainClass.formCreate (Sender: TObject);
begin
  // ausgabe von test??? sollte -1 sein
end;
Ich hätte gedacht, dass, vom Compiler, TMainClass.create aufgerufen wird, und das ruft, automatisch, TBaseClass.create auf, ist aber nicht so.
Wo liegt mein Denkfehler?

Viele Grüße
Marco

Zacherl 16. Feb 2018 18:35

AW: Vererbung, Create und co
 
Mhh, wird das
Delphi-Quellcode:
FormCreate
vielleicht einfach vom
Delphi-Quellcode:
inherited Create
aufgerufen und somit vor der Zuweisung deiner Variable?

himitsu 16. Feb 2018 22:23

AW: Vererbung, Create und co
 
Zitat:

Zitat von Zacherl (Beitrag 1394045)
Mhh, wird das
Delphi-Quellcode:
FormCreate
vielleicht einfach vom
Delphi-Quellcode:
inherited Create
aufgerufen und somit vor der Zuweisung deiner Variable?

Das kommt drauf an.

Früher JA,
aber seit paar Jahren "eigentlich" NEIN, außer Delphi-Referenz durchsuchenTForm.OldCreateOrder.

Man mag es nicht glauben, aber wenn man den Debugger verwendet, dann sieht man wann und ob was aufgerufen wird. :roll:
> Haltepunkt in Create und in FormCreate (OnCreate)

Uwe Raabe 16. Feb 2018 22:31

AW: Vererbung, Create und co
 
Zitat:

Zitat von himitsu (Beitrag 1394050)
Früher JA,

In seinem Profil steht Delphi 5...

Marco Steinebach 17. Feb 2018 10:48

AW: Vererbung, Create und co
 
Hallo zusammen,
ähm, mit dem Debugger ist schon schön, nur landete er, bei mir, nie im create der BaseClass, deshalb kam ich ja auf meine Frage.
Ich denke, man darf's einfach nicht mischen.
Realisiere ich beides als constructor und rufe im create von MainClass
Code:
inherited create (aOwner);
auf, funktioniert alles. Gleiches gilt, wenn ich in BaseClass und MainClass ein onFormCreate-Event erstelle, und in dem der MainClass
Code:
inherited;
aufrufe.
Ich denke das Problem lag darin, das ich onCreate und create quasi gemischt hatte, obwohl mir immernoch, aber das wäre nur eine Verständnisfrage, nicht klar ist, warum das dann nicht geht.

Herzliche Grüße
Marco

Uwe Raabe 17. Feb 2018 10:55

AW: Vererbung, Create und co
 
Zitat:

Zitat von Marco Steinebach (Beitrag 1394061)
Ich denke das Problem lag darin, das ich onCreate und create quasi gemischt hatte, obwohl mir immernoch, aber das wäre nur eine Verständnisfrage, nicht klar ist, warum das dann nicht geht.

Das geht problemlos. Man muss nur die Reihenfolge der Aufrufe beachten. In (sehr viel) älteren Delphi-Versionen war das Verhalten Standard, das aktuell bei OldCreateOrder = true implementiert ist, nämlich daß das OnCreate (hier das FormCreate) bereits im TForm.Create aufgerufen wird (in deinem Fall also vor dem Setzen von Test := -1). Das neue Verhalten ruft den Event erst im TForm.AfterConstruction auf, also wenn schon alle abgeleiteten Create durchgelaufen sind.

Wenn du allerdings nie im Create der Basisklasse landest, ist irgendetwas anderes faul (oder du hast einfach nicht lange genug debugged).

himitsu 17. Feb 2018 11:43

AW: Vererbung, Create und co
 
Also wenn OnCreate im Create-Inherited aufgerugfen wird (altes Verhalten:

Der Speicher für die Instanz wird bereits vor dem Create reserviert,
aber die DFM und die Form-Komponenten werden erst im Inherited geladen.
Delphi-Quellcode:
constructor TBaseClass.create (aOwner: TComponent);
begin
  test := -1;
  inherited create (aOwner);
end;
In "neueren" Delphies wird standardmäßig das OnCreate im Delphi-Referenz durchsuchenAfterConstruction ausgeführt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:52 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