AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Objekt anhand der Klassenbezeichnung erzeugen
Thema durchsuchen
Ansicht
Themen-Optionen

Objekt anhand der Klassenbezeichnung erzeugen

Ein Thema von SWE · begonnen am 10. Jun 2008 · letzter Beitrag vom 23. Jun 2008
Antwort Antwort
Seite 1 von 2  1 2      
SWE

Registriert seit: 2. Mär 2006
19 Beiträge
 
Delphi 2005 Enterprise
 
#1

Objekt anhand der Klassenbezeichnung erzeugen

  Alt 10. Jun 2008, 17:13
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:
   if str = 'TMeinObjekt1then
        Result := TMeinObjekt1.Create();
Da gibt es doch bestimmt eine intelligente Lösung die für alle Objekttypen gilt, oder?
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.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Objekt anhand der Klassenbezeichnung erzeugen

  Alt 10. Jun 2008, 17:39
Sollte es sich um eine Komponente handlen, gibt es Delphi-Referenz durchsuchenFindComponent.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Objekt anhand der Klassenbezeichnung erzeugen

  Alt 10. Jun 2008, 17:44
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.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Objekt anhand der Klassenbezeichnung erzeugen

  Alt 10. Jun 2008, 17:50
Oh, sorry.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.746 Beiträge
 
Delphi 2007 Professional
 
#5

Re: Objekt anhand der Klassenbezeichnung erzeugen

  Alt 10. Jun 2008, 18:53
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.
Uli Gerhardt
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#6

Re: Objekt anhand der Klassenbezeichnung erzeugen

  Alt 10. Jun 2008, 18:58
Hallo,

shmia zeigt in einem Beitrag zur Code-Library, wie man die Funktion Delphi-Referenz durchsuchenRegisterClass und Delphi-Referenz durchsuchenFindClass einsetzen kann.

Gruß Hawkeye
  Mit Zitat antworten Zitat
SWE

Registriert seit: 2. Mär 2006
19 Beiträge
 
Delphi 2005 Enterprise
 
#7

Re: Objekt anhand der Klassenbezeichnung erzeugen

  Alt 11. Jun 2008, 08:42
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;
  Mit Zitat antworten Zitat
Pascal P

Registriert seit: 16. Nov 2007
14 Beiträge
 
#8

Re: Objekt anhand der Klassenbezeichnung erzeugen

  Alt 20. Jun 2008, 15:58
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:
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;
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.

Hoffe konnte verständlich machen um was es mir geht und hoffe auf Hilfe.
Liebe Grüsse Pascal
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#9

Re: Objekt anhand der Klassenbezeichnung erzeugen

  Alt 20. Jun 2008, 16:14
Was macht nochmal das overload ? Normaler Weg wäre override in der Deklaration und eventuell inherited aufrufen.
Gruß
Hansa
  Mit Zitat antworten Zitat
Pascal P

Registriert seit: 16. Nov 2007
14 Beiträge
 
#10

Re: Objekt anhand der Klassenbezeichnung erzeugen

  Alt 20. Jun 2008, 16:21
Ok, das Overload gehört da garnicht hin. Das war wohl zuviel kopiert und rumgebastelt.
Dient aber dazu um Methoden zu überladen.

Delphi-Quellcode:
  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;
Mehr macht das garnicht.

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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:36 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