tw38238.pp 921 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. program tw38238;
  2. {$mode objfpc}
  3. {$modeswitch advancedrecords}
  4. type
  5. TCallback = procedure(AValue: longint) of object;
  6. TRec = record
  7. Clb: TCallback;
  8. procedure AddCallback(ACallback: TCallback);
  9. procedure TriggerCallback(AValue: longint);
  10. end;
  11. TRec2 = record
  12. Value: longint;
  13. Rec: TRec;
  14. procedure CLB(AValue: longint);
  15. procedure InitStuff;
  16. end;
  17. procedure TRec.AddCallback(ACallback: TCallback);
  18. begin
  19. Clb:=ACallback;
  20. end;
  21. procedure TRec.TriggerCallback(AValue: longint);
  22. begin
  23. if assigned(Clb) then
  24. Clb(AValue);
  25. end;
  26. procedure TRec2.CLB(AValue: longint);
  27. begin
  28. Value:=AValue;
  29. end;
  30. procedure TRec2.InitStuff;
  31. begin
  32. Rec.AddCallback(@CLB);
  33. end;
  34. var
  35. Rec1, Rec2: TRec2;
  36. begin
  37. Rec1.InitStuff;
  38. Rec2.InitStuff;
  39. Rec1.Rec.TriggerCallback(1234);
  40. Rec2.Rec.TriggerCallback($0943);
  41. if Rec1.Value<>1234 then
  42. Halt(1);
  43. if Rec2.Value<>$0943 then
  44. Halt(2);
  45. end.