デルファイ一部:インタフェースされたオブジェクトをPascal Script関数呼び出しに渡すには?
私は、イベントを持つクラスを持っているし、そのイベントから、私はそれにインタフェースオブジェクトを渡す手順を呼び出す必要があります。 Delphiでは正常に動作しますが、Pascal Scriptで宣言する際に問題があります。バックグラウンドに
は -IGPGraphics
インタフェースは
Delphi GDI+ library
の一部であり、方法はなく、このように定義されています
type
IGdiplusBase = interface
['{24A5D3F5-4A9B-42A2-9F60-20825E2740F5}']
IGPGraphics = interface(IGdiPlusBase)
['{57F85BA4-CB01-4466-8441-948D03588F54}']
次は私がパスカルスクリプトで何をする必要があるかだけの簡素化デルファイの擬似コードです:
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で利用できるようにすることであり、上記のように、そのインタフェースされたオブジェクトをそのプロシージャに渡す必要があるため、最初にコンパイル時に宣言しようとしました(しかし、でもそれはそうする正しい方法の場合)を確認してください。
// 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;
パスカルスクリプトランタイム一部:
私は間違いなく、迷ってしまいましたランタイム部分です。
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;
をし、問題がある:私は、コールスタックからのインターフェースオブジェクトを取得し、私のRenderObject手順にそれを渡す方法を見つけ出すことはできません
誰がどのように私を提案することができますこのケースのコンパイルと実行時の部分を正しく定義するか、どういうわけか、インタフェースされたオブジェクトを渡して修正しますか?
P.S.そのInno-Setupタグは残念ですが、たぶん誰か InnoSetupをこのようにカスタマイズしようとしました。
ありがとうございます!