我想知道是否可以在Delphi 2010 RIDL编辑器中定义类型函数/过程指针的属性,用于接口定义,这样当我使用其CoCreator创建其实现者的实例时,我可能会分配一个函数我的源中的/ procedure使用该接口定义到该属性。其实我想知道如何填补" ??? "以下。
TLB文件:
IComIntf = interface(IDispatch)
...
function Get_OnDoSomething : ??? safecall;
procedure Set_OnDoSomething(const New_Event : ???); safecall;
...
property OnDoSomething : ???;
...
implementation
uses ComObj;
class function CoComIntf.Create: IComInt;
...
begin
Result := CreateComObject(CLASS_ComIntf) as IComIntf;
end;
实施文件,ComIntfUnit.pas:
type
TOnDoSomething = function (Info: OleVariant): HResult of object;
TComIntf = class(TAutoObject, IComIntf)
private
fOnDoSomething : TDoSomething;
...
public
property OnDoSomething: TOnDoSomething read fOnDoSomething write fOnDoSomething;
...
客户表格:
uses ComIntfUnit;
type
TForm1 = class(TForm)
private
{ Private declarations }
fCom : IComIntf;
function DoSomething(Info: OleVariant): HResult;
public
{ Public declarations }
...
end;
...
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
fCom := CoComIntf.Create;
fCom.OnDoSomething := DoSomething;
...
提前谢谢。
答案 0 :(得分:0)
你这是错误的方式。实现此目的的正确方法是定义客户端实现并传递给COM对象的第二个接口。然后,COM对象可以保留该接口,并在需要时调用其上的方法。这通常是使用Connection Points为事件接口实现的。
实现此目的的一种简单方法,特别是在您使用IDispatch
时,是使用IDE向导创建新的自动化对象,并确保单击“生成事件”支持代码“向导对话框中的复选框。然后,向导将生成2个接口,一个用于对象本身,另一个用于对象的事件,并为您实现连接点逻辑。然后,您可以根据需要向2个接口添加方法,其中对象方法在需要时调用事件方法。
如果您随后编译,注册并将最终对象导入IDE并为其生成VCL包装器,则生成的组件将在其上具有VCL样式的事件,这些事件内部连接到对象的连接点事件。 / p>