如何实现这样一个接口?(200分)

  • 主题发起人 主题发起人 xiaogew
  • 开始时间 开始时间
X

xiaogew

Unregistered / Unconfirmed
GUEST, unregistred user!
用过ASP的人都见过下面的语法:
 Request.Form(element)[(index)|.Count]
--------------------------------------- 
 dim v
 v=Request.Form        //返回字符串,表单内容
 v=Request.Form("input1")    //返回字符串,输入项的值
 v=Request.Form("input1")(1)   //返回字符串,多选时的一个值
 v=Request.Form.Count      //返回整数,字符串对个数
 v=Request.Form("input1").Count //返回整数,多选时值的个数

注:“input1"为Web页中一个输入项的name属性,下同。

在Delphi中引入ASP的类型库,IRequest、IRequestDictionary声明如下:

IRequest = interface(IDispatch)
.
function Get_Form: IRequestDictionary; safecall;
.
property Form: IRequestDictionary read Get_Form;
.
end;

IRequestDictionary = interface(IDispatch)
function Get_Item(Var_: OleVariant): OleVariant; safecall;
function Get__NewEnum: IUnknown; safecall;
function Get_Count: SYSINT; safecall;
function Get_Key(VarKey: OleVariant): OleVariant; safecall;
property Item[Var_: OleVariant]: OleVariant read Get_Item; default;
property _NewEnum: IUnknown read Get__NewEnum;
property Count: SYSINT read Get_Count;
property Key[VarKey: OleVariant]: OleVariant read Get_Key;
end;

尝试如下代码:
procedure TiwForm.OnStartPage(const AScriptingContext: IUnknown);
var
aContext:IScriptingContext;
aRequest:IRequest;
 aDictionary:IRequestDictionary;
tv:variant;
ts:string;
ti:integer;
begin
aContext:=AScriptingContext as IScriptingContext;
aRequest:=aContext.Request;
aDictionary:=aRequest.Form;
tv:=aDictionary; //此句不可少
ts:=tv;        //返回字符串
 ts=tv('input1')    //返回字符串,输入项的值
 ts=tv('input1')(1)   //返回字符串,多选时的一个值
 ti=tv.Count      //返回整数,字符串对个数
 ti=tv('input1').Count //返回整数,多选时值的个数
 .....
end;
在CBuilder测试结果一样。

有没有注意到aDictonary即IRequestDictionary调用的邪门之处,
如何实现这样一个调用方便的接口。

 
variant类型呀,可变的类型。

Delphi在运行时,自动进行类型转换与查找。你自己也可以的。

比如常用的
var Word:Variant;
begin
Word:=CreateOleObject('Word....");

一样的,你自己也可以写出来的。
 
  请注意每一句的返回类型,虽然使用了变体,但变体的类型转换是有限的,不可能将一将
对象转换成一个字符串,也不可能将一个普通的IDispatch接口转换成一个字符串。
1 aDictionary:=aRequest.Form;  //aDictionary 是一个IDispath接口
2 tv:=aDictionary; //此句不可少,tv变体中应该包含的是aDictonary接口的指针
3 ts:=tv;        //*??????竟然可以给字符串变量赋值,结果OK!*******
4 ts=tv('input1')    //返回字符串,输入项的值**此句不希奇----|
5 ts=tv('input1')(1)   //但加上 Index 再样返回字符串就有点奇了 <-
6 ti=tv.Count      //第3句tv可以转换成字符串,但它竟还带有方法Count?????
7 ti=tv('input1').Count //请注意第4句的类型转换???????????????????
 ?????有誰写出过这样的组件或接口????????
  可以这样的灵活的调用
  
 
 
后退
顶部