Einzelnen Beitrag anzeigen

Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.016 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#4

AW: RTTI und Array of Record

  Alt 4. Apr 2017, 16:47
Ohne Anspruch auf Vollständigkeit, Fehlerfreiheit oder besondere Performance:

Delphi-Quellcode:
procedure FinalizeInstance(p: Pointer; typeInfo: PTypeInfo);
var
  ctx: TRttiContext;
  f: TRttiField;
  fieldType: TRttiType;
  i: Integer;
  arrayType: TRttiArrayType;
  elementType: TRttiType;
  obj: ^TObject;
begin
  for f in ctx.GetType(typeInfo).GetDeclaredFields do
  begin
    fieldType := f.FieldType;
    case fieldType.TypeKind of
      tkRecord:
      begin
        FinalizeInstance(Pointer(PByte(p) + f.Offset), fieldType.Handle);
        FinalizeRecord(Pointer(PByte(p) + f.Offset), fieldType.Handle);
      end;
      tkArray:
      begin
        arrayType := TRttiArrayType(fieldType);
        elementType := arrayType.ElementType;
        // handle only one dim
        for i := 0 to arrayType.TotalElementCount - 1 do
          FinalizeInstance(Pointer(PByte(p) + f.Offset + (i * elementType.TypeSize)), elementType.Handle);
      end;
      tkClass:
      begin
        obj := Pointer(PByte(p) + f.Offset);
        FreeAndNil(obj^);
      end;
    end;
  end;
end;
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight

Geändert von Stevie ( 4. Apr 2017 um 16:52 Uhr)
  Mit Zitat antworten Zitat