/jcl/examples/common/rtti/RTTIDemoMain.pas

https://github.com/the-Arioch/jcl · Pascal · 331 lines · 297 code · 27 blank · 7 comment · 0 complexity · 78bb2bffb9fab24fc12895b62f1aac13 MD5 · raw file

  1. unit RTTIDemoMain;
  2. interface
  3. {$I jcl.inc}
  4. uses
  5. SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
  6. type
  7. TForm1 = class(TForm)
  8. mmResult: TMemo;
  9. Button1: TButton;
  10. Button2: TButton;
  11. Button3: TButton;
  12. Button4: TButton;
  13. procedure Button1Click(Sender: TObject);
  14. procedure Button2Click(Sender: TObject);
  15. procedure Button3Click(Sender: TObject);
  16. procedure Button4Click(Sender: TObject);
  17. private
  18. { Private declarations }
  19. public
  20. { Public declarations }
  21. end;
  22. var
  23. Form1: TForm1;
  24. implementation
  25. {$R *.dfm}
  26. uses
  27. JclSysUtils, JclRTTI, TypInfo;
  28. type
  29. TDifficultEvent = procedure(const Sender: TObject; var I: Integer; out Stuff;
  30. IntArr: array of Integer; const VarArray: array of const) of object;
  31. TLargeEnum = (
  32. le001, le002, le003, le004, le005, le006, le007, le008, le009, le010,
  33. le011, le012, le013, le014, le015, le016, le017, le018, le019, le020,
  34. le021, le022, le023, le024, le025, le026, le027, le028, le029, le030,
  35. le031, le032, le033, le034, le035, le036, le037, le038, le039, le040,
  36. le041, le042, le043, le044, le045, le046, le047, le048, le049, le050,
  37. le051, le052, le053, le054, le055, le056, le057, le058, le059, le060,
  38. le061, le062, le063, le064, le065, le066, le067, le068, le069, le070,
  39. le071, le072, le073, le074, le075, le076, le077, le078, le079, le080,
  40. le081, le082, le083, le084, le085, le086, le087, le088, le089, le090,
  41. le091, le092, le093, le094, le095, le096, le097, le098, le099, le100,
  42. le101, le102, le103, le104, le105, le106, le107, le108, le109, le110,
  43. le111, le112, le113, le114, le115, le116, le117, le118, le119, le120,
  44. le121, le122, le123, le124, le125, le126, le127, le128, le129, le130,
  45. le131, le132, le133, le134, le135, le136, le137, le138, le139, le140,
  46. le141, le142, le143, le144, le145, le146, le147, le148, le149, le150,
  47. le151, le152, le153, le154, le155, le156, le157, le158, le159, le160);
  48. TLargeSet = set of TLargeEnum;
  49. TLargeSubEnum = le019 .. le150;
  50. TLargeSubSet = set of TLargeSubEnum;
  51. TIntRange = 0 .. 112;
  52. TSetNoEnum = set of (st01, st02, st03, st04);
  53. TSetOfByte = set of Byte;
  54. TInt2Range = 4..11;
  55. TSetOfIntRange = set of TInt2Range;
  56. TUpcaseRange = 'A' .. 'Z';
  57. TMyDouble = Double;
  58. TMyDouble2 = type Double;
  59. TIntArray = array of Integer;
  60. TIntArray2 = array of array of Integer;
  61. TEnumArray = array of (ar1, ar2, ar3);
  62. TRecArray = array of record x1: Integer; x2: Integer; end;
  63. TSetArray = array of set of (ars1, ars2, ars3);
  64. TSetArray2 = array of array of array of TSetNoEnum;
  65. TWideStrArray = array of Widestring;
  66. var
  67. MyEnum: PTypeInfo;
  68. MySubRange: PTypeInfo;
  69. MySet: PTypeInfo;
  70. MyCutLowerEnum: PTypeInfo;
  71. procedure TForm1.Button1Click(Sender: TObject);
  72. var
  73. Writer: IJclInfoWriter;
  74. begin
  75. mmResult.Lines.Clear;
  76. Writer := TJclInfoStringsWriter.Create(mmResult.Lines, 72);
  77. JclTypeInfo(TypeInfo(Word)).WriteTo(Writer);
  78. Writer.Writeln('');
  79. JclTypeInfo(TypeInfo(TIntRange)).WriteTo(Writer);
  80. Writer.Writeln('');
  81. JclTypeInfo(TypeInfo(TLargeEnum)).WriteTo(Writer);
  82. Writer.Writeln('');
  83. JclTypeInfo(TypeInfo(TLargeSubEnum)).WriteTo(Writer);
  84. Writer.Writeln('');
  85. JclTypeInfo(TypeInfo(TLargeSet)).WriteTo(Writer);
  86. Writer.Writeln('');
  87. JclTypeInfo(TypeInfo(TLargeSubSet)).WriteTo(Writer);
  88. Writer.Writeln('');
  89. JclTypeInfo(TypeInfo(TSetNoEnum)).WriteTo(Writer);
  90. Writer.Writeln('');
  91. JclTypeInfo(TypeInfo(TSetOfByte)).WriteTo(Writer);
  92. Writer.Writeln('');
  93. JclTypeInfo(TypeInfo(TSetOfIntRange)).WriteTo(Writer);
  94. Writer.Writeln('');
  95. JclTypeInfo(TypeInfo(Single)).WriteTo(Writer);
  96. Writer.Writeln('');
  97. JclTypeInfo(TypeInfo(Double)).WriteTo(Writer);
  98. Writer.Writeln('');
  99. JclTypeInfo(TypeInfo(Extended)).WriteTo(Writer);
  100. Writer.Writeln('');
  101. JclTypeInfo(TypeInfo(Comp)).WriteTo(Writer);
  102. Writer.Writeln('');
  103. JclTypeInfo(TypeInfo(Currency)).WriteTo(Writer);
  104. Writer.Writeln('');
  105. JclTypeInfo(TypeInfo(Real)).WriteTo(Writer);
  106. Writer.Writeln('');
  107. JclTypeInfo(TypeInfo(TDateTime)).WriteTo(Writer);
  108. Writer.Writeln('');
  109. JclTypeInfo(TypeInfo(TMyDouble)).WriteTo(Writer);
  110. Writer.Writeln('');
  111. JclTypeInfo(TypeInfo(TMyDouble2)).WriteTo(Writer);
  112. Writer.Writeln('');
  113. JclTypeInfo(TypeInfo(ShortString)).WriteTo(Writer);
  114. Writer.Writeln('');
  115. JclTypeInfo(TypeInfo(TScrollingWinControl)).WriteTo(Writer);
  116. Writer.Writeln('');
  117. JclTypeInfo(TypeInfo(TDifficultEvent)).WriteTo(Writer);
  118. Writer.Writeln('');
  119. JclTypeInfo(TypeInfo(IJclOrdinalRangeTypeInfo)).WriteTo(Writer);
  120. Writer.Writeln('');
  121. JclTypeInfo(TypeInfo(Int64)).WriteTo(Writer);
  122. Writer.Writeln('');
  123. JclTypeInfo(TypeInfo(Longword)).WriteTo(Writer);
  124. Writer.Writeln('');
  125. JclTypeInfo(TypeInfo(TIntArray)).WriteTo(Writer);
  126. Writer.Writeln('');
  127. JclTypeInfo(TypeInfo(TIntArray2)).WriteTo(Writer);
  128. Writer.Writeln('');
  129. JclTypeInfo(TypeInfo(TEnumArray)).WriteTo(Writer);
  130. Writer.Writeln('');
  131. JclTypeInfo(TypeInfo(TRecArray)).WriteTo(Writer);
  132. Writer.Writeln('');
  133. JclTypeInfo(TypeInfo(TSetArray)).WriteTo(Writer);
  134. Writer.Writeln('');
  135. JclTypeInfo(TypeInfo(TSetArray2)).WriteTo(Writer);
  136. end;
  137. procedure TForm1.Button2Click(Sender: TObject);
  138. var
  139. Writer: IJclInfoWriter;
  140. LargeSubSet: TLargeSubSet;
  141. GUID: TGUID;
  142. begin
  143. mmResult.Lines.Clear;
  144. Writer := TJclInfoStringsWriter.Create(mmResult.Lines, 72);
  145. Writer.Writeln('Set conversions:');
  146. Writer.Indent;
  147. try
  148. Writer.Writeln('StrToSet with string=''[le019..le023, le033, le045..le049]''');
  149. JclStrToSet(TypeInfo(TLargeSubSet), LargeSubSet, '[le019..le023, le033, le045..le049]');
  150. Writer.Writeln('SetToStr of StrToSet = ''' + JclSetToStr(TypeInfo(TLargeSubSet), LargeSubSet, True, True) + ''', with WantRanges=True');
  151. Writer.Writeln('SetToStr of StrToSet = ''' + JclSetToStr(TypeInfo(TLargeSubSet), LargeSubSet, True, False) + ''', with WantRanges=False');
  152. Writer.Writeln('');
  153. Writer.Writeln('StrToSet with string=''''');
  154. JclStrToSet(TypeInfo(TLargeSubSet), LargeSubSet, '');
  155. Writer.Writeln('SetToStr of StrToSet = ''' + JclSetToStr(TypeInfo(TLargeSubSet), LargeSubSet, True, True) + ''', with WantRanges=True');
  156. Writer.Writeln('SetToStr of StrToSet = ''' + JclSetToStr(TypeInfo(TLargeSubSet), LargeSubSet, True, False) + ''', with WantRanges=False');
  157. Writer.Writeln('');
  158. Writer.Writeln('StrToSet with string=''le019 .. le023,le033 , le045 .. le049 ''');
  159. JclStrToSet(TypeInfo(TLargeSubSet), LargeSubSet, 'le019 .. le023,le033 , le045 .. le049 ');
  160. Writer.Writeln('SetToStr of StrToSet = ''' + JclSetToStr(TypeInfo(TLargeSubSet), LargeSubSet, True, True) + ''', with WantRanges=True');
  161. Writer.Writeln('SetToStr of StrToSet = ''' + JclSetToStr(TypeInfo(TLargeSubSet), LargeSubSet, True, False) + ''', with WantRanges=False');
  162. Writer.Writeln('');
  163. finally
  164. Writer.Outdent;
  165. end;
  166. Writer.Writeln('GUID conversions:');
  167. Writer.Indent;
  168. try
  169. Writer.Writeln('GUIDToStr: ' + JclGUIDToString(IJclTypeInfo));
  170. GUID := JclStringToGUID(JclGUIDToString(IJclTypeInfo));
  171. Writer.Writeln('StrToGUID: ' + JclGUIDToString(GUID));
  172. finally
  173. Writer.Outdent;
  174. end;
  175. {$IFDEF COMPILER5_UP}
  176. Writer.Writeln('');
  177. Writer.Writeln('Integer conversions:');
  178. Writer.Indent;
  179. try
  180. Writer.Writeln('TypedIntToStr: ' + JclTypedIntToStr(crArrow, TypeInfo(TCursor)));
  181. Writer.Writeln('StrToTypedInt: ' + IntToStr(JclStrToTypedInt('crArrow', TypeInfo(TCursor))) + ' (should be ' + IntToStr(crArrow) + ')');
  182. Writer.Writeln('');
  183. Writer.Writeln('TypedIntToStr: ' + JclTypedIntToStr(1, TypeInfo(TCursor)));
  184. Writer.Writeln('StrToTypedInt: ' + IntToStr(JclStrToTypedInt('1', TypeInfo(TCursor))) + ' (should be 1)');
  185. finally
  186. Writer.Outdent;
  187. end;
  188. {$ENDIF}
  189. end;
  190. procedure TForm1.Button3Click(Sender: TObject);
  191. var
  192. Writer: IJclInfoWriter;
  193. begin
  194. mmResult.Lines.Clear;
  195. Writer := TJclInfoStringsWriter.Create(mmResult.Lines, 80);
  196. Writer.Writeln('Declarations:');
  197. Writer.Indent;
  198. try
  199. JclTypeInfo(TypeInfo(TLargeEnum)).DeclarationTo(Writer);
  200. Writer.Writeln('');
  201. JclTypeInfo(TypeInfo(TLargeSubEnum)).DeclarationTo(Writer);
  202. Writer.Writeln('');
  203. JclTypeInfo(TypeInfo(TLargeSet)).DeclarationTo(Writer);
  204. Writer.Writeln('');
  205. JclTypeInfo(TypeInfo(TSetNoEnum)).DeclarationTo(Writer);
  206. Writer.Writeln('');
  207. JclTypeInfo(TypeInfo(Byte)).DeclarationTo(Writer);
  208. Writer.Writeln('');
  209. JclTypeInfo(TypeInfo(TSetOfByte)).DeclarationTo(Writer);
  210. Writer.Writeln('');
  211. JclTypeInfo(TypeInfo(Char)).DeclarationTo(Writer);
  212. Writer.Writeln('');
  213. JclTypeInfo(TypeInfo(TUpcaseRange)).DeclarationTo(Writer);
  214. Writer.Writeln('');
  215. JclTypeInfo(TypeInfo(TDifficultEvent)).DeclarationTo(Writer);
  216. Writer.Writeln('');
  217. JclTypeInfo(TypeInfo(IJclBaseInfo)).DeclarationTo(Writer);
  218. Writer.Writeln('');
  219. JclTypeInfo(TypeInfo(IJclTypeInfo)).DeclarationTo(Writer);
  220. Writer.Writeln('');
  221. JclTypeInfo(TypeInfo(TDateTime)).DeclarationTo(Writer);
  222. Writer.Writeln('');
  223. JclTypeInfo(TypeInfo(TMyDouble)).DeclarationTo(Writer);
  224. Writer.Writeln('');
  225. JclTypeInfo(TypeInfo(TMyDouble2)).DeclarationTo(Writer);
  226. Writer.Writeln('');
  227. JclTypeInfo(TypeInfo(TScrollingWinControl)).DeclarationTo(Writer);
  228. Writer.Writeln('');
  229. JclTypeInfo(TypeInfo(TJclInfoWriter)).DeclarationTo(Writer);
  230. Writer.Writeln('');
  231. JclTypeInfo(TypeInfo(TPersistent)).DeclarationTo(Writer);
  232. Writer.Writeln('');
  233. JclTypeInfo(TypeInfo(TIntArray)).DeclarationTo(Writer);
  234. Writer.Writeln('');
  235. JclTypeInfo(TypeInfo(TIntArray2)).DeclarationTo(Writer);
  236. Writer.Writeln('');
  237. JclTypeInfo(TypeInfo(TEnumArray)).DeclarationTo(Writer);
  238. Writer.Writeln('');
  239. JclTypeInfo(TypeInfo(TRecArray)).DeclarationTo(Writer);
  240. Writer.Writeln('');
  241. JclTypeInfo(TypeInfo(TSetArray)).DeclarationTo(Writer);
  242. Writer.Writeln('');
  243. JclTypeInfo(TypeInfo(TSetArray2)).DeclarationTo(Writer);
  244. Writer.Writeln('');
  245. JclTypeInfo(TypeInfo(TWideStrArray)).DeclarationTo(Writer);
  246. finally
  247. Writer.Outdent;
  248. end;
  249. end;
  250. procedure TForm1.Button4Click(Sender: TObject);
  251. var
  252. Writer: IJclInfoWriter;
  253. begin
  254. mmResult.Lines.Clear;
  255. Writer := TJclInfoStringsWriter.Create(mmResult.Lines, 80);
  256. Writer.Writeln('JclGenerateEnumType with literals:');
  257. Writer.Indent;
  258. try
  259. JclTypeInfo(MyEnum).WriteTo(Writer);
  260. Writer.Writeln;
  261. JclTypeInfo(MyEnum).DeclarationTo(Writer);
  262. finally
  263. Writer.Outdent;
  264. end;
  265. Writer.Writeln;
  266. Writer.Writeln('JclGenerateSubRange:');
  267. Writer.Indent;
  268. try
  269. JclTypeInfo(MySubRange).WriteTo(Writer);
  270. Writer.Writeln;
  271. JclTypeInfo(MySubRange).DeclarationTo(Writer);
  272. finally
  273. Writer.Outdent;
  274. end;
  275. Writer.Writeln;
  276. Writer.Writeln('JclGenerateSetType:');
  277. Writer.Indent;
  278. try
  279. JclTypeInfo(MySet).WriteTo(Writer);
  280. Writer.Writeln;
  281. JclTypeInfo(MySet).DeclarationTo(Writer);
  282. finally
  283. Writer.Outdent;
  284. end;
  285. Writer.Writeln;
  286. Writer.Writeln('JclGenerateEnumType based on TLargeEnum:');
  287. Writer.Indent;
  288. try
  289. JclTypeInfo(MyCutLowerEnum).WriteTo(Writer);
  290. Writer.Writeln;
  291. JclTypeInfo(MyCutLowerEnum).DeclarationTo(Writer);
  292. finally
  293. Writer.Outdent;
  294. end;
  295. end;
  296. initialization
  297. //JclHookIs(JclIsClassByName);
  298. MyEnum := JclGenerateEnumType('MyEnum', ['First value', 'Second value',
  299. 'Third value', 'Fourth value', 'Fifth value']);
  300. MySubRange := JclGenerateSubRange(MyEnum, 'MySubRange', 1, 3);
  301. MySet := JclGenerateSetType(MyEnum, 'MySet');
  302. MyCutLowerEnum := JclGenerateEnumTypeBasedOn('MyCutLower', TypeInfo(TLargeEnum),
  303. PREFIX_CUT_LOWERCASE);
  304. end.