Thema: Delphi Generisches Typecasting?

Einzelnen Beitrag anzeigen

Muetze1
(Gast)

n/a Beiträge
 
#13

Re: Generisches Typecasting?

  Alt 9. Sep 2004, 09:39
Moin!

Zitat von Stevie:
Nun, es gibt in der RTTL doch die Möglichkeit dynamisch die published Elemente dynamisch auszulesen, gell?
Mit den RTTI Informationen kannst du zur Laufzeit published Properties finden und "bearbeiten" - richtig. Bei deinem TypeCast müssten aber die RTTI Informationen Informationen für alle Methoden ausser private haben - die gibt es nicht und daher sind die Methoden schlecht zu finden in der Laufzeit.

Zitat von Stevie:
Und für Libraries gibt es die Möglichkeit dynamisch irgendwelche Funktionen zu laden und auszuführen.
Die DLL's haben eine Tabelle wo der Name und/oder Index zu der Funktion drinne steht und anhand der Informationen wie auch die ganzen Relocation Informationen kann der Code Teil geladen, angepasst und ausgeführt werden. Diese Informationen fehlen einem auch hier wiederrum.

Zitat von Stevie:
Dann könnte es doch auch möglich sein, anhand der Klasseninformation eine Funktion zu finden und auzuführen, oder?
Welche Klasseninformationen? Den Klassennamen kann man ja noch ohne Probleme rausfinden - da bietet dir ja TObject schon die Methode ClassName an, aber es werden keine Informationen vorgehalten über alle Methoden in der Klasse (bis auf die private Methoden) wie schon oben gesagt, daher hat man wenig Chancen. Und der Compiler wird bestimmt nicht über alle in dem Programm verwendeten Klassen eine Sprungtabelle aufbauen mit den Offsets zu alles möglichen Methoden und deren Namen.

Zitat von Stevie:
Es ist ja schließlich auch möglich dynamisch irgendwelche Klassen zu erstellen, wenn sie registriert sind.
Das ist doch wieder was anderes: Dort wird doch nur eine MetaClass angelegt die die Klassen aufnehmen und somit könnten sie ja instanziiert werden. Das Problem ist hierbei aber das gleiche wie bei dir: Es können von den so instanziierten Instanzen nur die Methoden aufgerufen werden, die auch die Basis-Metaklasse auch kennt. D.h. wenn die Basis MetaKlasse von TObject stammt (Class Of TObject), dann kannst du dort kein Perform in den über den Weg instanziierten Instanzen aufrufen ohne Spezialisierung über einen speziellen (zur Compile Zeit schon definierten) TypeCast. Wenn du nun aber die Metaklasse vom Typ TWinControl aufbaust (Class Of TWinControl), dann kennen auch die Instanzen eine Methode Perform ohne Spezialisierung über einen direkten TypeCast. (Ich gehe davon aus, das Perform public ist ab TWinControl - dahingehend habe ich nicht nachgeschaut ob dem so ist).

Im Endeffekt ist es so, das bei allen deinen Beispielen extra dafür Vorkehrungen getroffen wurden damit dies möglich wird, nicht aber in dem Fall wo du die Informationen suchst.

@Maximov: Der o.g. Code sollte beim Aufruf eigentlich gut in die Hose gehen, da die Aufrufparameter fehlen und dadurch der Stack schiefer hängen sollte als der Haussegen.

MfG
Muetze1
  Mit Zitat antworten Zitat