Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Generische Erzeugung von Objekten... (https://www.delphipraxis.net/29307-generische-erzeugung-von-objekten.html)

barnti 7. Sep 2004 13:22


Generische Erzeugung von Objekten...
 
Hallo,

ich habe eine Klasse vom Typ 'TPDObject'. Davon erben die spezielleren Objekte, z.B.TPDKunde,TPDWare...
Für jede meiner Datenbanktabellen möchte ich jetzt ein spezielleres Objekt erzeugen, sobald die Anwendung gestartet wird, bzw. eine der Tabellen benötigt wird.
Ist es möglich diese Erzeugung zu automatisieren, bzw mit eier generischen Funktion durchzuführen?
Die Lösung sollte dann in etwa so ausschauen:

-User wählt Eintrag aus ComboBox -> 'Kunde'
-Item entscheidet über die Erzeugung des speziellen Objektes -> TPDKunde.create.

Alles unklar?! Fragt mich! Würde mich über Anregungen sehr freuen!

maximov 7. Sep 2004 13:33

Re: Generische Erzeugung von Objekten...
 
Moin,

was du brauchst sind klassen-referenzen (metaklassen oder wie die heissen). Zu dem speziellen feld suchst du dir die richtige referenz und kannst dann normal instanzieren:

Delphi-Quellcode:
type
  TPDObjectClass = class of TPDObject;
..
var
  pdClass :TPDObjectClass ;
...
// klassen-referenz holen
pdClass := findClass( ?GetActFieldClassName? );
if pdClass <> nil then
  obj := pdClass.create; // fertig


...
initialization
  // damit man später über den namen an die klasse kommt
  RegisterClasses([TPDKunde,etc,...]);
Wichtig ist das die klassen registriert werden! Du kannst dir da auch deine eigene registry schreiben, die direkt auf den feldnamen reagiert (zB. mit einer stringliste) :-D

LarsMiddendorf 7. Sep 2004 13:36

Re: Generische Erzeugung von Objekten...
 
Die Klasse TPDObject sollte auch einen virtuellen Konstruktor haben, weil sonst der Konstruktor von TPDObject aufgerufen wird und nicht der Konstruktor der abgeleiteten Klasse TPDKunde,TPDWare,... .

barnti 7. Sep 2004 13:41

Re: Generische Erzeugung von Objekten...
 
Hi,
ok, werde mal basteln! Melde mich dann später noch einmal...
Danke.

barnti 7. Sep 2004 14:07

Re: Generische Erzeugung von Objekten...
 
Hi,
habs mal nach deinem Beispielcode versucht, leider mit folgender Fehlermeldung:
Delphi-Quellcode:
type
  TPDObjectClass = class of TPDObject;
..
var
  pdClass :TPDObjectClass ;
...
// klassen-referenz holen
pdClass := findClass( ?GetActFieldClassName? ); // hier beschwert sich der Compiler
if pdClass <> nil then
  obj := pdClass.create; // fertig


...
initialization
  // damit man später über den namen an die klasse kommt
  RegisterClasses([TPDKunde,etc,...]);




[Error] PDInterface.pas(108): Incompatible types: 'TPersistentClass' and 'Class reference'

barnti 7. Sep 2004 14:41

Re: Generische Erzeugung von Objekten...
 
Hallo,
ok, ich muss das zu erzeugende Objekt vom Typ 'TPersistent' ableiten und nicht von 'TObject'. Dann klapp es!
Kann mir jemand sagen, ob dies ein Problem darstellt, 'TPersistent' oder 'TObject'?

Dax 7. Sep 2004 14:54

Re: Generische Erzeugung von Objekten...
 
Ich kann es mir nicht vorstellen, denn letzendlich sind ALLE Objekte von Delphi von TObject abgeleitet, auch TPersistent.

maximov 8. Sep 2004 09:50

Re: Generische Erzeugung von Objekten...
 
Zitat:

Zitat von Dax
Ich kann es mir nicht vorstellen, denn letzendlich sind ALLE Objekte von Delphi von TObject abgeleitet, auch TPersistent.

Naja, in diesem fall is das sicher kein problem, da TPersistent eine sehr allgemeine oberklasse ist. Aber generell kann man ja wohl kaum sagen, dass es egal wäre, von wo man ableitet, nur weil letztendlich alles TObjects sind :wink: ...aber is schon klar was du damit sagen wolltest.

@barnti:

Ja, wenn du findClass nutzen willst, dann musst du von TPersistent ableiten. Die frage ist natürlich ob das nötig ist, bzw. was deine objekte können sollen und was nicht. Wenn sie zB. persistenzierbar sein müssen, dann wäre das die erste wahl.

Ich hab oben aber schon erwähnt, dass du deine eigene klassen-registrierung machen kannst, die dann auch für TObject geht. In der unit Contnrs (D7) gibt es die klasse TClassList mit der dies sehr einfach möglich wäre.

Du brauchst eigentlich nur drei routinen:
Delphi-Quellcode:
procedure pdRegisterClass(aClass:TpdClass);
procedure pdUnRegisterClass(aClass:TpdClass);
function pdFindClass(aClassName:string):TpdClass;
die innereien sind dann standard zeug :-D

mytar 8. Sep 2004 10:10

Re: Generische Erzeugung von Objekten...
 
Zitat:

Zitat von maximov
was du brauchst sind klassen-referenzen (metaklassen oder wie die heissen). Zu dem speziellen feld suchst du dir die richtige referenz und kannst dann normal instanzieren:

In der OH gibt da jede menge zeug dazu, siehe Delphi-Referenz durchsuchenklassenreferenzen oder Delphi-Referenz durchsuchenklassenreferenztypen. :-D

Zitat:

Zitat von maximov
In der unit Contnrs (D7) gibt es die klasse TClassList mit der dies sehr einfach möglich wäre.

Bei D6 ist Contnrs auch dabei, falls mötig.


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