tw8222b.pp 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314
  1. {$ifdef fpc}
  2. {$mode delphi}
  3. {$endif}
  4. {$i-}
  5. uses
  6. SysUtils;
  7. type
  8. TMyObject1 = class(TObject)
  9. constructor Create; virtual;
  10. destructor Destroy; override;
  11. procedure AfterConstruction; override;
  12. procedure BeforeDestruction; override;
  13. class function NewInstance: TObject; override;
  14. procedure FreeInstance; override;
  15. end;
  16. TMyObject2 = class(TMyObject1)
  17. constructor Create; override;
  18. destructor Destroy; override;
  19. procedure AfterConstruction; override;
  20. procedure BeforeDestruction; override;
  21. class function NewInstance: TObject; override;
  22. procedure FreeInstance; override;
  23. end;
  24. TMyObject3 = class(TMyObject2)
  25. constructor Create; override;
  26. destructor Destroy; override;
  27. procedure AfterConstruction; override;
  28. procedure BeforeDestruction; override;
  29. class function NewInstance: TObject; override;
  30. procedure FreeInstance; override;
  31. end;
  32. var
  33. Depth: Integer;
  34. s: string;
  35. { TMyObject1 }
  36. procedure TMyObject1.AfterConstruction;
  37. begin
  38. s:=s+'1a';
  39. WriteLn(StringOfChar(' ', Depth * 2), '-> TMyObject1.AfterConstruction'); Inc(Depth); try
  40. inherited;
  41. s:=s+'2a';
  42. finally
  43. Dec(Depth); WriteLn(StringOfChar(' ', Depth * 2), '<- TMyObject1.AfterConstruction');
  44. s:=s+'3a';
  45. end;
  46. s:=s+'4a';
  47. end;
  48. procedure TMyObject1.BeforeDestruction;
  49. begin
  50. s:=s+'1b';
  51. WriteLn(StringOfChar(' ', Depth * 2), '-> TMyObject1.BeforeDestruction'); Inc(Depth); try
  52. inherited;
  53. s:=s+'2b';
  54. finally
  55. Dec(Depth); WriteLn(StringOfChar(' ', Depth * 2), '<- TMyObject1.BeforeDestruction');
  56. s:=s+'3b';
  57. end;
  58. s:=s+'4b';
  59. end;
  60. constructor TMyObject1.Create;
  61. begin
  62. s:=s+'1c';
  63. WriteLn(StringOfChar(' ', Depth * 2), '-> TMyObject1.Create'); Inc(Depth); try
  64. inherited;
  65. s:=s+'2c';
  66. s:=s+'3c';
  67. finally
  68. Dec(Depth); WriteLn(StringOfChar(' ', Depth * 2), '<- TMyObject1.Create');
  69. s:=s+'4c';
  70. end;
  71. s:=s+'5c';
  72. end;
  73. destructor TMyObject1.Destroy;
  74. begin
  75. s:=s+'1d';
  76. WriteLn(StringOfChar(' ', Depth * 2), '-> TMyObject1.Destroy'); Inc(Depth); try
  77. inherited;
  78. s:=s+'2d';
  79. finally
  80. Dec(Depth); WriteLn(StringOfChar(' ', Depth * 2), '<- TMyObject1.Destroy');
  81. s:=s+'3d';
  82. end;
  83. s:=s+'4d';
  84. end;
  85. procedure TMyObject1.FreeInstance;
  86. begin
  87. s:=s+'1e';
  88. WriteLn(StringOfChar(' ', Depth * 2), '-> TMyObject1.FreeInstance'); Inc(Depth); try
  89. inherited;
  90. s:=s+'2e';
  91. finally
  92. Dec(Depth); WriteLn(StringOfChar(' ', Depth * 2), '<- TMyObject1.FreeInstance');
  93. s:=s+'3e';
  94. end;
  95. s:=s+'4e';
  96. end;
  97. class function TMyObject1.NewInstance: TObject;
  98. begin
  99. s:=s+'1f';
  100. WriteLn(StringOfChar(' ', Depth * 2), '-> TMyObject1.NewInstance'); Inc(Depth); try
  101. Result := inherited NewInstance;
  102. s:=s+'2f';
  103. finally
  104. Dec(Depth); WriteLn(StringOfChar(' ', Depth * 2), '<- TMyObject1.NewInstance');
  105. s:=s+'3f';
  106. end;
  107. s:=s+'4f';
  108. end;
  109. { TMyObject2 }
  110. procedure TMyObject2.AfterConstruction;
  111. begin
  112. s:=s+'1g';
  113. WriteLn(StringOfChar(' ', Depth * 2), '-> TMyObject2.AfterConstruction'); Inc(Depth); try
  114. inherited;
  115. s:=s+'2g';
  116. finally
  117. Dec(Depth); WriteLn(StringOfChar(' ', Depth * 2), '<- TMyObject2.AfterConstruction');
  118. s:=s+'3g';
  119. end;
  120. s:=s+'4g';
  121. end;
  122. procedure TMyObject2.BeforeDestruction;
  123. begin
  124. s:=s+'1h';
  125. WriteLn(StringOfChar(' ', Depth * 2), '-> TMyObject2.BeforeDestruction'); Inc(Depth); try
  126. inherited;
  127. s:=s+'2h';
  128. finally
  129. Dec(Depth); WriteLn(StringOfChar(' ', Depth * 2), '<- TMyObject2.BeforeDestruction');
  130. s:=s+'3h';
  131. end;
  132. s:=s+'4h';
  133. end;
  134. constructor TMyObject2.Create;
  135. begin
  136. s:=s+'1i';
  137. WriteLn(StringOfChar(' ', Depth * 2), '-> TMyObject2.Create'); Inc(Depth); try
  138. inherited;
  139. s:=s+'2i';
  140. finally
  141. Dec(Depth); WriteLn(StringOfChar(' ', Depth * 2), '<- TMyObject2.Create');
  142. s:=s+'3i';
  143. end;
  144. s:=s+'4i';
  145. end;
  146. destructor TMyObject2.Destroy;
  147. begin
  148. s:=s+'1j';
  149. WriteLn(StringOfChar(' ', Depth * 2), '-> TMyObject2.Destroy'); Inc(Depth); try
  150. inherited;
  151. s:=s+'2j';
  152. finally
  153. Dec(Depth); WriteLn(StringOfChar(' ', Depth * 2), '<- TMyObject2.Destroy');
  154. s:=s+'3j';
  155. end;
  156. s:=s+'4j';
  157. end;
  158. procedure TMyObject2.FreeInstance;
  159. begin
  160. s:=s+'1k';
  161. WriteLn(StringOfChar(' ', Depth * 2), '-> TMyObject2.FreeInstance'); Inc(Depth); try
  162. inherited;
  163. s:=s+'2k';
  164. finally
  165. Dec(Depth); WriteLn(StringOfChar(' ', Depth * 2), '<- TMyObject2.FreeInstance');
  166. s:=s+'3k';
  167. end;
  168. s:=s+'4k';
  169. end;
  170. class function TMyObject2.NewInstance: TObject;
  171. begin
  172. s:=s+'1l';
  173. WriteLn(StringOfChar(' ', Depth * 2), '-> TMyObject2.NewInstance'); Inc(Depth); try
  174. Result := inherited NewInstance;
  175. s:=s+'2l';
  176. finally
  177. Dec(Depth); WriteLn(StringOfChar(' ', Depth * 2), '<- TMyObject2.NewInstance');
  178. s:=s+'3l';
  179. end;
  180. s:=s+'4l';
  181. end;
  182. { TMyObject3 }
  183. procedure TMyObject3.AfterConstruction;
  184. begin
  185. s:=s+'1m';
  186. WriteLn(StringOfChar(' ', Depth * 2), '-> TMyObject3.AfterConstruction'); Inc(Depth); try
  187. inherited;
  188. s:=s+'2m';
  189. finally
  190. Dec(Depth); WriteLn(StringOfChar(' ', Depth * 2), '<- TMyObject3.AfterConstruction');
  191. s:=s+'3m';
  192. end;
  193. s:=s+'4m';
  194. end;
  195. procedure TMyObject3.BeforeDestruction;
  196. begin
  197. s:=s+'1n';
  198. WriteLn(StringOfChar(' ', Depth * 2), '-> TMyObject3.BeforeDestruction'); Inc(Depth); try
  199. inherited;
  200. s:=s+'2n';
  201. finally
  202. Dec(Depth); WriteLn(StringOfChar(' ', Depth * 2), '<- TMyObject3.BeforeDestruction');
  203. s:=s+'3n';
  204. end;
  205. s:=s+'4n';
  206. end;
  207. constructor TMyObject3.Create;
  208. begin
  209. s:=s+'1o';
  210. WriteLn(StringOfChar(' ', Depth * 2), '-> TMyObject3.Create'); Inc(Depth); try
  211. inherited;
  212. s:=s+'2o';
  213. finally
  214. Dec(Depth); WriteLn(StringOfChar(' ', Depth * 2), '<- TMyObject3.Create');
  215. s:=s+'3o';
  216. end;
  217. s:=s+'4o';
  218. end;
  219. destructor TMyObject3.Destroy;
  220. begin
  221. s:=s+'1p';
  222. WriteLn(StringOfChar(' ', Depth * 2), '-> TMyObject3.Destroy'); Inc(Depth); try
  223. inherited;
  224. s:=s+'2p';
  225. finally
  226. Dec(Depth); WriteLn(StringOfChar(' ', Depth * 2), '<- TMyObject3.Destroy');
  227. s:=s+'3p';
  228. end;
  229. s:=s+'4p';
  230. end;
  231. procedure TMyObject3.FreeInstance;
  232. begin
  233. s:=s+'1q';
  234. WriteLn(StringOfChar(' ', Depth * 2), '-> TMyObject3.FreeInstance'); Inc(Depth); try
  235. inherited;
  236. s:=s+'2q';
  237. finally
  238. Dec(Depth); WriteLn(StringOfChar(' ', Depth * 2), '<- TMyObject3.FreeInstance');
  239. s:=s+'3q';
  240. end;
  241. s:=s+'4q';
  242. end;
  243. class function TMyObject3.NewInstance: TObject;
  244. begin
  245. s:=s+'1r';
  246. WriteLn(StringOfChar(' ', Depth * 2), '-> TMyObject3.NewInstance'); Inc(Depth); try
  247. Result := inherited NewInstance;
  248. s:=s+'2r';
  249. finally
  250. Dec(Depth); WriteLn(StringOfChar(' ', Depth * 2), '<- TMyObject3.NewInstance');
  251. s:=s+'3r';
  252. end;
  253. s:=s+'4r';
  254. end;
  255. begin
  256. try
  257. with TMyObject3.Create do try
  258. writeln(s);
  259. if (s <> '1r1l1f2f3f4f2l3l4l2r3r4r1o1i1c2c3c4c5c2i3i4i2o3o4o1m1g1a2a3a4a2g3g4g2m3m4m') then
  260. halt(1);
  261. s:='ok';
  262. finally
  263. if (s<>'ok') then
  264. halt(1);
  265. Free;
  266. writeln(s);
  267. if (s<>'ok1n1h1b2b3b4b2h3h4h2n3n4n1p1j1d2d3d4d2j3j4j2p3p4p1q1k1e2e3e4e2k3k4k2q3q4q') then
  268. halt(4);
  269. s:='ok2';
  270. end;
  271. finally
  272. if s<>'ok2' then
  273. halt(2);
  274. s:='ok3';
  275. end;
  276. if s<>'ok3' then
  277. halt(3);
  278. end.