demortti.pas 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. program DemoRTTI;
  2. uses SysUtils, TypInfo;
  3. type
  4. { TShrimp }
  5. TShrimp = class
  6. private
  7. FSize: integer;
  8. procedure SetSize(const AValue: integer);
  9. published
  10. FName: String;
  11. function GetSize: integer;
  12. procedure SetName(const AValue: String);
  13. property Name: String read FName write SetName;
  14. property Size: integer read GetSize write SetSize;
  15. end;
  16. { TShrimp }
  17. function TShrimp.GetSize: integer;
  18. begin
  19. Result:=FSize;
  20. end;
  21. procedure TShrimp.SetSize(const AValue: integer);
  22. begin
  23. FSize:=AValue;
  24. end;
  25. procedure TShrimp.SetName(const AValue: String);
  26. begin
  27. if FName=AValue then Exit;
  28. FName:=AValue;
  29. end;
  30. procedure ShowFields(TI: TTypeInfoStruct);
  31. var
  32. i: Integer;
  33. f: TTypeMemberField;
  34. begin
  35. writeln('ShowFields of ',TI.Name);
  36. for i:=0 to TI.FieldCount-1 do
  37. begin
  38. f:=TTypeMemberField(TI.Members[TI.Fields[i]]);
  39. writeln(' Name="',f.Name,'" Kind=',str(f.Kind),
  40. ' Type=',f.TypeInfo.Name,' TypeKind=',str(f.TypeInfo.Kind));
  41. end;
  42. end;
  43. function ProcSignatureToStr(Sig: TProcedureSignature): String;
  44. var
  45. i: Integer;
  46. Param: TProcedureParam;
  47. begin
  48. Result:='(';
  49. for i:=0 to length(Sig.Params)-1 do
  50. begin
  51. Param:=Sig.Params[i];
  52. if i>0 then Result:=Result+';';
  53. Result:=Result+Param.Name;
  54. Result:=Result+':'+Param.TypeInfo.Name;
  55. end;
  56. Result:=Result+')';
  57. if Sig.ResultType<>nil then
  58. Result:=Result+':'+Sig.ResultType.Name+'/'+str(Sig.ResultType.Kind);
  59. end;
  60. procedure ShowMethods(TI: TTypeInfoStruct);
  61. var
  62. i: Integer;
  63. m: TTypeMemberMethod;
  64. begin
  65. writeln('ShowMethods of ',TI.Name);
  66. for i:=0 to TI.MethodCount-1 do
  67. begin
  68. m:=TTypeMemberMethod(TI.Members[TI.Methods[i]]);
  69. writeln(' Name="',m.Name,'" Kind=',str(m.Kind),
  70. ' MethodKind=',str(m.MethodKind),' Sig=',ProcSignatureToStr(m.ProcSig));
  71. end;
  72. end;
  73. procedure ShowProperties(Instance: TObject);
  74. var
  75. i: Integer;
  76. PropInfo: TTypeMemberProperty;
  77. Value: String;
  78. TI: TTypeInfoClass;
  79. begin
  80. TI:=TypeInfo(Instance);
  81. writeln('ShowProperties of ',TI.Name);
  82. for i:=0 to TI.PropCount-1 do
  83. begin
  84. PropInfo:=TTypeMemberProperty(TI.Members[TI.Properties[i]]);
  85. Value:='?';
  86. if PropInfo.Getter<>'' then
  87. begin
  88. case PropInfo.TypeInfo.Kind of
  89. tkInteger: Value:=IntToStr(GetNativeIntProp(Instance,PropInfo));
  90. tkString: Value:=GetStrProp(Instance,PropInfo);
  91. end;
  92. end;
  93. writeln(' Name="',PropInfo.Name,'"',
  94. ' Kind=',str(PropInfo.Kind),
  95. ' Type=',PropInfo.TypeInfo.Name,
  96. ' TypeKind=',str(PropInfo.TypeInfo.Kind),
  97. ' Value=',Value);
  98. end;
  99. end;
  100. procedure ShowObjectRTTI(Obj: TObject);
  101. var
  102. ObjTI: TTypeInfoClass;
  103. begin
  104. ObjTI:=TypeInfo(Obj);
  105. ShowFields(ObjTI);
  106. ShowMethods(ObjTI);
  107. ShowProperties(Obj);
  108. end;
  109. var
  110. Shrimp: TShrimp;
  111. begin
  112. Shrimp:=TShrimp.Create;
  113. Shrimp.Name:='Shrimpy';
  114. Shrimp.Size:=42;
  115. ShowObjectRTTI(Shrimp);
  116. writeln('Setting Size to 137:');
  117. SetNativeIntProp(Shrimp,'size',137);
  118. writeln('Size=',GetNativeIntProp(Shrimp,'size'));
  119. end.