平台上访问接口都是通过DispatchHelper实现的,通过创建DispatchHelper的实例,调用这个实例的方法来访问接口的属性或者调用接口的方法。
1.1. 相关属性和方法
constructor create(idispatch: TObject); overload;
创建接口对象的实例
function InvokeMethod(Name: string; Params: array of TObject): TObject; overload;
调用接口的Name方法,用Params作为参数
function InvokeMethod(Name: string; ParamsByRef: array of Boolean; Params: array of TObject): TObject; overload;
调用接口的Name方法,用ParamsByRef作为传值参数,用Params作为传参参数
function PropertyGet(Name: string; Params: array of TObject): TObject; overload;
获取接口的Name属性值作为函数返回值
procedure PropertyPut(Name: string; Params: array of TObject); overload;
设置接口的Name属性值
1.2. 用法示例
调用现有控件的接口
切换行号显示
1 var
2 doc: System.DispatchHelper;
3 app: System.DispatchHelper;
4 sel: System.DispatchHelper;
5 begin
6 dbedtContent.DataSource.DataSet.Edit;
7 TOleContainer(dbedtContent.InplaceControl).DoVerb(0); //字段数据类型为二进制,表现类型为OLE.
8 doc := System.DispatchHelper.Create(TOleContainer(dbedtContent.InplaceControl).OleObject);
9 app := System.DispatchHelper.Create(doc.PropertyGet('Application', []));
10 app.PropertyPut('UserName', [edtAuthor.Text]); //设置用户名.
11 app.PropertyPut('UserInitials', ['alang']); //设置用户简称.
12 doc.PropertyPut('TrackRevisions', [True]); //设置痕迹保留.
13 end;
创建新的接口,然后调用接口的方法和属性
切换行号显示
1 var
2 o: Object;
3 app, docs, doc: System.DispatchHelper;
4 begin
5 //创建接口对象o
6 o := ComObj.CreateOleObject('Word.Application');
7 //根据接口对象o创建接口app
8 app := System.DispatchHelper.Create(o);
9 app.PropertySet('Visible', [False]);
10 docs := System.DispatchHelper.Create(app.PropertyGet('Documents', []);
11 docs.InvokeMethod('Open', []);
12 ...
13 //释放接口对象。
14 (o as System.IDisposable).Dispose;
15 end;
1.3. FAQ
1.3.1. EmptyParam如何在平台上表示
在Delphi中经常用EmptyParam作为一个用不到的参数在接口函数中用到,在平台上可以用nil来代替
Delphi代码
切换行号显示
1 var
2 word: OleVariant;
3 begin
4 word := CreateOleObject('Word.Application');
5 ShowMessage('before quit');
6 word.Quit(EmptyParam, EmptyParam, EmptyParam);
7 ShowMessage('after quit');
8 end;
平台代码:
切换行号显示
1 var
2 o: Object;
3 word: System.DispatchHelper;
4 begin
5 o := ComObj.CreateOleObject('Word.Application');
6 word := System.DispatchHelper.Create(o);
7 Dialogs.ShowMessage('before quit');
8 word.InvokeMethod('Quit', [nil, nil, nil]);
9 Dialogs.ShowMessage('after quit');
10 (o as System.IDisposable).Dispose;
11 end; |