tw14155.pp 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. program project1;
  2. {$mode objfpc}
  3. type
  4. TSomeEvent = procedure(Sender: TObject; X, Y, Line: integer; mark: Integer) of object;
  5. type
  6. TSubObject = class(TObject)
  7. public
  8. SomeEvent: TSomeEvent;
  9. end;
  10. TMyObject = class(TObject)
  11. private
  12. fSub : TSubObject;
  13. protected
  14. procedure DoSomeEvent(Sender: TObject; X, Y, Line: integer; mark: Integer);
  15. public
  16. constructor Create;
  17. destructor Destroy; override;
  18. function GetSomeEvent: TSomeEvent;
  19. end;
  20. constructor TMyObject.Create;
  21. begin
  22. fSub := TSubObject.Create;
  23. fSub.SomeEvent := @Self.DoSomeEvent;
  24. end;
  25. destructor TMyObject.Destroy;
  26. begin
  27. fSub.Free;
  28. end;
  29. function TMyObject.GetSomeEvent: TSomeEvent;
  30. begin
  31. Result := fSub.SomeEvent;
  32. end;
  33. procedure TMyObject.DoSomeEvent(Sender: TObject; X, Y, Line: integer; mark: Integer);
  34. begin
  35. writeln('do some event');
  36. end;
  37. var
  38. my : TMyObject;
  39. mtd : TMethod;
  40. type
  41. TGetProc = function (): TMethod of object;
  42. begin
  43. my := TMyObject.Create;
  44. mtd := TGetProc(@my.GetSomeEvent)();
  45. writeln('mtd.Data = ', PtrInt(mtd.Data));
  46. writeln('mtd.Code = ', PtrInt(mtd.Code));
  47. if Assigned(TSomeEvent(mtd)) then
  48. TSomeEvent(mtd)(nil,0,0,0,0);
  49. my.Free;
  50. end.