tprocvar3.pp 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. {
  2. This program tries to test any aspect of procedure variables and related
  3. stuff in Delphi mode
  4. }
  5. {$ifdef fpc}
  6. {$mode delphi}
  7. {$endif}
  8. Type
  9. TMyRecord = Record
  10. MyProc1,MyProc2 : Procedure(l : longint);
  11. MyVar : longint;
  12. end;
  13. procedure do_error(i : longint);
  14. begin
  15. writeln('Error near: ',i);
  16. halt(1);
  17. end;
  18. var
  19. globalvar : longint;
  20. type
  21. tpoo_rec = record
  22. procpointer : pointer;
  23. s : pointer;
  24. end;
  25. procedure callmethodparam(s : pointer;addr : pointer;param : longint);
  26. var
  27. p : procedure(param : longint) of object;
  28. begin
  29. tpoo_rec(p).procpointer:=addr;
  30. tpoo_rec(p).s:=s;
  31. p(param);
  32. end;
  33. type
  34. to1 = object
  35. constructor init;
  36. procedure test1;
  37. procedure test2(l : longint);
  38. procedure test3(l : longint);virtual;abstract;
  39. end;
  40. to2 = object(to1)
  41. procedure test3(l : longint);virtual;
  42. end;
  43. constructor to1.init;
  44. begin
  45. end;
  46. procedure to1.test1;
  47. var
  48. p:pointer;
  49. begin
  50. // useless only a semantic test
  51. p:[email protected];
  52. // this do we use to do some testing
  53. p:[email protected];
  54. globalvar:=0;
  55. callmethodparam(@self,p,1234);
  56. if globalvar<>1234 then
  57. do_error(1000);
  58. end;
  59. procedure to1.test2(l : longint);
  60. begin
  61. globalvar:=l;
  62. end;
  63. procedure to2.test3(l : longint);
  64. begin
  65. globalvar:=l;
  66. end;
  67. procedure testproc(l : longint);
  68. begin
  69. globalvar:=l;
  70. end;
  71. const
  72. constmethodaddr : pointer = @to1.test2;
  73. MyRecord : TMyRecord = (
  74. MyProc1 : TestProc;
  75. MyProc2 : TestProc;
  76. MyVar : 0;
  77. );
  78. var
  79. o1 : to1;
  80. o2 : to2;
  81. p : procedure(l : longint) of object;
  82. begin
  83. { Simple procedure variables }
  84. writeln('Procedure variables');
  85. globalvar:=0;
  86. MyRecord.MyProc1(1234);
  87. if globalvar<>1234 then
  88. do_error(2000);
  89. globalvar:=0;
  90. MyRecord.MyProc2(4321);
  91. if globalvar<>4321 then
  92. do_error(2001);
  93. writeln('Ok');
  94. { }
  95. { Procedures of objects }
  96. { }
  97. o1.init;
  98. o2.init;
  99. writeln('Procedures of objects');
  100. p:=o1.test2;
  101. globalvar:=0;
  102. p(12);
  103. if globalvar<>12 then
  104. do_error(1002);
  105. writeln('Ok');
  106. p:=o2.test3;
  107. globalvar:=0;
  108. p(12);
  109. if globalvar<>12 then
  110. do_error(1004);
  111. writeln('Ok');
  112. { }
  113. { Pointers and addresses of procedures }
  114. { }
  115. writeln('Getting an address of a method as pointer');
  116. o1.test1;
  117. globalvar:=0;
  118. callmethodparam(@o1,constmethodaddr,34);
  119. if globalvar<>34 then
  120. do_error(1001);
  121. writeln('Ok');
  122. end.