能向ActiveForm传递参数吗?(50分)

  • 主题发起人 wx_zhang
  • 开始时间
不仅可以传参,还可以响应事件。

<SCRIPT FOR="r" EVENT="OnMsg(msg)" LANGUAGE="JScript">
mymsg = msg;

window.close();
</SCRIPT>
 
下面以读取并显示一个IP地址为例,来展示Delphi的ActiveForm如何编写代码读取网址参数:

一、新建一个ActiveForm。
二、菜单View->Type Library,以显示类型库。右击IActiveFormX->New->Property新建属性,并将属性名称改为MyIP,再在右边的type值选WideString,即修改属性的类型为字符串。
三、回到ActiveFormX窗口的代码页,可以看到已自动加入以下代码:
function TActiveFormX.Get_MyIP: WideString;
begin

end;

procedure TActiveFormX.Set_MyIP(const Value: WideString);
begin

end;
四、自定义一个全局变量v:string,并修改Set_MyIP过程:
procedure TActiveFormX.Set_MyIP(const Value: WideString);
begin //将网址传来的参数赋给全局变量v
v:=Value;
end;
五、往窗体加入一个按钮Button1,在其OnClick事件加入:
ShowMessage('传入的网址是:'+v);
六、菜单Project->Web Deployment Option...填写有关发布参数。
七、菜单Project->Web Deploy发布,可得*.htm和*.ocx两个文件。然后修改*.htm,在<object ...>和</object>之间加入<param name="MyIP" value="192.168.0.3">。如下所示:
<html>
<head>
<title>Active接收网址参数测试</title>
<OBJECT
classid="clsid:CC721C00-9C4B-42DC-B3F6-4C78DDFD4A1E"
codebase="GetIP.ocx"
>
<param name="MyIP" value="192.168.0.3">
</OBJECT>
</head>
<body>
</body>
</html>
八、执行该网页,点击ActiveFormX中的Button1,显示信息:“传入的网址是:192.168.0.3”。成功!
九、总结:人们总是习惯于“对象.属性”来取MyIP的值,如TActiveFormX.MyIP,结果自然无法通过。殊不知是通过全局变量来保存网址参数。我想具体执行流程是:客户访问网页->网页带有参数MyIP->激发procedure TActiveFormX.Set_MyIP(const Value: WideString)过程->此刻的Value值为“192.168.0.3”->将此值赋给全局变量v。不知道对不对,还请各位高手赐教。
 
偶哭!!!!
myip 那个
“二、菜单View->Type Library,以显示类型库。右击IActiveFormX->New->Property新建属性,并将属性名称改为MyIP,再在右边的type值选WideString,即修改属性的类型为字符串。”

偶的 type 里没有wideString啊! 连 string 都没有! 如何搞一下?


 
BSTR就是WideString, 没有string的,因为OCX要求用unicode
 
to carolson2:
点击菜单tools-->Enviroment Option...-->Type Library-->Language,
默认为选中IDL,将其改选为Pascal,即可。
字符串类型: WideString(Pascal方式) <===> BSTR(IDL方式)
 
borland新闻组的一段code
Hmmm. I followed an example from one of these newsgroups and got it working
without a hitch. Did you declare support for IPersistPropertyBag in the
class definition?
Here is what mine looks like, with non-essentials removed:
class TMyActiveForm = class(TActiveForm, IMyActiveForm,
IPersistPropertyBag)
protected:
// IPersistPropertyBag
function IPersistPropertyBag.GetClassID = PersistPropertyBagGetClassID;
function IPersistPropertyBag.InitNew = PersistPropertyBagInitNew;
function IPersistPropertyBag.Load = PersistPropertyBagLoad;
function IPersistPropertyBag.Save = PersistPropertyBagSave;
function PersistPropertyBagInitNew: HResult
stdcall;
function PersistPropertyBagGetClassID(out classID: TCLSID): HResult;stdcall;
function PersistPropertyBagLoad(const pPropBag: IPropertyBag
const pErrorLog: IErrorLog): HResult
stdcall;
function PersistPropertyBagSave(const pPropBag: IPropertyBag;
fClearDirty: BOOL
fSaveAllProperties: BOOL): HResult
stdcall;
end;
implementation
(*
* IPersistPropertyBag
*)
function TMyActiveForm.PersistPropertyBagLoad(const pPropBag: IPropertyBag;
const pErrorLog: IErrorLog): HResult;
var
v : OleVariant;
begin
if pPropBag.Read('ShowLegend', v, pErrorLog) = S_OK then
Set_ShowLegend( v );
if pPropBag.Read('XMLDSOID', v, pErrorLog) = S_OK then
Set_XMLDSOID( v );
result := S_OK;
end;
function TMyActiveForm..PersistPropertyBagSave(const pPropBag: IProper
tyBag;
fClearDirty, fSaveAllProperties: BOOL): HResult;
var
v : OleVariant;
begin
v := FShowLegend;
pPropBag.Write( 'ShowLegend', v );
v := FXMLDSOID;
pPropBag.Write( 'XMLDSOID', v );
result := S_OK;
end;
function TMyActiveForm..PersistPropertyBagGetClassID( out classID: TCLSID):HResult;
begin
try
classID := Class_MyActiveForm;
Result := S_OK;
except
end;
end;
function TMyActiveForm.PersistPropertyBagInitNew: HResult;
begin
try
result := S_OK;
except
end;
end;
 
function TActiveFormX.PersistPropertyBagLoad(const pPropBag: IPropertyBag;const pErrorLog: IErrorLog): HResult;
var
v : OleVariant;
begin
beep;
//读参数abcd的值
if pPropBag.Read('abcd', v, pErrorLog) = S_OK then
showmessage(v);
result := S_OK;
end
 
还可以传递 事件 呢
<HTML>
<HEAD>

<BODY>
<SCRIPT LANGUAGE="VBScript">
<!--
SUB Window_Onload
r.serverPath = "http://HFGHFGHFG/test/data/"

r.ClearQueryId()
r.AddQueryid("SH.cx7.20030909.N_89")


r.ShowReport()

End Sub
//-->
</SCRIPT>

<SCRIPT FOR="r" EVENT="OnMsg(msg)" LANGUAGE="JScript">
mymsg = msg;

alert(mymsg);

window.close();

</SCRIPT>



<OBJECT
id="r"
classid="clsid:CC721C00-9C4B-42DC-B3F6-4C78DDFD4A1E"
codebase="http://HFGHFGHFG/test/data/LisReport_Proj.cab#version=1,0,0,120"
width=100%
height=100%
align=center
hspace=0
vspace=0

>
</OBJECT>





</BODY>
</HTML>
 
我也在开发这方面,遇到了同样的问题。
参数是能传入的,但在show出的时候却是空的,我在VB中测试时就能行的(不为空),好像不同步一样。
我传入的参数show后不为空,只是在初始化的进程时为空,但我必需要在初始化的同时得到这个传入的参数。(VB测试时,初始化时不为空)
请问各位知道是什么原因吗?
我的QQ:304804129,一起来讨论一下。
 
顶部