AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

mit string an PTypeinfo rankommen

Ein Thema von _frank_ · begonnen am 27. Apr 2006 · letzter Beitrag vom 27. Apr 2006
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von _frank_
_frank_

Registriert seit: 21. Feb 2003
Ort: Plauen / Bamberg
922 Beiträge
 
Delphi 3 Professional
 
#11

Re: mit string an PTypeinfo rankommen

  Alt 27. Apr 2006, 17:43
mhm...hatte es vorhin in nem fertigen Programm als zusatzmodul probiert...keine DLL, nur ein button und ne editbox

habs mal in ne neue Anwendung rein, da gehts...ma sehen, worans lag...

hab noch nicht mit Packages gearbeitet (denk ich).

gibt es noch eine enumeration der registrierten klassen?

definiere massig klassen per registerClasses um Sie per getClass zu finden. Momentan hab ich noch eine Separate Stringlist, um diese Klassen (TComponent) in eine Combobox zu bekommen.

Gruß Frank
Frank Wunderlich
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#12

Re: mit string an PTypeinfo rankommen

  Alt 27. Apr 2006, 18:14
Zitat:
gibt es noch eine enumeration der registrierten klassen?
Du hast es schon gesagt: RegisterClass() und GetClass() sind die Wege die die Borlandianer vorgesehen haben. Allerdings hast du natürlich mit EnumTypeInfo() nun Zugriff auf alle RTTI aller geladenen Module und ergo auch auf alle Klassen die in der Anwednung verwendet werden. Also nicht nur diejenigen die mit RegisterClass() registriert worden, sondern als ALLE. Auch diejenigen die private sind und in einer normalen Anwendung garnicht Unitübergreifend angesprochen werden können.

Eine RTTI wird erzeugt für JEDEN deklarierten Typ der im Delphi Source deklariert wurde und auch duch die Anwednung tatsälchich benutzt wurde. Das umfast Sets, Mengen, ordinale Typen wie Char/Integer, komplexe Typen with TMethod, TClass, TObject, Komponenten und sogar Interfaces.

Die einzisgte Ausnahme wären lokale Typen die lokal in einer Prozedur/Funktion deklariert wurden.

Mit EnumTypeInfo() kannst du mit ATypeInfo.Kind = tkClass und mit nach folgendem GetTypData(ATypeInfo).ClassType die TClass einer TypInfo in Erfahrung bringen. Du kannst also EnumTypeInfo() so umbauen das sie das gleiche wie GetClass() macht aber OHNE mit RegisterClass() und eigener Liste zu arbeiten.

Allerdings, aus Gründen der Portierbarkeit und Anwendungssicherheit würde ich eben eine eigene RegisterClass() Funktionalität der EnumTypeInfo() vorziehen. Eben weil EnumTypeInfo() auf ein Verhalten des Compilers/Linkers beruht das nicht nur undokumentiert ist sondern sogar Borland unbekannt scheint. Das heist aber nun auch nicht das man EnumTypeInfo() verteufeln sollte denn nach meinen Erfahrungen hat sich seit Delphi 2 rein garnischts an der Funktion von EnumTypeInfo() verändert. Heist also EnumTypeInfo() läuft sehr stabil mit allen Delphi/BCB Versionen und wird es meiner Meinung nach auch so lange beiben bis wir einen komplett neuen Compiler/Linker samt VCL erleben. Die Veränderungen der RTTI im Compiler dürften so gravierend sein das es ein komplett neuer Compiler wäre. Immerhin sind die RTTIs quasi Übereste von Datenstrukturen die der Compiler selber während des Compilierungsprozeses benötiggt und erzeugt. Ähnliche, ja fast sogar identische, Datenstrukturen wird man in DCU und den DSM Dateien wiederfinden. Übertragen findet man dies auch bei den Packages und den DCP Dateien.

Gruß Hagen
  Mit Zitat antworten Zitat
Benutzerbild von _frank_
_frank_

Registriert seit: 21. Feb 2003
Ort: Plauen / Bamberg
922 Beiträge
 
Delphi 3 Professional
 
#13

Re: mit string an PTypeinfo rankommen

  Alt 27. Apr 2006, 18:23
ähm, ich glaube, du hast mich falsch verstanden.
ich brauche ne liste der Komponenten, die registriert sind und keine Unterklassen/Strukturen. die enum-funktionen brauchen aber alle ein PTypeInfo, aber ich brauche die oberste Ebene. es soll also folgendes herauskommen:

TButton
TEdit
TImagelist
TMemo
...

naja, umbasteln ist so ne Sache, ich nutze die rtti nur, aber so richtig tiefgründig verstehen tu ich sie nicht (ist mehr nachschauen, welche typen gebraucht werden und probieren) ;>
die Datensegmentpatches, die dahinterstehen sind mir ein Rätsel.

Gruß Frank
Frank Wunderlich
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#14

Re: mit string an PTypeinfo rankommen

  Alt 27. Apr 2006, 22:07
An die interne Liste die in RegisterClass() benutzt wird kommst du nicht in jeder Delphi Version, soviel ich weis.
Du kannst im grunde nur mit RegisterClass() Klassen dort hinzufügen und mit GetClass() nachfragen ob eine Klasse registriert wurde. Man könnte per Tricks an diese globale Variable herankommen, das geht mit absoluter Sicherheit. Das wäre dann aber von der Delphi Version abhängig.

Allerdings was brauchst du ?
So wie ich dich zwischen den Zeilen verstanden habe suchst du "TopLevel" Komponenten, also die Komponenten die keine weiteren Descands besitzen. Auch das lässt sich mit EnumTypeInfo() bewerkstelligen.

Als erstes mit EnumTypeInfo() eine Liste aller Klassen erzeugen die von TComponent abstammen. Danach müssen aus dieser Liste alle Klassen rausgefiltert werden die selber eine Vorfahrklasse der gefundenen Klassen in dieser List sind.

Zb. wird diese Liste auch TEdit und TCustomEdit enthalten. TEdit ist gesucht und ein Nachfahre von TCustomEdit. TCustomEdit ist eine abstrakte Vorfahrklasse und besitzt TEdit als Nachfahre in der Liste. Also wird TCustomEdit durch Ausschlußverfahren über TEdit aus der Liste rausgeschmissen.
Übrig bleibt eine Liste alle Klassen der Anwendung die abgeleitet sind von TComponent und keine Nachfahren besitzen.

Fragt sich nur was du damit weiter anfangen möchtest. Denn die Hauptaufgabe von RegisterClasses() und GetClass() ist einzigst das Mapping einen Klassennamens als String in eine TClass = Zeiger auf die VMT einer Klasse und indirekt ein Zeiger auf die RTTI. D.h. die reine Funktionalität von RegisterClasses(), GetClass() kannst du 1 zu 1 auch mit EnumTypeInfo() erreichen, ohne Speicherlisten etc.pp.

Gruß Hagen
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 23:45 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