Kurz mal die
RTTI bemüht:
(…)
Kleiner Nachtrag: Hierbei wird der Fall vergessen wenn das letzte Feld im Record noch Padding hat. Nach der
for
-Schleife muss man noch einmal den Wert von offset mit
t.TypeSize
vergleichen. Die Differenz davon sind die letzten Padding-Bytes.
Mein "fillPaddingBytes" sähe dann so aus:
Delphi-Quellcode:
procedure TMyStructHelper.fillPaddingBytes(const pattern: Byte);
var
ctx: TRttiContext;
rttiType: TRttiType;
field: TRttiField;
offset: Integer;
rawMemory: PByte;
index: NativeInt;
begin
rttiType := ctx.GetType( TypeInfo(TMyStruct) );
offset := 0;
rawMemory := @self;
for field in rttiType.GetFields() do
begin
case field.offset - offset of
0: ;
1: rawMemory[offset] := pattern;
else
for index := offset to Pred(field.Offset) do
rawMemory[index] := pattern;
end;
offset := field.offset + field.FieldType.TypeSize;
end;
for index := offset to Pred(rttiType.TypeSize) do
rawMemory[index] := pattern;
end;