Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Felder einer Klasse zur Laufzeit erkennen (https://www.delphipraxis.net/192467-felder-einer-klasse-zur-laufzeit-erkennen.html)

idefix2 20. Apr 2017 16:20

Felder einer Klasse zur Laufzeit erkennen
 
Hallo!
Ist es möglich - und falls ja, ab welcher Delphi Version - Namen und Typ der Felder einer Klasse zur Laufzeit des Programms festzustellen?
Ein Beschränkung auf die pubished Felder (gibt es das bei allen Klassen oder nur bei von TComponent abgeleiteten Klassen), auf die ja Design Zeit der Zugriff von "außen" möglich ist, würde nicht stören.

nahpets 20. Apr 2017 16:43

AW: Felder einer Klasse zur Laufzeit erkennen
 
Ja, nennt sich Hier im Forum suchenRTTI / Laufzeitinformationen.

Mindestens seit Delphi 7.

Delphi-Referenz durchsuchenRTTI
Bei Google suchenDelphi RTTI

idefix2 20. Apr 2017 18:02

AW: Felder einer Klasse zur Laufzeit erkennen
 
Kannst du mir sagen, welche Units in Delphi 2009 (wohl deutlich jünger als Delphi 7) eingebunden werden müssen, damit das funktioniert?
Die Unit System.rtti gibt es da natürlich noch nicht, aber auch eine Unit RTTI suche ich vergeblich.

DeddyH 20. Apr 2017 18:10

AW: Felder einer Klasse zur Laufzeit erkennen
 
Die Unit heißt TypInfo, die erweiterte RTTI wurde erst mit Delphi 2010 eingeführt.

Uwe Raabe 20. Apr 2017 18:11

AW: Felder einer Klasse zur Laufzeit erkennen
 
Für published Properties tut es auch die alte RTTI. Hier wäre für sich die Unit TypInfo.pas und dort die Methode GetPropList von Interesse.

nahpets 20. Apr 2017 18:15

AW: Felder einer Klasse zur Laufzeit erkennen
 
In Delphi 7 ist's die Unit TypInfo.

idefix2 21. Apr 2017 01:26

AW: Felder einer Klasse zur Laufzeit erkennen
 
Danke, ich werde mich jetzt etwas damit spielen.
So, wie ich das verstanden habe, kann man damit zur Laufzeit nur Property-Namen und Eigenschaften, aber nicht die Namen und Eigenschaften von Feldern herausfinden.

Kann man mit der neuen RTTI auch die Feldnamen von Klassen abfragen? Ich habe darauf leider momentan keinen Zugriff, das Delphi Berlin Starter habe ich fürs erste wegen Inkompatibilität mit meinen alten Projekten und Delphi 2009 wieder deaktivieren müssen - mein Delphi 2009 Professional brauche ich schon allein aus Lizenzgründen, und das verträgt sich leider nicht mit dem Delphi Berlin - und bin noch nicht dazugekommen, mir das auf einer VM zu installieren.

himitsu 21. Apr 2017 05:54

AW: Felder einer Klasse zur Laufzeit erkennen
 
Das hast du bestimmt falsch verstanden. :angle2:

Tipp: Schau mal in SetName von TComponent. :zwinker:
Die VCL setzt gleichnamige Felder im Owner, wenn man eine Komponente erstellt/löscht/umbenennt.
Darum sind diese Felder auch mit den Objektinstanzen gefüllt, wenn man Komponenten auf die Form pappt.
(die VCL ist nur saudoof, prüft den Typ nicht und es macht Spaß wenn zufällig was ganz Anderes gleich heißt :stupid:)

Tipp2: Schau mal was für Methoden das TObjekt besitzt.

Uwe Raabe 21. Apr 2017 08:09

AW: Felder einer Klasse zur Laufzeit erkennen
 
Zitat:

Zitat von himitsu (Beitrag 1368526)
Die VCL setzt gleichnamige Felder im Owner

... solange diese Felder published sind.

idefix2 21. Apr 2017 11:25

AW: Felder einer Klasse zur Laufzeit erkennen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Genau daran scheitert es ja. In der published Section kann ich ja offenbar keine einfachen Variablen deklarieren.

Mavarik 21. Apr 2017 11:27

AW: Felder einer Klasse zur Laufzeit erkennen
 
Zitat:

Zitat von idefix2 (Beitrag 1368560)
Genau daran scheitert es ja. In der published Section kann ich ja offenbar keine einfachen Variablen deklarieren.

Getter und Setter!

nahpets 21. Apr 2017 11:39

AW: Felder einer Klasse zur Laufzeit erkennen
 
Das was Du da machst gehört nach private.

Bei published steht dann sowas in der Art:
Delphi-Quellcode:
published
  property s1 : String read fs1 write fs1;
  property i1 : Integer read fi1 write SetI1;
  property r1 : Real read GetR1 write SetR1;
Die entsprechenden Getter und Setter müssen dann auch noch implementiert werden.

Was Du wo benötigst, ist von der Aufgabe abhängig, hier im Beispiel stehen halt nur ein paar Möglichkeiten zur Implementierung.

Wenn die Propertys nicht im Objektinspektor zu sehen sein müssen, können sie auch im Abschnitt public stehen. Auch dort sind sie über RTTI auffindbar und ausles- bzw. beschreibbar.

Olli73 21. Apr 2017 12:02

AW: Felder einer Klasse zur Laufzeit erkennen
 
Zitat:

Zitat von idefix2 (Beitrag 1368560)
Genau daran scheitert es ja. In der published Section kann ich ja offenbar keine einfachen Variablen deklarieren.

Funktioniert es denn nicht mit Properties?

(Edit: Hatte übersehen, dass es auf Seite 2 schon Antworten dazu gab.)

idefix2 21. Apr 2017 12:43

AW: Felder einer Klasse zur Laufzeit erkennen
 
Zitat:

Zitat von Olli73 (Beitrag 1368570)
Funktioniert es denn nicht mit Properties?

Zitat:

Zitat von idefix2 (Beitrag 1368523)
Danke, ich werde mich jetzt etwas damit spielen.
So, wie ich das verstanden habe, kann man damit zur Laufzeit nur Property-Namen und Eigenschaften, aber nicht die Namen und Eigenschaften von Feldern herausfinden.

:roll:



Zitat:

Zitat von nahpets (Beitrag 1368565)
Bei published steht dann sowas in der Art:
Delphi-Quellcode:
published
  property s1 : String read fs1 write fs1;
  property i1 : Integer read fi1 write SetI1;
  property r1 : Real read GetR1 write SetR1;
Die entsprechenden Getter und Setter müssen dann auch noch implementiert werden.

Was Du wo benötigst, ist von der Aufgabe abhängig, hier im Beispiel stehen halt nur ein paar Möglichkeiten zur Implementierung.

Das ist mir schon klar. Nur wozu das ganze Gedöns mit private Variablen und pubished properties gut sein soll, wenn keine Getter und Setter verwendet werden (und von der Aufgabenstellung her auch in Zukunft nicht nötig sein werden), erschließt sich mir nicht. Es gibt sicher Situationen, in denen das sinnvoll ist, aber dass es nicht direkt geht, ist eher lästig.

Zitat:

Zitat von nahpets (Beitrag 1368565)
Wenn die Propertys nicht im Objektinspektor zu sehen sein müssen, können sie auch im Abschnitt public stehen. Auch dort sind sie über RTTI auffindbar und ausles- bzw. beschreibbar.

Mit RTTI vielleicht, in Delphi 2009 geht das aber offenbar nicht. Da finde ich nur die published properties.


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