AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen FreePascal Object anhand des Classennamens erstellen

Object anhand des Classennamens erstellen

Ein Thema von SirTwist · begonnen am 5. Jun 2016 · letzter Beitrag vom 19. Sep 2020
Antwort Antwort
SirTwist

Registriert seit: 28. Sep 2006
196 Beiträge
 
Delphi XE Professional
 
#1

Object anhand des Classennamens erstellen

  Alt 5. Jun 2016, 13:48
Hallo Leute,

ich versuche seit kurzer Zeit, mich in Freepascal / Lazarus einzuarbeiten und meine (im Laufe von 15 Jahren gewachsene) Hilfsbibliotheken von Delphi umzubauen.

An einer Stelle möchte ich ein Objekt erstellen, dessen Klassennamen ich als String vorliegen habe (u.a. beim Einlesen einer XML-Datei). In Delphi habe ich das mit RTTI gelöst:
Delphi-Quellcode:
        rtti_context := TRttiContext.Create;
        rtti_instanceType := FindType(obj_classname);
        if not Assigned(rtti_instanceType) then exit;
        create_method := rtti_instanceType.GetMethod('Create');
        if Assigned(create_method) then begin
          create_result := create_method.Invoke(rtti_instanceType.MetaclassType, []);
          aObj := create_result.AsObject;
        end else begin
          aObj := rtti_instanceType.MetaclassType.Create;
        end;
(bereinigt um Kommentare, Fehlermeldungen etc...)

Das scheint mir im aktuelle Freepascal (3.0.0, 51630) offensichtlich nicht zur Verfügung. Also habe ich gegoogelt, und diese Lösung gefunden:
Delphi-Quellcode:
    class_type := GetClass(obj_classname);
    aObj := class_type.Create;
Das erzeugt mir zwar ein Objekt, ruft aber nicht den klassenspezifischen Constructor auf. Außerdem funktioniert es nur mit Klassentypen, die ich vorher explizit registriert habe, und die von TPersistent abgeleitet sind. Das Objekt hat aber den richtigen Typ, ein Aufruf von aObj.Classname ergibt das, was vorher in obj_classname stand.

Übersehe ich irgendeine fluffige Möglichkeit, aus einem Klassennamen als String das passende Objekt zu erzeugen?


Vielen Dank für eure Hilfe!

Schöne Grüße,
Michael
  Mit Zitat antworten Zitat
Lee6

Registriert seit: 19. Sep 2020
1 Beiträge
 
#2

AW: Object anhand des Classennamens erstellen

  Alt 19. Sep 2020, 12:24
Um ein Objekt von MyClass zu erstellen, geben Sie den Klassennamen gefolgt vom Objektnamen an und verwenden Sie das Schlüsselwort new: Example. Erstellen Sie ein Objekt mit dem Namen "myObj" und drucken Sie den Wert von x: public class MyClass {int x = 5; public static void main (String [] args) {MyClass myObj = new MyClass (); System. Beispiel. OtherClass.
Complete guide about Azerbaijan visa for Indian Citizens is available.
  Mit Zitat antworten Zitat
SirTwist

Registriert seit: 28. Sep 2006
196 Beiträge
 
Delphi XE Professional
 
#3

AW: Object anhand des Classennamens erstellen

  Alt 19. Sep 2020, 12:31
Hallo Lee,

du bist hier in einem Delphi-Forum. Herzlich Willkommen! Lies dich doch bitte erstmal ein paar Tage ein und werde mit der neuen Sprache vertraut. Nach und nach findest Du dann bestimmt auch die Möglichkeit, bei Beiträgen hilfreiche Antworten zu finden.

Um ein Objekt von MyClass zu erstellen, geben Sie den Klassennamen gefolgt vom Objektnamen an und verwenden Sie das Schlüsselwort new: Example. Erstellen Sie ein Objekt mit dem Namen "myObj" und drucken Sie den Wert von x: public class MyClass {int x = 5; public static void main (String [] args) {MyClass myObj = new MyClass (); System. Beispiel. OtherClass.
Deine Antwort geht leider völlig an meiner Frage vorbei. Du beschreibst hier Grundlagen von C++, nicht von Delphi/Freepascal. Und ich habe danach gefragt, wie man ein Objekt anlegen kann, dessen Klassennamen in einer Stringvariablen steht.

Schöne Grüße,
Sir Twist
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
7.948 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Object anhand des Classennamens erstellen

  Alt 19. Sep 2020, 12:43
Ich fürchte, deine Ausführungen gehen ins Leere. Die Antwort von Lee6 ist im Wesentlichen eine automatische Übersetzung eines Teils dieser Seite: https://www.w3schools.com/java/java_classes.asp und stinkt ganz gewaltig nach Bot.

Zitat:
To create an object of MyClass, specify the class name, followed by the object name, and use the keyword new:

Example
Create an object called "myObj" and print the value of x:

public class MyClass {
int x = 5;

public static void main(String[] args) {
MyClass myObj = new MyClass();
System.out.println(myObj.x);
}
}
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
venice2

Registriert seit: 5. Dez 2019
283 Beiträge
 
Delphi 2010 Architect
 
#5

AW: Object anhand des Classennamens erstellen

  Alt 19. Sep 2020, 13:41
Hier sind seit ein paar Tagen irgendwelche Spinner unterwegs. Sorry muss das leider so krass ausdrücken.
Siehe.
@aris0514 und seine Antworten. (Kommentare)

Aber vielleicht soll das so sein.

EDIT:
Sehe gerade du hast ja schon etwas dazu geschrieben. Sorry post war unnötig.

Geändert von venice2 (19. Sep 2020 um 14:18 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
36.867 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Object anhand des Classennamens erstellen

  Alt 19. Sep 2020, 15:13
OK, den Spämmer ignorieren wir einfach mal.

Ja, über die RTTI kannst du eine Klasse suchen.
Alternativ gibt es auch Delphi-Referenz durchsuchenRegisterClass und Delphi-Referenz durchsuchenFindClass.



Jene werden auch von der VCL und FMX benutzt.
Beim Create einer TForm, werden über die published Fields in der Form-Klasse die enthaltenen Komponenten-Typen registriert,
und während des Ladens sucht dann der DFM-Reader die namentlich in der DFM stehenden Klassen in dieser Liste.
PS: Drum knallt es auch, wenn man eine Komponente auf der Form hat, aber keine publisched Variable dieses Types in der Form existiert. (und dieser Typ vorher auch nicht registriert war)

Hat man Klassen in Sub-Typen, welche keine "Variable" in der Form-Klasse besitzen, dann muß man diese Klassen manuel registrieren.
z.B. bei einer Liste/Collection als Property in einer Komponente oder bei einer Komponente die aus weiteren Komponenten bestecht.

Delphi-Quellcode:
{ Class registration routines }

procedure RegisterClass(AClass: TPersistentClass);
procedure RegisterClasses(const AClasses: array of TPersistentClass);
procedure RegisterClassAlias(AClass: TPersistentClass; const Alias: string);
procedure UnRegisterClass(AClass: TPersistentClass);
procedure UnRegisterClasses(const AClasses: array of TPersistentClass);
procedure UnRegisterModuleClasses(Module: HMODULE);
function FindClass(const ClassName: string): TPersistentClass;
function GetClass(const AClassName: string): TPersistentClass;
procedure StartClassGroup(AClass: TPersistentClass);
procedure GroupDescendentsWith(AClass, AClassGroup: TPersistentClass);
function ActivateClassGroup(AClass: TPersistentClass): TPersistentClass;
function ActiveClassGroup: TPersistentClass;
function ClassGroupOf(AClass: TPersistentClass): TPersistentClass; overload;
function ClassGroupOf(Instance: TPersistent): TPersistentClass; overload;

procedure ReportClassGroups(Report: TStrings);
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

Geändert von himitsu (19. Sep 2020 um 15:16 Uhr)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 19:15 Uhr.
Powered by vBulletin® Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2020 by Daniel R. Wolf