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 )