Einzelnen Beitrag anzeigen

mytbo

Registriert seit: 8. Jan 2007
472 Beiträge
 
#6

AW: RTTI und ShortString in records...

  Alt 9. Mai 2023, 17:38
Also das Geheimrezept ist also, dass man in Records keine String[125] direkt nutzt, sondern die als Typ z.B. TString125 anlegt und diesen typ dann im Record nutzt...
Vielen Dank, hätte ich jetzt so nicht erwartet, aber naja..
Du kannst nur die Runtime Type Information(en) verwenden, die vorhanden sind. Ein Feld String[125] hat keine. Wie die Struktur der RTTI Daten für ein Record aussieht, lässt sich beim Durchsteppen der Funktion TRttiInfo.RecordAllFields erkennen:
Delphi-Quellcode:
uses
  System.Rtti,
  System.TypInfo,
  mormot.core.base,
  mormot.core.rtti;
  
type
  TString125 = String[125];
  
  TSampleRec = packed record
    Id: Integer;
    FirstName: String;
    LastName: String;
    MiddleName: TString125;
    Sex: Char;
    IsActive: Boolean;
  end;
  
begin
  ShowMessage(GetTypeName(TypeInfo(TString125)));
  ShowMessage(GetTypeData(TypeInfo(TString125)).MaxLength.ToString);
  
  ShowMessage(GetTypeName(TypeInfo(TSampleRec)));
  ShowMessage(GetTypeData(TypeInfo(TSampleRec)).elSize.ToString);
  ShowMessage(GetTypeData(TypeInfo(TSampleRec)).RecSize.ToString);
  ShowMessage(GetTypeData(TypeInfo(TSampleRec)).ManagedFldCount.ToString);

  var info: PRttiInfo := TypeInfo(TSampleRec);
  var recSize: Integer;
  for var recField: TRttiRecordAllField in info.RecordAllFields(recSize) do
  begin
    ShowMessage(Format('Offset: %d, FieldName: %s, FieldType: %s, FieldSize: %d', [
      recField.Offset, recField.Name^, recField.TypeInfo.RawName, recField.TypeInfo.RttiSize]));
  end;
  ShowMessage(recSize.ToString);
Bis bald...
Thomas

Geändert von mytbo ( 9. Mai 2023 um 18:00 Uhr)
  Mit Zitat antworten Zitat