![]() |
Objekt anhand der Klassenbezeichnung erzeugen
Gibt es die Möglichkeit ein Objekt anhand der Klassenbezeichnung zu erzeugen?
Beispiel: Ich habe die Klassentypen TMeinObjekt1 und TMeinObjekt2. Jetzt bräuchte ich eine Funktion die einen String entgegennimmt z.B. 'TMeinObjekt1' und eine Objektinstanz vom entsprechenden Typ zurückliefert. Aber bitte nicht so:
Delphi-Quellcode:
Da gibt es doch bestimmt eine intelligente Lösung die für alle Objekttypen gilt, oder?
if str = 'TMeinObjekt1' then
Result := TMeinObjekt1.Create(); Fragt mich bitte nicht, wofür ich es brauch. Ich weiß es selbst noch nicht, sondern will es erst mal nur so wissen. Danke schon mal. |
Re: Objekt anhand der Klassenbezeichnung erzeugen
Sollte es sich um eine Komponente handlen, gibt es
![]() |
Re: Objekt anhand der Klassenbezeichnung erzeugen
Hier geht es um Klassen, nicht Instanzen.
Einen sauberen Weg gibt es nicht, aber hier im Forum geistert eine Unit herum, mit der man alle Typinformationen in einem Modul auflisten kann. Damit ist es dann trivial, weil in den Typinformationen der Klasse auch die TClass gespeichert ist. |
Re: Objekt anhand der Klassenbezeichnung erzeugen
Oh, sorry.
|
Re: Objekt anhand der Klassenbezeichnung erzeugen
Musst du wirklich alle Klassen behandeln oder nur welche, die du selber schreibst? In letzterem Falle würde ich einen Mechanismus a la RegisterClass machen. Schau dir mal an, wie das in der VCL implementiert ist.
HTH, Uli. |
Re: Objekt anhand der Klassenbezeichnung erzeugen
Hallo,
shmia zeigt in einem ![]() ![]() ![]() Gruß Hawkeye |
Re: Objekt anhand der Klassenbezeichnung erzeugen
Super, vielen Dank. Klappt wunderbar und reicht mir!
So ungefähr geht's:
Delphi-Quellcode:
// Test-Objekt
TMeinObjekt1 = class (TPersistent) public strName : String; end; ... initialization // Klasse registrieren RegisterClass(TMeinObjekt1); end; ... // Test-Prozedur procedure Test(); var cls : TPersistentClass; obj : TObject; begin // Klassenreferenz ermitteln cls := FindClass('TMeinObjekt1'); // Objekt-Instanz erzeugen obj := cls.Create(); // Da nicht das konkrete Objekt erzeugt wurde, wird hier gecasted TMeinObjekt1(obj).strName := 'Hallo'; // Test-Ausgabe ShowMessage(TMeinObjekt1(obj).strName); end; |
Re: Objekt anhand der Klassenbezeichnung erzeugen
Hi zusammen!
Ich versuche gerade ähnliches zu machen. Allerdings habe ich noch ein Problem. Das Objekt erstellen ist ja so kein Problem. Allerdings wird nur mein Constructor der Basisklasse aufgerufen und nicht der des eigentlichen Objektes.
Delphi-Quellcode:
Das Baseobjekt stellt bei mir eine eigene Classroot dar von der ich alles ableite. Ich weiss lediglich mittels eines Strings, hier TExtendedObject' welches Object ich erzeugen muss/will. Also kann ich mich nur auf den allgemeinen kleinsten Nenner, die TBaseObject, beziehen. Das erstellte Objekt ist auch vom Typ TExtendedObject. Jedoch eben nicht mit den für dieses Object initialisierten Werten, sondern denen der Basisklasse.
TBaseObjekt = class (TPersistent)
public strName : String; constructor Create; overload; end; TBaseObjectClass = class of TBaseObject; TExtendedObjekt = class (TBaseObjekt) public constructor Create; overload; end; constructor TBaseObjekt.Create; begin Self.strName := 'Base'; end; constructor TExtendedObjekt.Create; begin Self.strName := 'Extendet'; end; procedure Test(); var cls : TPersistentClass; obj : TBaseObject; begin // Klassenreferenz ermitteln cls := FindClass('TExtendedObjekt'); // Objekt-Instanz erzeugen obj := TBaseObjectClass( cls ).Create(); // Test-Ausgabe ShowMessage(TExtendedObjekt(obj).strName); // Die Ausgabe sollte dann Base sein end; Hoffe konnte verständlich machen um was es mir geht und hoffe auf Hilfe. Liebe Grüsse Pascal |
Re: Objekt anhand der Klassenbezeichnung erzeugen
Was macht nochmal das overload ? :gruebel: Normaler Weg wäre override in der Deklaration und eventuell inherited aufrufen.
|
Re: Objekt anhand der Klassenbezeichnung erzeugen
Ok, das Overload gehört da garnicht hin. Das war wohl zuviel kopiert und rumgebastelt.
Dient aber dazu um Methoden zu überladen.
Delphi-Quellcode:
Mehr macht das garnicht.
procedure MeineMethode( str : String );
procedure MeineMethode( int : Integer ); overload; procedure MeineMethode( str : String ); begin ShowMessage( str ); end; procedure MeineMethode( int : Integer ); begin MeineMethode( IntToStr( int ) ); end; Mit inherited arbeite ich auch. Nur passiert eben folgendes. Ich initiiere ein Objekt einer Klasse die ich als String angebe (wenn sie denn gefunden wird). Nur der Constructor wird eben von der Basisklasse verwendet. Ich kann ja zum derzeitigen Punkt nicht wissen um welchen Typ Klasse es sich dabei handelt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:13 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-2025 by Thomas Breitkreuz