Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   RTTI im Record Feldlänge (https://www.delphipraxis.net/176591-rtti-im-record-feldlaenge.html)

hanspeter 16. Sep 2013 08:57

RTTI im Record Feldlänge
 
Hallo,

eine etwas kompliziertere Angelegenheit.

Ich möchte aus einem beliebigen Record Asciistrings auslesen und setzen.

Dazu deklariere ich einen Record z.B.
Delphi-Quellcode:
TMyRecord = record
  PLZ : string[6];
  Ort : String[50];
end;
Ich rufe meine Procedure auf mit

Delphi-Quellcode:
Showrec(ImpRec, TypeInfo(TMyRecord) );
ImpRec ist eine Instanz von TMyRecord.

Dann werte ich die Typinformationen aus:

Delphi-Quellcode:
Context := TRttiContext.Create();
  Inf    := context.GetType( typeInf );
  LRecord := Inf.asRecord;
  f := LRecord.GetDeclaredFields;

for i := 0 to High(f) do
     Listbox1.items.Add(f[i].Name + '  : ' + inttostr(f[i].Offset) );
Beim Iterieren durch f bekomme ich Feldnamen und Offset.
Leider aber nicht in der Deklarierungsreihenfolge.

Wie komme ich jetzt an die Stringlänge heran?
Also PLZ = 6 und Ort = 50?

Für einen Tipp dankbar.


Gruß
Peter

Union 16. Sep 2013 11:04

AW: RTTI im Record Feldlänge
 
Da Real48 und string[] keine RttiType Informationen haben, wird das schwierig. Du könntest alle Record-Definitionen mit Attributen versehen. Also:
Delphi-Quellcode:
TMyRecord = record
  [ShortString(6)]
  PLZ : string[6];
  [ShortString(50)]
  Ort : String[50];
end;
Und dann müsstest Du, wenn FieldType des RttiField nil ist, versuchen ob ein solches Attribut vorhanden ist und dieses auslesen.

sx2008 16. Sep 2013 11:09

AW: RTTI im Record Feldlänge
 
Ich würde mir generell ein anderes System überlegen und mich nicht von der RTTI abhängig machen.
Dazu müsste man aber wissen was genau du vorhast und die Hintergründe kennen.

x000x 16. Sep 2013 15:56

AW: RTTI im Record Feldlänge
 
Moin moin,

also theoretisch könntest du ja anhand des Offsets die Länge der Strings berechnen - vermutlich wird bei dir PLZ ein Offset 0 haben und Ort Offset 7. Damit hättest du schon mal die Größe von PLZ.
Offset(Ort) - Offset(Plz) = 7
7 - 1 (1 Byte für die Längeninformation) = 6 = länge des Strings
Und die Größe vom letzten Feld könntest du anhand der Recordgröße - Offest(Ort) - 1 Byte ermitteln...

Aber das sind alles nur Vermutungen.
Wenn - wie Union sagte - keine Informationen über den FieldType bekommst, dann wird das ja so nicht funktionieren wenn noch andere Typen im Record enthalten sind...

Union 16. Sep 2013 17:13

AW: RTTI im Record Feldlänge
 
Zitat:

Zitat von x000x (Beitrag 1228697)
Moin moin,
also theoretisch könntest du ja anhand des Offsets die Länge der Strings berechnen - vermutlich wird bei dir PLZ ein Offset 0 haben und Ort Offset 7. Damit hättest du schon mal die Größe von PLZ.
Offset(Ort) - Offset(Plz) = 7
7 - 1 (1 Byte für die Längeninformation) = 6 = länge des Strings
Und die Größe vom letzten Feld könntest du anhand der Recordgröße - Offest(Ort) - 1 Byte ermitteln...

Das geht leider nur, wenn der Record als packed deklariert ist oder mit {$A-} compilert, weil sonst die Werte ausgerichtet werden und bei 32 bit somit bei der Berechnung über die Offsets um bis zu 3 zu groß sein können - bei einem 64-bit Programm sind das dann 7.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:48 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