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