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 1 von 2  1 2      
bernhard_LA

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

Klassen constructor Aufrufen

  Alt 3. Apr 2017, 22:38
ich habe eine Komponente die sich von TImage ableitet.
Wenn ich die Komponente zur Laufzeit in meiner Anwendung erzeuge kann ich einen von beiden class constructoren direkt aufrufen. Es spielt alles wie es soll.

Wenn ich die Komponente nun installiere und auf mein Formular ziehe, dann wird der Konstruktor nicht aufgerufen, ich bekomme einen Fehler bei nicht initialisieren lokalen Variablen meiner Klasse.

Welcher Constructor wird ausgeführt wenn ich meine Komponente auf ein Form ziehe ?



Delphi-Quellcode:
TPImage = class(TImage)
  private
    { Private-Deklarationen }
    

  protected
    { Protected-Deklarationen }

    BasicInit: Boolean;

  public
    { Public-Deklarationen }

    constructor create(xpixel, ypixel: Integer); overload;

    constructor create(aOwner: TWinControl); overload;

    destructor destroy; override;

...

end;
  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
 
#2

AW: Klassen constructor Aufrufen

  Alt 3. Apr 2017, 23:01
Welcher Constructor wird ausgeführt wenn ich meine Komponente auf ein Form ziehe ?
Der in TComponent definiert ist. Den musst du überschreiben, wenn das was werden soll.
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
 
#3

AW: Klassen constructor Aufrufen

  Alt 3. Apr 2017, 23:02
Rate mal, warum TComponent einen virtuellen Contructor hat.
$2B or not $2B
  Mit Zitat antworten Zitat
bernhard_LA

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

AW: Klassen constructor Aufrufen

  Alt 4. Apr 2017, 09:50
mit dem Schlüsselwort override komme ich leider auch nicht weiter

Delphi-Quellcode:
    // diesen Ausführen wenn ich K. zur Laufzeit erzeuge
    constructor create(xpixel, ypixel: Integer); overload;
    // diesen Ausführen wenn ich K. auf mein Form gezogen habe
    constructor create(aOwner: TWinControl); override; overload;


Fehlermeldung :

[dcc32 Error] Unit_TPl.pas(97): E2037 Declaration of 'Create' differs from previous declaration

Geändert von bernhard_LA ( 4. Apr 2017 um 09:53 Uhr)
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.381 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Klassen constructor Aufrufen

  Alt 4. Apr 2017, 10:01
das sollte eher so aussehen:

Delphi-Quellcode:
  
    constructor create(aOwner: TWinControl; xpixel, ypixel: Integer); override; reintroduce;
und dann ein inherited create(aowner)....
  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
 
#6

AW: Klassen constructor Aufrufen

  Alt 4. Apr 2017, 10:02
Überschriebene Methoden müssen die gleiche Signatur haben wie die virtuelle in der Basisklasse. D.h.:
constructor Create(AOwner: TComponent); override;
das sollte eher so aussehen:
Delphi-Quellcode:
  
    constructor create(aOwner: TWinControl; xpixel, ypixel: Integer); override; reintroduce;
und dann ein inherited create(aowner)....
Der Konstruktor wird aber auch nicht aufgerufen wenn du das Image aufs Formular ziehst.
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.475 Beiträge
 
Delphi 12 Athens
 
#7

AW: Klassen constructor Aufrufen

  Alt 4. Apr 2017, 10:24
Dein Interface müsste dann in etwa so aussehen:
Delphi-Quellcode:
    constructor Create(AOwner: TComponent); overload; override;
    constructor Create(xpixel, ypixel: Integer); reintroduce; overload;
    constructor Create(aOwner: TWinControl); reintroduce; overload; // wobei das hier eventuell Probleme bereitet, das TWinControl ja ebenfalls ein TComponent ist.
Die eigentliche Arbeit steckt aber in den Implementierungen, zu denen wir aber so nicht viel sagen können.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#8

AW: Klassen constructor Aufrufen

  Alt 4. Apr 2017, 11:46
Zitat:
constructor Create(aOwner: TWinControl); reintroduce; overload; // wobei das hier eventuell Probleme bereitet, das TWinControl ja ebenfalls ein TComponent ist.
Wenn man es gar nicht anders hinbekommt:
constructor Create(aOwner: TWinControl; NotNeededDummy: integer = 0); reintroduce; overload; Aber sowas würde ich nur im alleräußersten Notfall und mit Bauchgrimmen implementieren.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
bernhard_LA

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

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.144 Beiträge
 
Delphi 10.3 Rio
 
#10

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
Antwort Antwort
Seite 1 von 2  1 2      


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 12:34 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