Part of Delphi:
I have a class with an event, and from this event I need to call a procedure that passes an adjoining object to it. It works great in Delphi, but I have problems declaring it in Pascal Script.
In the background - the IGPGraphics interface is part of the Delphi GDI+ library and, without methods, is defined as follows:
type IGdiplusBase = interface ['{24A5D3F5-4A9B-42A2-9F60-20825E2740F5}'] IGPGraphics = interface(IGdiPlusBase) ['{57F85BA4-CB01-4466-8441-948D03588F54}']
Below is just a simplified Delphi pseudo-fix of what I need to do in Pascal Script:
type TRenderEvent = procedure(Sender: TObject; const GPGraphics: IGPGraphics) of object; TRenderClass = class(TGraphicControl) private FOnRender: TRenderEvent; public property OnRender: TRenderEvent read FOnRender write FOnRender; end; // when the TRenderClass object instance fires its OnRender event I want to call // the RenderObject procedure passing the IGPGraphics interfaced object to it; I // hope I'm doing it right, I'm just a newbie to this stuff - but it works so far // in Delphi (since I didn't get it to work in Pascal Script) procedure TForm1.RenderClass1Render(Sender: TObject; const GPGraphics: IGPGraphics); begin RenderObject(GPGraphics, 10, 10); end; // what I need in Pascal Script is between these two lines; just pass the interface // object from the event fired by component to the procedure called from inside it procedure RenderObject(const GPGraphics: IGPGraphics; X, Y); begin // and here to work with the interfaced object somehow end;
Pascal Script compilation part:
My goal is to have a class with an event available in Pascal Script and should pass this conjugate object to the same procedure as above, so first I tried to declare this for compile time (but I'm not even sure if it is The right way):
// the interface PS.AddInterface(Cl.FindInterface('IUnknown'), StringToGuid('{57F85BA4-CB01-4466-8441-948D03588F54}'), 'IGPGraphics'); // the type for the event PS.AddTypeS('TRenderEvent', 'procedure(Sender: TObject; const GPGraphics: IGPGraphics)'); // and the class with the event itself with PS.AddClassN(PS.FindClass('TGraphicControl'), 'TRenderClass') do begin RegisterProperty('OnRender', 'TRenderEvent', iptrw); end;
Pascal Script execution part:
If I'm definitely lost, this is part of the runtime. I cannot figure out how to get the conjugate object from the call stack and pass it to my RenderObject procedure:
function RenderClassProc(Caller: TPSExec; Proc: TPSExternalProcRec; Global, Stack: TPSStack): Boolean; var PStart: Cardinal; begin PStart := Stack.Count-1; Result := True; if Proc.Name = 'RENDEROBJECT' then begin // how do I get the interfaced object from Stack (or whatever else) and pass // it to the RenderObject proc here ? I can't find anything related about it // except functions that has no parameter index RenderObject(Stack.Get ?, Stack.GetInt(PStart-2), Stack.GetInt(PStart-3)); end; end;
And the question is:
Can someone suggest me how to correctly determine the compilation and part of the runtime for this case, or correct me with passing the conjugate object?
PS sorry for the Inno-Setup tag, but maybe someone out there tried to configure InnoSetup this way.
Thank you so much!