trtti2.pp 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. Program trtti1;
  2. {$Mode Delphi}
  3. {$M+}
  4. Uses
  5. Rttiobj,Typinfo;
  6. Procedure TestGetPropInfo (O : TMyTestObject);
  7. Const YesNo : Array[Boolean] of string[5] = (' NO ',' YES');
  8. Var
  9. PT : PTypeData;
  10. PI : PTypeInfo;
  11. I : Longint;
  12. PP : PPropList;
  13. begin
  14. PI:=O.ClassInfo;
  15. Writeln ('Type kind : ',TypeNames[PI^.Kind]);
  16. Writeln ('Type name : ',PI^.Name);
  17. PT:=GetTypeData(PI);
  18. If PT^.ParentInfo=Nil then
  19. Writeln ('Object has no parent info')
  20. else
  21. Writeln ('Object has parent info');
  22. Writeln ('Property Count : ',PT^.PropCount);
  23. Writeln ('Unit name : ',PT^.UnitName);
  24. GetMem (PP,PT^.PropCount*SizeOf(Pointer));
  25. GetPropInfos(PI,PP);
  26. For I:=0 to PT^.PropCount-1 do
  27. If PP^[i]<>Nil then
  28. With PP^[I]^ do
  29. begin
  30. Write('Property: ',Name:26,' (');
  31. Write(YesNo[GetPropInfo(PI,Name)=PP^[i]]);
  32. Write(YesNo[GetPropInfo(O,Name)=PP^[I]]);
  33. Write(YesNo[GetPropInfo(O.ClassType,Name)=PP^[I]]);
  34. Write(YesNo[GetPropInfo(PI,Name,tkProperties)=PP^[i]]);
  35. Write(YesNo[GetPropInfo(O,Name,tkProperties)=PP^[I]]);
  36. Write(YesNo[GetPropInfo(O.ClassType,Name,tkProperties)=PP^[I]]);
  37. Write(YesNo[FindPropInfo(O,Name)=PP^[I]]);
  38. Write(YesNo[FindPropInfo(O.ClassType,Name)=PP^[I]]);
  39. Writeln(')')
  40. end;
  41. end;
  42. Procedure TestGet (O : TMyTestObject);
  43. Var
  44. PT : PTypeData;
  45. PI : PTypeInfo;
  46. I,J : Longint;
  47. PP : PPropList;
  48. prI : PPropInfo;
  49. begin
  50. PI:=O.ClassInfo;
  51. Writeln ('Type kind : ',TypeNames[PI^.Kind]);
  52. Writeln ('Type name : ',PI^.Name);
  53. PT:=GetTypeData(PI);
  54. If PT^.ParentInfo=Nil then
  55. Writeln ('Object has no parent info')
  56. else
  57. Writeln ('Object has parent info');
  58. Writeln ('Property Count : ',PT^.PropCount);
  59. Writeln ('Unit name : ',PT^.UnitName);
  60. GetMem (PP,PT^.PropCount*SizeOf(Pointer));
  61. GetPropInfos(PI,PP);
  62. For I:=0 to PT^.PropCount-1 do
  63. begin
  64. pri:=PP^[i];
  65. With Pri^ do
  66. begin
  67. Write ('(Examining ',name,' : Type : ',TypeNames[PropType^.Kind],', ');
  68. If (Proptype^.kind in Ordinaltypes) Then
  69. begin
  70. J:=GetOrdProp(O,pri);
  71. Write ('Value : ',j);
  72. If PropType^.Kind=tkenumeration then
  73. Write ('(=',GetEnumName(Proptype,J),')')
  74. end
  75. else
  76. Case pri^.proptype^.kind of
  77. tkfloat : begin
  78. Write ('Value : ');
  79. Flush(output);
  80. Write(GetFloatProp(O,pri))
  81. end;
  82. tkAstring : begin
  83. Write ('value : ');
  84. flush (output);
  85. Write(GetStrProp(O,Pri));
  86. end;
  87. else
  88. Write ('Untested type:',ord(pri^.proptype^.kind));
  89. end;
  90. Writeln (')');
  91. end;
  92. end;
  93. end;
  94. Var O : TMyTestObject;
  95. begin
  96. O:=TMyTestObject.Create;
  97. TestGetPropInfo(O);
  98. // testget(o);
  99. end.