{$MODE OBJFPC} { -*- text -*- } {$LONGSTRINGS ON} {$POINTERMATH OFF} // compiled with: fpc test.pas -dDEBUG -Co -Cr -CR -Ct -O- -g -gt -gl -gh -Sa -veiwnhb program test; uses typinfo; type TArrayOfString = array of AnsiString; {$TYPEINFO ON} TTest = class published property Foo: TArrayOfString; end; {$TYPEINFO OFF} var TypeInfo: PTypeInfo; TypeData, ArrayPropTypeData: PTypeData; PropertyList: PPropList; begin TypeInfo := TTest.ClassInfo; Writeln(TypeInfo^.Kind = tkClass); TypeData := GetTypeData(TypeInfo); Writeln(TypeData^.PropCount = 1); GetMem(PropertyList, TypeData^.PropCount * SizeOf(Pointer)); GetPropInfos(TypeInfo, PropertyList); Writeln(PropertyList^[0]^.PropType^.Kind = tkDynArray); ArrayPropTypeData := GetTypeData(PropertyList^[0]^.PropType); // the following line is what you would expect to work given the type definitions: Writeln(ArrayPropTypeData^.elType2^^.Kind = tkAString); // actually throws EAccessViolation // the following line actually does work, even though it's casting the PPTypeInfo to just PTypeInfo: Writeln(PTypeInfo(ArrayPropTypeData^.elType2)^.Kind = tkAString); // True (should throw an EAccessViolation or do something random) FreeMem(PropertyList); end.