Event RTTI Invocation (Delphi)
Description
This example shows how to use the RTTI of an event to invoke it. Two classes are defined: TMapModel (event producer) and TMapView (event consumer). TMapModel has a specific event: OnChange (of type TMapModelChangeEvent). Procedure InvokeOnChangeEvent retrieves the RTTI available for this event and invokes it.
Code
program Program1;
{$APPTYPE CONSOLE}
uses SysUtils, Rtti;
type
  TMapModelChangeEvent = procedure(Sender: TObject; Area: Pointer) of object;
  TMapModel = class
  private
    FOnModelMapChange: TMapModelChangeEvent;
  public
    property OnChange: TMapModelChangeEvent read FOnModelMapChange
      write FOnModelMapChange;
  end;
  TMapView = class
  public
    procedure Update(Sender: TObject; Area: Pointer);
  end;
procedure TMapView.Update(Sender: TObject; Area: Pointer);
begin
  Writeln('Map view update');
  // Use the area information...
end;
procedure InvokeOnChangeEvent(mapModel: TObject);
var
  context: TRttiContext;
  method: TValue; // System.TMethod
  methodType: TRttiInvokableType;
begin
  { Get the value of the OnChange property, which is a method pointer }
  method := context.GetType(mapModel.ClassType).GetProperty('OnChange')
    .GetValue(mapModel);
  { Display the method code and data pair }
  Writeln(method.ToString);
  { Get event RTTI }
  methodType := context.GetType(method.TypeInfo) as TRttiInvokableType;
  Writeln(methodType.Name);
  { Invoke event }
  { The first parameter must be the procedure/method pointer in a TValue variable }
  methodType.Invoke(method, [mapModel { Sender } , nil { Area } ]);
end;
var
  mapModel: TMapModel;
  mapView: TMapView;
begin
  mapModel := TMapModel.Create;
  mapView := TMapView.Create;
  try
    mapModel.OnChange := mapView.Update;
    InvokeOnChangeEvent(mapModel);
  finally
    mapModel.Free;
    mapView.Free;
  end;
end.
Sample Console Output
(method code=00495334, data=00D2A6E0) TMapModelChangeEvent Map view update
Uses
- System.Rtti.TRttiType.GetProperty ( fr | de | ja )
 - System.TMethod ( fr | de | ja )