AGB  ·  Datenschutz  ·  Impressum  







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

Klassen constructor Aufrufen

Ein Thema von bernhard_LA · begonnen am 3. Apr 2017 · letzter Beitrag vom 4. Apr 2017
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von himitsu
himitsu

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

AW: Klassen constructor Aufrufen

  Alt 4. Apr 2017, 12:42
Komponenten im FormDesigner bekommen als Owner immer die Form und als Parent das, worauf sie liegen.

Aber du kannst im Constructor ja dennoch Parent = Owner setzen, für denn Fall, dass die Komponente manuell erstellt wird.
(lässt sich ja nach dem Constructor neu zuweisen, wenn es doch ein anderer Parent werden soll)

Man kann über Self.ComponentState (im Constructor siehe Owner.ComponentState) rausbekommen, ob die Komponente grade im FormDesigner liegt, oder ob soe grade aus einer DFM geladen wird.
Nur der TForm-Constructor ist ein Sonderfall, wenn dieser über Application.CreateForm erstellt wird, denn da ist der Zustannd bereits im Constructor bekannt. Leider waren Her Wirth und Borland nicht nett genug, das auch im TReader (DFM-Loader) zu machen.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 4. Apr 2017 um 12:47 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.143 Beiträge
 
Delphi 10.3 Rio
 
#12

AW: Klassen constructor Aufrufen

  Alt 4. Apr 2017, 13:18
Welcher Constructor wird ausgeführt wenn ich meine Komponente auf ein Form ziehe ?
Nochmal zurück zu dieser Frage... Man möge mich korrigieren, wenn ich falsch liege...

Wenn ich eine Object erzeuge das ich von einem anderen Object ableite schreibe ich i.d.R. nicht override...

Beispiel:

Delphi-Quellcode:
type
  TMyButton = class(TButton)
    public
      Constructor Create(AOwner : TComponent);
  end;
Denn mit einem TMyButton.Create wird mein constructor aufgerufen hier mache ich den inherited

Warum also ein override?

Weil nicht mein Constructor aufgerufen wird?

Anders bei Methoden. Siehe docwiki!
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: Klassen constructor Aufrufen

  Alt 4. Apr 2017, 14:04
Warum also ein override?
Das kommt darauf an, was du erreichen willst. Solange du immer nur TMyButton.Create aufrufst, funktioniert das. Sobald aber das Streaming-System oder der IDE-Formular-Designer ins Spiel kommen, ist dein Constructor außen vor und wird nicht aufgerufen. Wie gesagt, das kann so gewünscht sein - ist es in der Regel aber nicht.

Der Sinn von virtuellen Konstruktoren ist ja genau der, daß sie auch aufgerufen werden können, wenn dem Aufrufenden die tatsächliche Klasse nicht bekannt ist.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Fritzew

Registriert seit: 18. Nov 2015
Ort: Kehl
678 Beiträge
 
Delphi 11 Alexandria
 
#14

AW: Klassen constructor Aufrufen

  Alt 4. Apr 2017, 14:19
Welcher Constructor wird ausgeführt wenn ich meine Komponente auf ein Form ziehe ?
Nochmal zurück zu dieser Frage... Man möge mich korrigieren, wenn ich falsch liege...

Wenn ich eine Object erzeuge das ich von einem anderen Object ableite schreibe ich i.d.R. nicht override...

Beispiel:

Delphi-Quellcode:
type
  TMyButton = class(TButton)
    public
      Constructor Create(AOwner : TComponent);
  end;
Das kommt aber ne Warnung wenn Die neue Klasse von TComponent abgeleitet ist. Aus diesem Grund werden bei uns eigentlich fast alle Warnungen als Fehler behandelt, dann geht so etwas auf keinen Fall unter
Fritz Westermann
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.143 Beiträge
 
Delphi 10.3 Rio
 
#15

AW: Klassen constructor Aufrufen

  Alt 4. Apr 2017, 14:40
Sobald aber das Streaming-System oder der IDE-Formular-Designer ins Spiel kommen, ist dein Constructor außen vor und wird nicht aufgerufen.
Ja genau - das wollte ich eigentlich damit sagen...

Der Sinn von virtuellen Konstruktoren ist ja genau der, daß sie auch aufgerufen werden können, wenn dem Aufrufenden die tatsächliche Klasse nicht bekannt ist.
Perfekt... Warum hatte ich das nicht geschrieben? OK ich hole mir erst nen Kaffee...



Immer wenn das Telefon klingelt, sollte ich meine Post vor dem senden erst nochmal lesen...
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
970 Beiträge
 
Delphi 6 Professional
 
#16

AW: Klassen constructor Aufrufen

  Alt 4. Apr 2017, 16:39
Delphi-Quellcode:
constructor TPImage.create(aOwner: TComponent);
begin
  inherited create(aOwner);

  createPParams(nil);
end;

constructor TPImage.create(aOwner: TComponent ; xpixel, ypixel: Integer);
begin
  // object Defaults
  inherited create(aOwner);

  Self.Height := ypixel;
  Self.Width := xpixel;

  // user code
  createPParams(nil);

end;
Da du in deinem erweiterten constructor den originalen per inherited aufrufst, kannst Du dir in deinem erweiterten das
Delphi-Quellcode:
  // user code
  createPParams(nil);
sparen!


Also:

Delphi-Quellcode:
constructor TPImage.create(aOwner: TComponent);
begin
  inherited create(aOwner);

  createPParams(nil);
end;

constructor TPImage.create(aOwner: TComponent ; xpixel, ypixel: Integer);
begin
  // object Defaults
  inherited create(aOwner);

  Self.Height := ypixel;
  Self.Width := xpixel;
end;
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#17

AW: Klassen constructor Aufrufen

  Alt 4. Apr 2017, 16:54
Ich dachte die Info bekommt die Class schom beim Ausführen des KOnstruktors
Owner und Parent sind zwei unterschiedliche Dinge.
Der Owner verwaltet die Instanz des Controls und gibt sie frei wenn er selbst freigegeben wird.
Das Parent ist das Control auf dem das erstellte Control platziert werden soll.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: Klassen constructor Aufrufen

  Alt 4. Apr 2017, 17:15
Da du in deinem erweiterten constructor den originalen per inherited aufrufst, kannst Du dir in deinem erweiterten das
Delphi-Quellcode:
  // user code
  createPParams(nil);
sparen!
Da wäre ich jetzt nicht so sicher! Du rufst ja explizit das inherited Create auf und nicht das der aktuellen Klasse.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
970 Beiträge
 
Delphi 6 Professional
 
#19

AW: Klassen constructor Aufrufen

  Alt 4. Apr 2017, 18:18
Hmm..


Wäre es dann nicht besser, das inherited weg zu lassen?
Dann würden beide Aufrufe zur selben 'Basis' passen, ohne immer alles aus dem Einen im Anderen wieder nachziehen zu müssen.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Klassen constructor Aufrufen

  Alt 4. Apr 2017, 18:53
[edit] Jupp, weg damit.

Da du in deinem erweiterten constructor den originalen per inherited aufrufst, kannst Du dir in deinem erweiterten das
Delphi-Quellcode:
  // user code
  createPParams(nil);
sparen!
Dann sollte man da aber das Inherited weglassen, denn damit wird der Vorfahr aufgerufen, wo das nicht drin ist,

also:
Delphi-Quellcode:
constructor TPImage.Create(aOwner: TComponent);
begin
  inherited; //inherited Create(aOwner); // wenn es gleich ist (Name und Parameter, dann muß man es nicht angeben) ... finde ich übersichtlicher, da man so weiß, dass nur der direkte Vorfahre gemeint ist
  createPParams(nil);
end;

constructor TPImage.Create(aOwner: TComponent; xpixel, ypixel: Integer);
begin
  // object Defaults
  Create(aOwner); // inherited Create(aOwner); // hier ohne Inherited, wenn man den "Eigenen" meint

  Self.Height := ypixel;
  Self.Width := xpixel;
end;
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 08:54 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