• 全部
  • 语言基础/算法/系统设计
  • 数据库相关
  • 图形处理/多媒体
  • 网络通信/分布式开发
  • VCL组件开发及应用
  • Windows SDK/API
  • 问答

Com 高手请进:如何实现方法(和属性)的“重载”?(可加分)

neweb 2002-03-14 02:43:45
有一接口:Iwc, 项下有个
 方法: SetTest(p1: Integer; p2: OleVariant)
 属性:TestValue: Integer

想实现客户程序无论输入
obj.SetTest(p1,p2) 还是
 obj.SetTest(p1) 还是
 obj.SetTest(p2) 或者
 obj.SetTest,都能执行

我用了一般的重载方法(overload)可以通过编译,但运行时报错,必须输入p1,p2两个参数才行,怎么实现少输参数,望指教!!
...全文
57 点赞 收藏 14
写回复
14 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
neweb 2002-03-15
例如 procedure Navigate(const URL: WideString; var Flags: OleVariant; var TargetFrameName: OleVariant); overload;

不知道它怎么分辨 Flags 和 TargetFrameName 的,

var
URL : WideString;
Flags, Target : string;
象这样:
 WebBrowser1.Navigate(URL,Flags);
 WebBrowser1.Navigate(URL,Target);

加分了
回复
huangbin277 2002-03-14
gz
回复
chechy 2002-03-14
Some Code of TWebBrowser:
TWebBrowser = class(TOleControl)
private
FOnStatusTextChange: TWebBrowserStatusTextChange;
FOnProgressChange: TWebBrowserProgressChange;
FOnCommandStateChange: TWebBrowserCommandStateChange;
FOnDownloadBegin: TNotifyEvent;
FOnDownloadComplete: TNotifyEvent;
FOnTitleChange: TWebBrowserTitleChange;
FOnPropertyChange: TWebBrowserPropertyChange;
FOnBeforeNavigate2: TWebBrowserBeforeNavigate2;
FOnNewWindow2: TWebBrowserNewWindow2;
FOnNavigateComplete2: TWebBrowserNavigateComplete2;
FOnDocumentComplete: TWebBrowserDocumentComplete;
FOnQuit: TNotifyEvent;
FOnVisible: TWebBrowserOnVisible;
FOnToolBar: TWebBrowserOnToolBar;
FOnMenuBar: TWebBrowserOnMenuBar;
FOnStatusBar: TWebBrowserOnStatusBar;
FOnFullScreen: TWebBrowserOnFullScreen;
FOnTheaterMode: TWebBrowserOnTheaterMode;
FIntf: IWebBrowser2;
function GetControlInterface: IWebBrowser2;
protected
procedure CreateControl;
procedure InitControlData; override;
function Get_Application: IDispatch;
function Get_Parent: IDispatch;
function Get_Container: IDispatch;
function Get_Document: IDispatch;
public
procedure GoBack;
procedure GoForward;
procedure GoHome;
procedure GoSearch;
procedure Navigate(const URL: WideString); overload;
procedure Navigate(const URL: WideString; var Flags: OleVariant); overload;
procedure Navigate(const URL: WideString; var Flags: OleVariant; var TargetFrameName: OleVariant); overload;
procedure Navigate(const URL: WideString; var Flags: OleVariant;
var TargetFrameName: OleVariant; var PostData: OleVariant); overload;
procedure Navigate(const URL: WideString; var Flags: OleVariant;
var TargetFrameName: OleVariant; var PostData: OleVariant;
var Headers: OleVariant); overload;
procedure Refresh;
procedure Refresh2; overload;
procedure Refresh2(var Level: OleVariant); overload;
procedure Stop;
procedure Quit;
procedure ClientToWindow(var pcx: SYSINT; var pcy: SYSINT);
procedure PutProperty(const Property_: WideString; vtValue: OleVariant);
function GetProperty(const Property_: WideString): OleVariant;
procedure Navigate2(var URL: OleVariant); overload;
procedure Navigate2(var URL: OleVariant; var Flags: OleVariant); overload;
procedure Navigate2(var URL: OleVariant; var Flags: OleVariant; var TargetFrameName: OleVariant); overload;
procedure Navigate2(var URL: OleVariant; var Flags: OleVariant;
var TargetFrameName: OleVariant; var PostData: OleVariant); overload;
procedure Navigate2(var URL: OleVariant; var Flags: OleVariant;
var TargetFrameName: OleVariant; var PostData: OleVariant;
var Headers: OleVariant); overload;
function QueryStatusWB(cmdID: OLECMDID): OLECMDF;
procedure ExecWB(cmdID: OLECMDID; cmdexecopt: OLECMDEXECOPT); overload;
procedure ExecWB(cmdID: OLECMDID; cmdexecopt: OLECMDEXECOPT; var pvaIn: OleVariant); overload;
procedure ExecWB(cmdID: OLECMDID; cmdexecopt: OLECMDEXECOPT; var pvaIn: OleVariant;
var pvaOut: OleVariant); overload;
procedure ShowBrowserBar(var pvaClsid: OleVariant); overload;
procedure ShowBrowserBar(var pvaClsid: OleVariant; var pvarShow: OleVariant); overload;
procedure ShowBrowserBar(var pvaClsid: OleVariant; var pvarShow: OleVariant;
var pvarSize: OleVariant); overload;
回复
neweb 2002-03-14
刚才我也用参数的 optional 试了一下,居然稀里糊涂地实现了,客户代码是 ASP:

<%
Set obj1 = Server.CreateObject("project1.neweb")
  obj1.ini

  obj1.SetCanvasColor 0,255,0
  obj1.SetCanvasColor "#F0F0F0"
  obj1.SetCanvasColor "#F0F0F0",0,255,0

Response.ContentType = "image/bmp"
Response.BinaryWrite obj1.bmp
%>

三种调用都可以,而且不象masterz() 说的只支持VARIANT or VARIANT *,long 也支持。(Delphi 6.0 without SP)

chechy(我爱洁洁):好象觉得还有什么地方没弄明白,能给个类似TWebBrowser的源码例子吗?
回复
qiubolecn 2002-03-14
我看,还是只好用EmptyParam了
回复
chechy 2002-03-14
这是Delphi语言特性的问题,刚才我试过了,即便在TypeLib中加入的optional以及default value,由于Interface不支持这些特性,所以在Delphi中必须使用两个参数。
上面在Interface增加的内容也许在VB是有用的,但在Delphi是无效的。
不过有一点,可以用Class来包装Interface,Delphi有现成的例子。比如TWebBrowser,光Navigator就overload好多个。
回复
masterz 2002-03-14
HRESULT MyFunc([in, optional] VARIANT Param1,
[out, optional] VARIANT Param2)
在interface definition中加上optional
The [optional] attribute specifies an optional parameter for a member function.The [optional] attribute is valid only if the parameter is of type VARIANT or VARIANT *.
回复
Bardo 2002-03-14
Com接口中实际是通过变量类型以及可选性来实现的
考虑是否可以使用win API的实现方法,
用可选参数
统一接口
内部调重载!
回复
neweb 2002-03-14
halfdream(哈欠) :
  确实是“先找到调用的识别号小的那个方法”,问题是参数个数和类型不匹配的时候,它不会继续往下找了,而是弹出错误。
  
  不知哪位有好办法?
回复
hzb 2002-03-14
关注,并提前。
回复
halfdream 2002-03-14
我没有试过在COM上实现方法名重载。
推测原因如下:
在C++中,方法名重载是编译器将方法名称和参数结合起来产生一个名称来
作为调用的标识。

而在COM中,你那样调用实质上先通过IDispatch中的
GetIDsOfNames方法取得接口成员识别号,然后再Invoke..
而GetIDsOfNames方法调用的时候,并不考虑你方法的参数。
这样,你每次调用,都是先找到调用的识别号小的那个方法。

回复
格兰特杨 2002-03-14
Interface可以有多态吗?关注。
回复
neweb 2002-03-14
请考虑另外一种情况:
 obj.SetTest(int,str)
 obj.SetTest(int,int)
 obj.SetTest(str,str)

实现用同一个方法可以获取不同类型的参数
回复
neweb 2002-03-14
SetTest(p1: Integer; p2: OleVariant) 方法的作用是改变属性TestValue的值
回复
相关推荐
发帖
Delphi
创建于2007-08-02

4875

社区成员

Delphi 开发及应用
申请成为版主
帖子事件
创建了帖子
2002-03-14 02:43
社区公告
暂无公告