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 ?