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
bernhard_LA

Registriert seit: 8. Jun 2009
Ort: Bayern
1.138 Beiträge
 
Delphi 11 Alexandria
 
#1

AW: Klassen constructor Aufrufen

  Alt 4. Apr 2017, 11:55
die Konstruktoren habe ich wie folgt abgeändert :


Delphi-Quellcode:
  
TPImage = class(TImage)
  private

  public
    { Public-Deklarationen }


    constructor create(aOwner: TComponent); overload; override;

    constructor create(aOwner: TComponent; xpixel, ypixel: Integer); reintroduce; overload;

    ....

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;

Wenn ich die installierte Komponente jetzt auf das Formular ziehe sieht es gut aus ( muss noch mehr testen)
allerdings funktioniert das Erzeugen zur Laufzeit jetzt nicht mehr

also

Delphi-Quellcode:
 // Größe des Bilder möchte ich via align einstellen
 FPI := TPImage.create(Panel1);
 // ich gebe die Größe des Bildes vor ...
 FPI := TPImage.create(Panel1,300,300);

dann wird auf meinem Panel nichts mehr anzeigt , ich muss dann nochmals

FPI.Parent := Panel1;

einfügen. Ich dachte die Info bekommt die Class schom beim Ausführen des KOnstruktors

Geändert von bernhard_LA ( 4. Apr 2017 um 11:59 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

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

AW: Klassen constructor Aufrufen

  Alt 4. Apr 2017, 12:04

dann wird auf meinem Panel nichts mehr anzeigt , ich muss dann nochmals

FPI.Parent := Panel1;

einfügen. Ich dachte die Info bekommt die Class schom beim Ausführen des KOnstruktors
Nein... Das musst Du immer machen...

Es könnte ja

Delphi-Quellcode:
AInstance := TFoo.Create(Form1,10,10);
AInstance.Parent := Panel1;
sein...
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

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.
Ein Therapeut entspricht 1024 Gigapeut.

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

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

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 Uwe Raabe
Uwe Raabe

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

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
977 Beiträge
 
Delphi 6 Professional
 
#6

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.314 Beiträge
 
Delphi 12 Athens
 
#7

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;
Ein Therapeut entspricht 1024 Gigapeut.
  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
 
#8

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
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:09 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz