Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Problem mit Konstruktoren (https://www.delphipraxis.net/46405-problem-mit-konstruktoren.html)

delphino 24. Mai 2005 14:32


Problem mit Konstruktoren
 
Holla !

Nachdem ich beim letzten Mal hier sehr schnell mit einer möglichen Lösung sehr schnell zu einer Problemlösung fand, stelle ich mal wieder eine Frage. Alles ein bißchen Komplex, aber hoffe, dass ich es ausreichend erklären kann.

Habe eine TPageControl, die ja bekanntermaßen TTabSheets hat. Die PageControl liegt auf einem Frame, die TabSheets bekommen wieder Frames aufgelgt. Habe eine Klasse TErfassen gebaut, welche sich von TFrame ableitet. Funzt auch wunderbar. Nur möchte ich jetzt den DB-Handler des Frames mit der PageControl dem TErfassen übergeben, damit TErfassen darauf einen Query und Datasource erstellen kann.

Dazu gibt es in TErfassen einen Contructor:

Delphi-Quellcode:
constructor TErfassen1.Create(AOwner:TComponent; DB:TDBForm);
begin
   inherited Create(AOwner);
   SQLHandle1 := TSQLHandle.Create(DB);
   DBText1.DataSource := SQLHandle1.DataSource1;
end;
Natürlich müßte ich den irgendwo aufrufen. Dazu noch ein paar Infos:

Habe im Designer nun das Frame mit dem TPageControl, der mir dann auch das TErfassen auf einem TTabSheet anzeigt, also auch ein DFM wo definiert ist wie groß das TTabSheet und die TTPageControl sein soll. ABER 1. kann ich im DFM wohl keine Konstruktoren aufrufen, folglich kann ich auch keine Werte übergeben. Versuche eines meiner DBHandler Objekte als Property im DFM zu übergeben schlug fehl. Außerdem wäre die Constructor-Lösung eher geeignet, da der DBHandler später dynamisch übergeben werden soll und im Sinne von "Wiederverwendbarkeit des Codes" auch in anderen TTabSheets zur Verfügung stehen soll, die dann jeweils ihre eingenen DBHandler und darauf basierende Querys und DataSources haben.

Also kurz: Wie kann ich Konstruktoren von abgeleiteten Frames über den Desginer aufrufen, wenn ich weiterhin im RAD meine Desgins erstellen will ??


Um das ganze vllt zu umgehen. Gibt es eine Möglichkeit auf Methoden und Attribute des Parent-Objektes zuzugreifen ? Sprich: Das PageControl (auf einem Frame) ist ja quasi parent meiner TTabSheets, welche wiederum Frames enthalten. Hierachie ist dann Frame, welches das TabSheet als parent hat, dessen parent ist PageControl und dessen parent ist das Frame. Kann ich nun vom untersten Frame auf Attribute des obersten Frame zugreifen ?


Hoffe ich verwirre jetzt nicht zu sehr. Vllt habe ich ja auch nurn dicken, fetten Denkfehler in meinen Überlegungen.


Thanks in advance...

delphino

Bernhard Geyer 24. Mai 2005 15:05

Re: Problem mit Konstruktoren
 
Konstruktoren von Komponenten welche von TComponent abgeleitet sind müssen immer die Signatur
Delphi-Quellcode:
constructor Create(AOwner: TComponent);
besitzen. Die Delphi-IDE und das gesamte darauf aufsetzende Komponentenmodell verläßt sich darauf.
Alles andere mußt Du über Properties machen!

delphino 24. Mai 2005 16:22

Re: Problem mit Konstruktoren
 
Okay, dann mach ich das mal über Properies. Funzt auch... Danke... ;)

Noch eine weiterführende Frage, da ich ja nun keinen explizieten Constructor oder OnCreate-Ereignis bei einem Frame habe, wie kann ich es hinbekommen, dass trotzdem beim Instanzieren der Klasse, bestimmte Operatiionen ausgeführt werden ??

Gruß delphino

KrasserChecker 24. Mai 2005 16:50

Re: Problem mit Konstruktoren
 
Indem Du dir selbst den Constructor des Frames überschreibst:

Delphi-Quellcode:
public
  constructor Create(AOwner: TComponent); override;

Jelly 24. Mai 2005 21:44

Re: Problem mit Konstruktoren
 
Zitat:

Zitat von KrasserChecker
Delphi-Quellcode:
public
  constructor Create(AOwner: TComponent); override;

Also ich würds eher so machen:
Delphi-Quellcode:
public
  constructor Create(AOwner: TComponent ; DB : TDBForm); overload;

Robert_G 24. Mai 2005 22:17

Re: Problem mit Konstruktoren
 
Zitat:

Zitat von Jelly
Zitat:

Zitat von KrasserChecker
Delphi-Quellcode:
public
  constructor Create(AOwner: TComponent); override;

Also ich würds eher so machen:
Delphi-Quellcode:
public
  constructor Create(AOwner: TComponent ; DB : TDBForm); overload;

Das bringt dir aber nix. ;)
Wenn du den virtuellen Contructor von TComponent überschreibst kannst du eigenen Code einschleusen.
Dein überladenen Constructor würde vom Delphi Streaming System nicht angerührt werden. ;) Somit wäre die Instanz nicht genügend initialisiert.

Delphi-Quellcode:
constructor(aOwner :TComponent);override;
...
constructor SomeClass(aOwner :TComponent);
begin
  //irgendwas vor dem Constructor des Vorgängers ausführen
  inherited;//Constructor des Vorgängers
  //irgendwas nach dem Constructor des Vorgängers ausführen
end;

delphino 25. Mai 2005 10:48

Re: Problem mit Konstruktoren
 
Nunja, das ist ja alles schön und gut, aber löst das Problem der Übergabe von Parametern nicht.

Im Constructor des ersten Frames setze ich das Property DBHandle des anderen Frames auf das DBHandle, über welchen der erste Frame verfügt.
Der erste Frame erstellt während der Laufzeit ja seine Objekte, also u.a. das PageControl und die TabSheets, welche wiederum den zweiten Frame instanziieren... im Constructor des zweiten Frames möchte ich allerdings schon was mit dem DBHandle tun, was fehlschlägt, da die Objekte wohl erstellt werden bevor das Property gesetzt wird. Dabei ist es egal, ob ich das Property vor oder nach dem Ausführen von inherited setze. Geht sogar soweit, dass Delphi inkl. Debugger 100% Systemlast verursachen und den Speicher vollschreiben und sich nur per kill zum aufhören bewegen lassen.

Wie gesagt, vllt fahr ich ja auf nem völlig falschen Dampfer, weil ich aus der Java/PHP-Ecke komme und dort solche Code-Konstrukte funktionieren und auch erwünscht bzw. so vorgesehen sind und es unter Deplhi anders gelöst werden muss, aber dazu fällt mir im Moment echt nichts ein.


Gruß und danke, dass sich soviele Leute Gedanken machen...

delphino


P.S.:
Delphi-Quellcode:
public
  constructor Create(AOwner: TComponent ; DB : TDBForm); overload;
^^ das habe ich ja zuerst probiert. Allerdings wird dieser Konstruktor nicht vom RAD aufgerufen, bzw. ich weiß nicht, wie ich dem RAD sagen kann, dass es diesen Constructor benutzen soll oder wo ich im RAD dann enstprechend angeben kann, dass noch mehr Parameter als nur der Owner übergeben werden sollen.

delphino 2. Jun 2005 15:26

Re: Problem mit Konstruktoren
 
So, hab mal ein bißchen Nachgedacht und mache jetzt halt alles ganz anders... *lol*

Gibt jetzt ne DB - Kapselklasse, die man einfach instanziiert wenn man in einem Form Zugriff auf ne DB braucht. Ist zwar alles noch im Test-Stadium, aber bin zuversichtlich, dass es funktioniert.

Danke nochmals für die vielen Antworten !!

delphino

barf00s 2. Jun 2005 16:06

Re: Problem mit Konstruktoren
 
was man auch machen könnte, nachdem dein programm geladen wurde könnte man (sofern es sich um ein TComponent abkömmling handelt) seine Loaded procedure überschreiben...

Delphi-Quellcode:
type
  TFoo = class(TComponent)
  public
  ...
    procedure Loaded; override;
  ...
  end;


procedure TFoo.Loaded;
begin
  inherited;
  ... code der nach dem initializieren der componente ausgeführt werden soll ...
end;
</senf>

delphino 2. Jun 2005 17:59

Re: Problem mit Konstruktoren
 
Ola,
dass ja arg. So ein Konstrukt werde ich mal ausprobieren. Was mich an Delphi stört sind diese 1000 komischen Sachen, die Delphi macht von denen man so im Normalfall garnichts mitbekommt. Macht einem das Leben nicht gerade einfacher. Nunja, werd mich weiter durchbeißen.

Thx für den Tip...

delphino


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:11 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