Hello,
I would like to convert this event to scripter:
TOnDrawShape = procedure(const canvas: TCanvas; var rect: TRect;
item: TShape) of object;
I have done it like this:
procedure TatNativeShapeDispatcher.__TOnDrawShape(const canvas: TCanvas; var rect: TRect; item: TECShape);
var
rectTemp: Trect;
RestAdr:NativeUInt;
begin
if DoOnExecuteEvent then
begin
if AssignedMethod(BeforeCall) then
TOnDrawShape(BeforeCall)(canvas,rect,item);
rectTemp := rect;
if Assigned(Scripter) and (RoutineName > '') then
begin
RestAdr:=ObjectToVar(TRectWrapper.Create(rectTemp));
Scripter.ExecuteSubroutine(RoutineName, [canvas,RestAdr,item]);
rectTemp:= TRectWrapper(RestAdr).ObjToRec;
end;
rect := rectTemp;
if AssignedMethod(AfterCall) then
TOnDrawShape(AfterCall)(canvas,rect,item);
end;
end;
Registred with :
DefineEventAdapter(TypeInfo(TOnDrawShape), TatNativeShapeDispatcher, @TNativeShapeDispatcher.__TOnDrawShape);
But in scripter when I try to do something like:
procedure doDrawHint( canvas : TCanvas; var r:Trect; Item: TShape);
begin
canvas.TextRect(r, 0, 0, 'MyText');
end;
I have an error "Can't convert a variant of type (null) to type (Double)"
With :
procedure doDrawHint( canvas : TCanvas; var r; Item: TShape);
begin
canvas.TextRect(r, 0, 0, 'MyText');
end;
I have an error "EInvalidCast".
same error with :
procedure TatuecNativeShapeDispatcher.__TOnDrawShape(const canvas: TCanvas; var rect: TRect; item: TShape);
var
rectTemp: TRectWrapper;
begin
if DoOnExecuteEvent then
begin
if AssignedMethod(BeforeCall) then
TOnDrawShape(BeforeCall)(canvas,rect,item);
if Assigned(Scripter) and (RoutineName > '') then
begin
rectTemp := TRectWrapper.Create(rect);
Scripter.ExecuteSubroutine(RoutineName, [canvas,rectTemp,item].setvari);
rect:= TRectWrapper(rectTemp).ObjToRec;
end;
if AssignedMethod(AfterCall) then
TOnDrawShape(AfterCall)(canvas,rect,item);
end;
end;
What I'am doing wrong ?