Einzelnen Beitrag anzeigen

Benutzerbild von MyRealName
MyRealName

Registriert seit: 19. Okt 2003
Ort: Heilbronn
673 Beiträge
 
Delphi 10.4 Sydney
 
#1

RTTI und ShortString in records...

  Alt 8. Mai 2023, 17:03
Ich versuche gerade, records in einer Liste durch RTTI in Datenbankfelder und -register zu verwandeln. Dazu will ich die genutzten records dynamisch über RTTI auslesen, ein Memory-Dataset nutzen um die Felder anzulegen und dann das Dataset mit den Daten aus den records füllen.
Jetzt habe ich das Problem, dass im Falle von ShortStrings in den records kein FieldType existiert, das Feld ist da immer nil...

Bei der Ausgabe die man, dass zwar das Feld MiddleName erkannt wird, aber keinen FieldType zugewisen bekommt.


Code:
program Project4;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils, System.Rtti, System.TypInfo, System.Generics.Collections;

type
  TSampleRec = packed record
    Id: Integer;
    FirstName: String;
    LastName: String;
    MiddleName: String[125];
    Sex: Char;
    IsActive: Boolean;
  end;

procedure RTTI_AnalyzeRecord(ATypeInfo: Pointer);
var
  ctx      : TRttiContext;
  lType    : TRttiType;
  lField   : TRttiField;
begin
  ctx      := TRttiContext.Create;
  if not Assigned(ATypeInfo) then
    exit;
  lType:=ctx.GetType(ATypeInfo);
  if not Assigned(lType) then
    exit;
  for lField in lType.GetFields do
  begin
    if Not Assigned(lField.FieldType) then
    begin
      WriteLn(Format('%-20s:%s;',[lField.Name,'Unknown']));
    end else
      WriteLn(Format('%-20s:%s;',[lField.Name,lField.FieldType.Name]));
  end;
end;

begin
  try
    RTTI_AnalyzeRecord(TypeInfo(TSampleRec));
    Readln;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.
Frage : Wie komme ich an den Typ (ShortString) und dessen Länge (in dem Fall 125) ran ?
  Mit Zitat antworten Zitat