Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Objekte zur Laufzeit inspizieren ( a la BlueJ ) (https://www.delphipraxis.net/78581-objekte-zur-laufzeit-inspizieren-la-bluej.html)

math65 7. Okt 2006 00:59


Objekte zur Laufzeit inspizieren ( a la BlueJ )
 
Ich würde gerne eine Delphi-Umgebung in der Art von BlueJ entwickeln, in der zur Laufzeit interaktiv zu allen definierten (eigenen!) Klassen
- Objekte erzeugt werden können
- deren Eigenschaften mit aktuellen Werten inspiziert werden können
- deren Methoden gesehen und aktiviert werden können.

Und das Ganze so, dass die selbst definierten Klassen keinen eigenen Verwaltungs-Overhead (kein spezialisiertes Create) benötigen.

Geht so etwas in Delphi?
Kann ich zur Laufzeit irgendwo eine Liste aller definierten (compilierten) Klassen finden?

Hilfe wäre klasse...!

Bernhard Geyer 7. Okt 2006 05:45

Re: Objekte zur Laufzeit inspizieren ( a la BlueJ )
 
Sicherlich gibt es sowas. Die IDE macht es ja genauso. Die einzige Hilfe die es bekommt ist die Register-Procedure in Packages. Das einige was nicht geht wird sein das du nicht so einfach Methoden aufrufen kannst, da diese nicht per RTTI bestimmbar sind.

Da sind wir beim Thema RTTI. Über RTTI (Runtime Type Information) kannst Du dir alle (published) Eigenschaften und Methoden (Normalerweise werden Methoden nicht published, aber das DUnit-Testframework macht sowas) auslesen. Du kannst ja dort mal nachschauen was die alles aus den RTTI-Infos machen. Komponenten um die Eigenschaften zu inspizieren gibt es z.B. bei der Jedi oder im ElPack.

DP-Maintenance 7. Okt 2006 10:50

DP-Maintenance
 
Dieses Thema wurde von "Matze" von "Neuen Beitrag zur Code-Library hinzufügen" nach "Sonstige Fragen zu Delphi" verschoben.
In die Code-Library gehören nur fertige Code-Snippets.

math65 18. Okt 2006 01:10

Re: Objekte zur Laufzeit inspizieren ( a la BlueJ )
 
Danke, Bernhard!

Nur... die Sache ist nicht so leicht...!
Die DUnit erscheint schrecklich kompliziert,
bei JEDI hab ich nichts passendes gefunden,
und ElPack kenn ich nicht.

Vielleicht ein Beispiel für mein Anliegen:

Ich hab eine Klasse definiert:

TAuto = class(Tpersistent)
private nr: string;
private ps: integer;

procedure fahre(s: real);
procedure bremse(s: real);
end;

Würde dann gern ein Auto-Objekt erzeugen...

var auto: TAuto;
begin
auto := TAuto.Create;

... und dann i r g e n d w i e (?) herausfinden/anzeigen können, welche Datenfelder und welche Methoden dieses Auto nun hat.
Die Zeile:

edit1.Text := inttostr(auto.getinterfacetable.EntryCount);

wird zwar vom Compiler akzeptiert, liefert aber einen Laufzeitfehler (Zugriffsverletzung, Lesen von Adresse 0 ).
Sonstige nützliche/informative Prozeduren oder Funktionen hab ich bislang nicht gefunden -
bin ein wenig gefrustet...

Gibt es bzw. hast Du hierfür Hilfe???



Und als weiteres Problem: Wie könnte ich eine Methode aufrufen, von der erst zur Laufzeit (!) bekannt ist, wie sie heisst, und zwar in Form einer String-Variable??
Z.B. hätte ich:

objekt, methode: string;

Wunsch: Ausführen per ...?(objekt). ...?(methode)


Ist diese Sache prinzipiell unmöglich, weil Delphi eine Compilersprache ist und daher eine (dynamische) Interpretation von Befehlen nicht realisierbar ist???


Schöne Grüße

math65

jfheins 18. Okt 2006 19:26

Re: Objekte zur Laufzeit inspizieren ( a la BlueJ )
 
Zitat:

Zitat von math65
Danke, Bernhard!

Nur... die Sache ist nicht so leicht...!
...
bei JEDI hab ich nichts passendes gefunden,

Hmm ... also bei meinen Jedis ist ein TJvInspector dabei, der genau das machen sollte, was du willst ...


Zitat:

Und als weiteres Problem: Wie könnte ich eine Methode aufrufen, von der erst zur Laufzeit (!) bekannt ist, wie sie heisst, und zwar in Form einer String-Variable??
Z.B. hätte ich:

objekt, methode: string;

Wunsch: Ausführen per ...?(objekt). ...?(methode)


Ist diese Sache prinzipiell unmöglich, weil Delphi eine Compilersprache ist und daher eine (dynamische) Interpretation von Befehlen nicht realisierbar ist???


Schöne Grüße

math65
Ich glaube, das geht nicht:
Zitat:

Zitat von Bernhard Geyer
Das einige was nicht geht wird sein das du nicht so einfach Methoden aufrufen kannst, da diese nicht per RTTI bestimmbar sind.

;)

Hawkeye219 18. Okt 2006 20:01

Re: Objekte zur Laufzeit inspizieren ( a la BlueJ )
 
Willkommen in der Delphi PRAXiS, math65!

Einfach wird es bestimmt nicht, aber du kannst dich ja mal einlesen:

Hallvard's Blog - Extended Class RTTI

Hallvard's Blog - Published methods
Hallvard's Blog - Under the hood of published methods
Hallvard's Blog - Hack #10: Getting the parameters of published methods

David Glassborow - Interface RTTI
David Glassborow - Class RTTI

Offenbar gibt es Möglichkeiten, getestet habe ich sie allerdings nicht.

Gruß Hawkeye

Bernhard Geyer 18. Okt 2006 22:29

Re: Objekte zur Laufzeit inspizieren ( a la BlueJ )
 
Die $METHODINFO und $TYPEINFO Compilerschalter sind mir neu. Aber gut zu wissen das es sowas auch für Win32 in Delphi gibt. Evtl. ergeben sich damit einige Möglichkeiten ...

_frank_ 19. Okt 2006 13:23

Re: Objekte zur Laufzeit inspizieren ( a la BlueJ )
 
evtl. nützt es dir etwas, wenn du dir den Quellcode vom DFMEdit anschaust, da ist ziemlich viel RTTI verbaut.
Jedoch gibt es imho keine Möglichkeit, die registrierten Klassen sinnvoll zu enumerieren. Die Objektliste wird beim DFMedit mithilfe einer INI-Datei erstellt.

HTH
Frank


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