Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi ClassInfo = nil ? o.O (https://www.delphipraxis.net/76237-classinfo-%3D-nil-o-o.html)

Neutral General 31. Aug 2006 18:21


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:
class function TObject.ClassInfo: Pointer;
begin
  Result := PPointer(Integer(Self) + vmtTypeInfo)^;
end;
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 :(

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

Elvis 31. Aug 2006 19:27

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:
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.
Oki, hab's gerade wieder installiert ( wurde auch Zeit :love: ) und wie ich es mir dachte gates. ;-)
edit: lol, mein Copy and Waste Knopf muss wohl kaputt sein :lol:

Neutral General 31. Aug 2006 19:39

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.. :|

Elvis 31. Aug 2006 19:44

Re: ClassInfo = nil ? o.O
 
Zitat:

Zitat von Neutral General
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.. :|

Na dann erklär' mir doch was dir eine Classreference bringt ohne dass sie auf irgendetwas zeigt?
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. ;)

jbg 31. Aug 2006 20:30

Re: ClassInfo = nil ? o.O
 
Zitat:

Zitat von Neutral General
Was ich gerade gemerkt hab: TObject.ClassInfo = nil :shock:

TObject ist nicht mit RunTimeTypeInformation kompiliert. TPersistent ist die erste Klasse in der RTL/VCL, die mit RTTI kompiliert ist. Deswegen haben alle TPersistent-Nachkommen eine ClassInfo, aber alles davor eben nicht.

3_of_8 31. Aug 2006 20:35

Re: ClassInfo = nil ? o.O
 
Wodurch wird das bestimmt? Compiler Magic? Oder gibt es dafür eine Direktive?

Dax 31. Aug 2006 20:42

Re: ClassInfo = nil ? o.O
 
Durch published-Member.

Khabarakh 31. Aug 2006 20:47

Re: ClassInfo = nil ? o.O
 
Delphi-Quellcode:
{$M+}

  TPersistent = class(TObject)
  [...]

Elvis 31. Aug 2006 21:39

Re: ClassInfo = nil ? o.O
 
Zitat:

Zitat von 3_of_8
Wodurch wird das bestimmt? Compiler Magic? Oder gibt es dafür eine Direktive?

Beides.
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:
{$M+}
  type blabla = class
  end;
{$M-}
Dadurch kannst ClassInfo benutzen.
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.

pertzschc 31. Aug 2006 23:09

Re: ClassInfo = nil ? o.O
 
Kurze Frage: Wozu kann man das alles sinnvoll benutzen?

Gruß,
Christoph


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:53 Uhr.
Seite 1 von 2  1 2      

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