Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Klassen constructor Aufrufen (https://www.delphipraxis.net/192258-klassen-constructor-aufrufen.html)

bernhard_LA 3. Apr 2017 21:38

Klassen constructor Aufrufen
 
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;

Uwe Raabe 3. Apr 2017 22:01

AW: Klassen constructor Aufrufen
 
Zitat:

Zitat von bernhard_LA (Beitrag 1366319)
Welcher Constructor wird ausgeführt wenn ich meine Komponente auf ein Form ziehe ?

Der in
Delphi-Quellcode:
TComponent
definiert ist. Den musst du überschreiben, wenn das was werden soll.

himitsu 3. Apr 2017 22:02

AW: Klassen constructor Aufrufen
 
Rate mal, warum TComponent einen virtuellen Contructor hat. :zwinker:

bernhard_LA 4. Apr 2017 08:50

AW: Klassen constructor Aufrufen
 
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

Lemmy 4. Apr 2017 09:01

AW: Klassen constructor Aufrufen
 
das sollte eher so aussehen:

Delphi-Quellcode:
 
    constructor create(aOwner: TWinControl; xpixel, ypixel: Integer); override; reintroduce;
und dann ein inherited create(aowner)....

Neutral General 4. Apr 2017 09:02

AW: Klassen constructor Aufrufen
 
Überschriebene Methoden müssen die gleiche Signatur haben wie die virtuelle in der Basisklasse. D.h.:
Delphi-Quellcode:
constructor Create(AOwner: TComponent); override;
Zitat:

Zitat von Lemmy (Beitrag 1366341)
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.

Uwe Raabe 4. Apr 2017 09:24

AW: Klassen constructor Aufrufen
 
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.

DeddyH 4. Apr 2017 10:46

AW: Klassen constructor Aufrufen
 
Zitat:

Delphi-Quellcode:
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:
Delphi-Quellcode:
constructor Create(aOwner: TWinControl; NotNeededDummy: integer = 0); reintroduce; overload;
Aber sowas würde ich nur im alleräußersten Notfall und mit Bauchgrimmen implementieren.

bernhard_LA 4. Apr 2017 10:55

AW: Klassen constructor Aufrufen
 
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

Mavarik 4. Apr 2017 11:04

AW: Klassen constructor Aufrufen
 
Zitat:

Zitat von bernhard_LA (Beitrag 1366360)

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...


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:50 Uhr.
Seite 1 von 2  1 2      

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