AGB  ·  Datenschutz  ·  Impressum  







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

Vererbung, Create und co

Ein Thema von Marco Steinebach · begonnen am 16. Feb 2018 · letzter Beitrag vom 17. Feb 2018
Antwort Antwort
Marco Steinebach

Registriert seit: 4. Aug 2006
502 Beiträge
 
Delphi 5 Enterprise
 
#1

Vererbung, Create und co

  Alt 16. Feb 2018, 19:31
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
Marco Steinebach
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#2

AW: Vererbung, Create und co

  Alt 16. Feb 2018, 19:35
Mhh, wird das FormCreate vielleicht einfach vom inherited Create aufgerufen und somit vor der Zuweisung deiner Variable?
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Vererbung, Create und co

  Alt 16. Feb 2018, 23:23
Mhh, wird das FormCreate vielleicht einfach vom 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.
> Haltepunkt in Create und in FormCreate (OnCreate)
$2B or not $2B

Geändert von himitsu (16. Feb 2018 um 23:25 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#4

AW: Vererbung, Create und co

  Alt 16. Feb 2018, 23:31
In seinem Profil steht Delphi 5...
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Marco Steinebach

Registriert seit: 4. Aug 2006
502 Beiträge
 
Delphi 5 Enterprise
 
#5

AW: Vererbung, Create und co

  Alt 17. Feb 2018, 11:48
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
Marco Steinebach
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#6

AW: Vererbung, Create und co

  Alt 17. Feb 2018, 11:55
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).
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Vererbung, Create und co

  Alt 17. Feb 2018, 12:43
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.
$2B or not $2B
  Mit Zitat antworten Zitat
Antwort Antwort


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 02:31 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