![]() |
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! |
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:
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
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,...]); |
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,... .
|
Re: Generische Erzeugung von Objekten...
Hi,
ok, werde mal basteln! Melde mich dann später noch einmal... Danke. |
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' |
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'? |
Re: Generische Erzeugung von Objekten...
Ich kann es mir nicht vorstellen, denn letzendlich sind ALLE Objekte von Delphi von TObject abgeleitet, auch TPersistent.
|
Re: Generische Erzeugung von Objekten...
Zitat:
@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:
die innereien sind dann standard zeug :-D
procedure pdRegisterClass(aClass:TpdClass);
procedure pdUnRegisterClass(aClass:TpdClass); function pdFindClass(aClassName:string):TpdClass; |
Re: Generische Erzeugung von Objekten...
Zitat:
![]() ![]() Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:48 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