![]() |
Records und RTTI?
Morgen.
Mich würde es mal interessieren, inwiefern ein (packed) record einen RTTI Eintrag besitzt und, wenn er einen hat, wie ich ihn auslesen kann. |
Re: Records und RTTI?
afaik besitzt ein Record keinen. Elemente eines Records besitzen lediglich offsets, die wie eine Variable direkt übersetzt werden.
Ein Blick ins CPU-Fenster gibt:
Delphi-Quellcode:
gibt
h = packed record
i: integer; s: smallint; end; var m: h; m.i := 0; m.s := 1;
Code:
Es wird also direkt gesagt: i liegt direkt hinter der Adresse von m. s liegt dann 4 Byte weiter. Ein Record wird so eben auch im Speicher abgebildet, ohne zusätzliche Informationen oder ähnliches.
xor eax, eax
mov [m], eax mov word ptr [m + $4], $0001 Aber wenn man sich die Prozeduren der TypInfo-Unit anguckt, merkt man bald, dass die Zugriffe nicht über Pointer oder ähnliches, sondern über TObject laufen, was darauf schließen lässt, dass der Spaß nur mit Klassen wirklich auch Spaß bringt. ;) greetz Mike |
Re: Records und RTTI?
Den Offset kriege ich praktisch mit:
Delphi-Quellcode:
function GetOffset(var rec, recvar): Integer;
asm sub edx, eax mov eax, edx end; |
Re: Records und RTTI?
Zitat:
aber woher weiß dann alles, daß es hier den String initialisieren und natürlich auch finalisieren muß? Oder wird das dann hardgecodet, also einfach nur überall die Init-/Finalisierung hingeschrieben?
Delphi-Quellcode:
h = {packed or nich} record
i: integer; s: string; end; |
Re: Records und RTTI?
Zitat:
|
Re: Records und RTTI?
Zitat:
Na ja, halbs richtig aber, reicht auch schon fuer die fruehe Uhrzeit *g* Aber mal aus reiner Neugierde: Kann ich auf diese TypeInfo auch zugreifen? Wenn ich mich nicht ganz verschaut hab, dann wird in der TypInfo-Unit alles ueber TObject gehandhabt. Geht das (und wenn, wie) auch bei dementsprechenden Records? greetz Mike |
Re: Records und RTTI?
Zitat:
Zitat:
Zitat:
Die notwendigen Datentypen findest du in der System.pas direkt über _InitializeRecord(). Und _InitializeRecord() zeigt dir, wie du die den RTTI-Zeiger ermitteln kannst. |
Re: Records und RTTI?
Zitat:
:nerd: |
Re: Records und RTTI?
bei diesem Code ist in der PropList nur MyDouble vorhanden.
Wie kann man den Record auch noch regiestrieren? Damit er in die Liste kommt? Hier mal der Code:
Delphi-Quellcode:
uses typinfo; type TMyRecord = record Value1 : Integer; Value2 : Integer; end; TMyClass = class(TPersistent) private FDouble : Double; FMyRecord : TMyRecord; published property MyDouble : Double read FDouble write FDouble; property MyRecord : TMyRecord read FMyRecord write FMyRecord; end; procedure TForm1.btnRTTIClick(Sender: TObject); var i, Count: Integer; PropList: PPropList; s:string; sl : TStringList; myObject : TMyClass; typeInfo : PTypeInfo; begin sl := TStringList.Create; myObject := TMyClass.Create; TypeInfo := myObject.ClassInfo; Count := GetPropList(typeInfo ,tkProperties,nil); GetMem(PropList, Count * SizeOf(PPropInfo)); GetPropList(TypeInfo, tkProperties, PropList); for I := 1 to Count do begin s := PropList^[i - 1].Name; sl.Add(s); end; ShowMessage(sl.Text); FreeMem(PropList); myobject.free; sl.Free; end; |
Re: Records und RTTI?
![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:37 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