![]() |
ClassInfo = nil ? o.O
Hi,
Was ich gerade gemerkt hab: TObject.ClassInfo = nil :shock: Und auch das ist auch bei manchen von TObject abgeleiteten Klassen so, z.B bei TList (sowei ich das weiß) und auch dummerweise bei allen Sprites ((TSprite = class, TImageSprite = class(TSprite)) = nil :| Aber ich brauch das o.O Dringend! :| Was ist da los? Ist der Pointer "nur" falsch oder haben diese Klassen aus irgendeinem Grund kein ClassInfo?
Delphi-Quellcode:
Was ich festgestellt habe ist das Integer(TObject) jedesmal eine andere Zahl liefert o.O Im Gegensatz zu allen anderen Klassen. Aber bei TList und TSprite sind die Zahlen konstant aber es klappt trotzdem nicht.. Also TSprite.ClassInfo = nil :(
class function TObject.ClassInfo: Pointer;
begin Result := PPointer(Integer(Self) + vmtTypeInfo)^; end; Was ist das und was mache ich da am besten? Kann man da was machen? :| ADD: Hab auch aus Verzweiflung mal statt vmtTypeInfo +/- irgendwelche zahlen gemacht.. aber immer AV.. dann hab ich mir die Zahlen geben lassen bei der es keine AV gibt (try-except) und hab die ausprobiert.. Aber an der Adresse ist vielleicht irgendwas.. Aber kein Classinfo -.-^^ Gruß Neutral General |
Re: ClassInfo = nil ? o.O
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe gerade kein Delphi hier, aber mit der Unit hole ich mir normalerweise MetaClasses/VMT.
Delphi-Quellcode:
Oki, hab's gerade wieder installiert ( wurde auch Zeit :love: ) und wie ich es mir dachte gates. ;-)
unit uRttiHelpers;
interface type PClass = ^TClass; PSafeCallException = function(self : TObject; exceptObject : TObject; exceptAddr : Pointer) : HResult; PAfterConstruction = procedure(self : TObject); PBeforeDestruction = procedure(self : TObject); PDispatch = procedure(self : TObject; var message); PDefaultHandler = procedure(self : TObject; var message); PNewInstance = function(self : TClass) : TObject; PFreeInstance = procedure(self : TObject); PDestroy = procedure(self : TObject; outerMost : Shortint); PVmt = ^TVmt; TVmt = packed record SelfPtr : TClass; IntfTable : Pointer; AutoTable : Pointer; InitTable : Pointer; TypeInfo : Pointer; FieldTable : Pointer; MethodTable : Pointer; DynamicTable : Pointer; ClassName : PShortString; InstanceSize : PLongint; Parent : PClass; SafeCallException : PSafeCallException; AfterConstruction : PAfterConstruction; BeforeDestruction : PBeforeDestruction; Dispatch : PDispatch; DefaultHandler : PDefaultHandler; NewInstance : PNewInstance; FreeInstance : PFreeInstance; Destroy : PDestroy; end; function GetVmt(classReference : TClass) : PVmt; implementation function GetVmt(classReference : TClass) : PVmt; begin Result := PVmt(classReference); Dec(Result); end; end. edit: lol, mein Copy and Waste Knopf muss wohl kaputt sein :lol: |
Re: ClassInfo = nil ? o.O
Ok danke :)
Das würde mir glaub ich auch helfen aber ich benutze die Unit TypInfo.pas und die procedure GetPropList... Und intern wird da auf Classinfo zugegriffen.. :| |
Re: ClassInfo = nil ? o.O
Zitat:
Alle class methods aus TObjects liegen ja praktisch gesehen *vor* dem Index der ersten Methode. Und TObject hat praktisch gesehen keine Felder (bis auf den Zeiger zur VMT). Bei TObject weißt du ja von vornherein dass da nix rauskommt. ;) |
Re: ClassInfo = nil ? o.O
Zitat:
|
Re: ClassInfo = nil ? o.O
Wodurch wird das bestimmt? Compiler Magic? Oder gibt es dafür eine Direktive?
|
Re: ClassInfo = nil ? o.O
Durch published-Member.
|
Re: ClassInfo = nil ? o.O
Delphi-Quellcode:
{$M+}
TPersistent = class(TObject) [...] |
Re: ClassInfo = nil ? o.O
Zitat:
RTTI ist ein Relikt aus dem Compile run. Im daran zu kommen gibt es zwei Lösungen. Wenn du volle "Gewalt" über den typen hast geht es einfach so wie es TPersistent macht:
Delphi-Quellcode:
Dadurch kannst ClassInfo benutzen.
{$M+}
type blabla = class end; {$M-} Die andere Möglichkeit um an die Infos zu kommen ist die Funktion TypeInfo, die einen Pointer auf TTypeinfo liefert. Damit kannst du ebenfalls GetPropList füttern. |
Re: ClassInfo = nil ? o.O
Kurze Frage: Wozu kann man das alles sinnvoll benutzen?
Gruß, Christoph |
Re: ClassInfo = nil ? o.O
Zitat:
RTTI lässt dich Properties und EMthoden einer Klasse auslesem. Du könntest dir also eine DataSetableitung bauen, die ein ObjectList verwaltet und die Eigenschaften der Itemklasse als Spalten zur Verfügung stellt. Das Delphi streaming system erlaubt es der IDE eine Instanz eines DataModules, Frames, oder Forms in ene DFM-Datei zu speichern oder auszulesen. Wenn du mal hier in der CodeLib nach dpCollection suchst, findest du eine Classe die dir das mit deinen Objekten ermöglicht. RTTI ermögicht dich hauptsächlich dass dein Code mit Typen arbeiten kann, die er zur Compilezeit gar nicht kannte. |
Re: ClassInfo = nil ? o.O
Delphi-Quellcode:
Genial :) Danke :thumb:
{$M+}
... {$M-} Gruß Neutral General |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:01 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz