AGB  ·  Datenschutz  ·  Impressum  







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

Records und RTTI?

Ein Thema von 3_of_8 · begonnen am 4. Aug 2006 · letzter Beitrag vom 16. Feb 2009
Antwort Antwort
Seite 1 von 3  1 23      
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#1

Records und RTTI?

  Alt 4. Aug 2006, 01:26
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.
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
Benutzerbild von JasonDX
JasonDX
(CodeLib-Manager)

Registriert seit: 5. Aug 2004
Ort: München
1.062 Beiträge
 
#2

Re: Records und RTTI?

  Alt 4. Aug 2006, 06:22
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:
h = packed record
  i: integer;
  s: smallint;
end;

var
  m: h;

m.i := 0;
m.s := 1;
gibt
Code:
xor eax, eax
mov [m], eax
mov word ptr [m + $4], $0001
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.
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
Mike
Passion is no replacement for reason
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Records und RTTI?

  Alt 4. Aug 2006, 11:28
Den Offset kriege ich praktisch mit:
Delphi-Quellcode:
function GetOffset(var rec, recvar): Integer;
asm
sub edx, eax
mov eax, edx
end;
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#4

Re: Records und RTTI?

  Alt 4. Aug 2006, 12:25
Zitat von JasonDX:
afaik besitzt ein Record keinen.
nicht?

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;
$2B or not $2B
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#5

Re: Records und RTTI?

  Alt 4. Aug 2006, 12:34
Zitat von himitsu:
Zitat von JasonDX:
afaik besitzt ein Record keinen.
nicht?
Ein Record besitzt sehr wohl eine RTTI. Jedoch nur wenn er Datentypen enthält, die eine Finalisierung benötigen.
  Mit Zitat antworten Zitat
Benutzerbild von JasonDX
JasonDX
(CodeLib-Manager)

Registriert seit: 5. Aug 2004
Ort: München
1.062 Beiträge
 
#6

Re: Records und RTTI?

  Alt 4. Aug 2006, 12:42
Zitat von jbg:
Ein Record besitzt sehr wohl eine RTTI. Jedoch nur wenn er Datentypen enthält, die eine Finalisierung benötigen.
Oha Wie heissts so schoen: wenn man keine Ahnung hat
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
Mike
Passion is no replacement for reason
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#7

Re: Records und RTTI?

  Alt 4. Aug 2006, 12:48
Zitat von JasonDX:
Kann ich auf diese TypeInfo auch zugreifen?
Wenn eine existiert: Ja.

Zitat:
Wenn ich mich nicht ganz verschaut hab, dann wird in der TypInfo-Unit alles ueber TObject gehandhabt.
Dem ist so.

Zitat:
Geht das (und wenn, wie) auch bei dementsprechenden Records?
Nicht mit den Infos aus der TypInfo.pas.

Die notwendigen Datentypen findest du in der System.pas direkt über _InitializeRecord(). Und _InitializeRecord() zeigt dir, wie du die den RTTI-Zeiger ermitteln kannst.
  Mit Zitat antworten Zitat
Benutzerbild von stoxx
stoxx

Registriert seit: 13. Aug 2003
1.111 Beiträge
 
#8

Re: Records und RTTI?

  Alt 13. Feb 2009, 01:49
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
ähm .. und wie geht das da mit InitializeRecord? *guck*

Phantasie ist etwas, was sich manche Leute gar nicht vorstellen können.
  Mit Zitat antworten Zitat
Benutzerbild von stoxx
stoxx

Registriert seit: 13. Aug 2003
1.111 Beiträge
 
#9

Re: Records und RTTI?

  Alt 13. Feb 2009, 02:14
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;
Phantasie ist etwas, was sich manche Leute gar nicht vorstellen können.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#10

Re: Records und RTTI?

  Alt 13. Feb 2009, 08:13
Ein Beitrag von mir in der Codelib nutzt die RTTI der Records umd diese in einem Stream zu speichern.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 09:27 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