Guest:
Register
|
Login
|
Member List
|
Search
|
Statistics
|
FAQ
Language
----------
Simplifed Chinese
Traditional Chinese
English
CnPack Forum
»
CnPack IDE 专家包(CnWizards)
» 请问 CnActiveScriptWindow 如何使用??
‹‹ Last Thread
|
Next Thread ››
Poll
Trade
Reward
Activity
Printable Version
|
Email to Friend
|
Subscription
|
Favorites
Subject: 请问 CnActiveScriptWindow 如何使用??
ben2000
新警察
UID 41057
Digest Posts 0
Credits 14
Posts 6
点点分 14
Reading Access 10
Registered 2008-10-6
Status Offline
#1
Post at 2008-10-6 18:10
Profile
|
Blog
|
P.M.
请问 CnActiveScriptWindow 如何使用??
我在CB6.0中,为什么我的 code 脚本并不执行?? 谢谢各位指教
void __fastcall TForm1::Button1Click(TObject *Sender)
{
WideString code="";
code+=L"Function Func() \r\n";
code +=L"Func = 12 \r\n";
code +=L"msgbox Func \r\n";
code +=L"End Function \r\n";
OleVariant s=this->CnActiveScriptWindow1->Execute(code);
if (!s.IsNull())
{
ShowMessage(String(s));
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::CnActiveScriptWindow1Error(TObject *Sender,
int Line, int Pos, AnsiString ASrc, AnsiString ADescription)
{
ShowMessage("错误" + String(ASrc) + "\r\n" + ADescription );
}
jAmEs_
灌水部部长
UID 886
Digest Posts 0
Credits 1134
Posts 600
点点分 1134
Reading Access 10
Registered 2005-6-5
Location 广东
Status Offline
#2
Post at 2008-10-6 21:19
Profile
|
Blog
|
P.M.
这样行不?
void __fastcall TForm1::Button1Click(TObject *Sender)
{
WideString code="";
code+=L"Function Func() \r\n";
code +=L"Func = 12 \r\n";
code +=L"msgbox Func \r\n";
code +=L"End Function \r\n";
code +=L"Func \r\n"; // 增加一行
OleVariant s=this->CnActiveScriptWindow1->Execute(code);
if (!s.IsNull())
{
ShowMessage(String(s));
}
}
ben2000
新警察
UID 41057
Digest Posts 0
Credits 14
Posts 6
点点分 14
Reading Access 10
Registered 2008-10-6
Status Offline
#3
Post at 2008-10-6 23:01
Profile
|
Blog
|
P.M.
非常感谢楼上的大哥回复,果然能执行了,但是还有一个小问题,就是我在VBSCRIPT 脚本中的的计算结果 Func = 12 并不传回
OleVariant s=this->CnActiveScriptWindow1->Execute(code) 给 s ,我想取回运行结果,应该怎么办???
ben2000
新警察
UID 41057
Digest Posts 0
Credits 14
Posts 6
点点分 14
Reading Access 10
Registered 2008-10-6
Status Offline
#4
Post at 2008-10-7 09:27
Profile
|
Blog
|
P.M.
再求各位大哥帮帮我,谢谢!!
如何返回 脚本中的运行结果给程序??
或者告诉我,有关这个控件的使用帮助哪里有??
[
本帖最后由 ben2000 于 2008-10-7 09:33 编辑
]
ben2000
新警察
UID 41057
Digest Posts 0
Credits 14
Posts 6
点点分 14
Reading Access 10
Registered 2008-10-6
Status Offline
#5
Post at 2008-10-7 11:06
Profile
|
Blog
|
P.M.
沉了,再顶,希望各位大侠帮帮我
jAmEs_
灌水部部长
UID 886
Digest Posts 0
Credits 1134
Posts 600
点点分 1134
Reading Access 10
Registered 2005-6-5
Location 广东
Status Offline
#6
Post at 2008-10-7 11:26
Profile
|
Blog
|
P.M.
問下其他人吧,我這個沒試過,這個組件也許不支持這個,但是可以做計算:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
WideString code="";
code=L"\"12\"";
OleVariant s=this->CnActiveScriptWindow1->RunExpression(code);
if (!s.IsNull())
{
ShowMessage(String(s));
}
}
如果要計算帶函數,可能要用到TScriptControl
ben2000
新警察
UID 41057
Digest Posts 0
Credits 14
Posts 6
点点分 14
Reading Access 10
Registered 2008-10-6
Status Offline
#7
Post at 2008-10-7 12:02
Profile
|
Blog
|
P.M.
哦,执行表达式的话,我试过了,可以返回值的,但是就是执行函数不能返回值??这是cnpack 官方论坛,如果这里都问不到人的话,我想没有人会知道了,求哪个知道的大哥,出来解释一下,是没有这个功能呢,还是我用法不对??
楼上的这样大哥,谢谢你的回复,你说的TScriptControl 是微软的Activex的控件 msscript.ocx 吗??
jAmEs_
灌水部部长
UID 886
Digest Posts 0
Credits 1134
Posts 600
点点分 1134
Reading Access 10
Registered 2005-6-5
Location 广东
Status Offline
#8
Post at 2008-10-7 15:44
Profile
|
Blog
|
P.M.
是的
可以網上找一下例子
zjy
管理员
UID 2
Digest Posts
6
Credits 2385
Posts 1543
点点分 2385
Reading Access 102
Registered 2002-12-16
Location China
Status Offline
#9
Post at 2008-10-7 15:54
Profile
|
Site
|
Blog
|
P.M.
CnPack 中 CnActiveScript 组件只是对 MS 的 ActiveScript 的封装,最初的设计目的是为了用 ActiveScript 脚本来调用 Delphi 的对象和函数,不过这部分功能目前还不太完善,源代码中 CnASHostServices.pas,CnASIDispatchProxy.pas,CnASInvoker.pas 等单元就是用来在 Delphi 对象和 ActiveSctipt 中搭桥的。
如果只是简单的在程序中使用 ActiveScript 脚本来计算的话,可以这样使用:
var
a: OleVariant;
begin
CnActiveScriptWindow1.CleanBeforeRun := False; // 防止脚本执行完成后释放脚本引擎
CnActiveScriptWindow1.Execute( // 先调用脚本引擎实现函数定义
'Function Func()' + #13#10 +
' Func = 12' + #13#10 +
' msgbox Func' + #13#10 +
'End Function' + #13#10);
a := CnActiveScriptWindow1.RunExpression('Func'); // 再将已定义的函数作为表达式计算
end;
Zhou JingYu
CnPack Administrator
http://www.cnpack.org/
ben2000
新警察
UID 41057
Digest Posts 0
Credits 14
Posts 6
点点分 14
Reading Access 10
Registered 2008-10-6
Status Offline
#10
Post at 2008-10-7 16:47
Profile
|
Blog
|
P.M.
谢谢!!
还是老大有办法呀,
我把软件修改如下,基本上可以满足我的要求了,再次感谢
WideString code="";
code+=L"Function Func(a,b) \r\n";
code +=L"Func = a * b \r\n";
code +=L"'msgbox Func \r\n";
code +=L"End Function \r\n";
code +=L"Func c,d \r\n";
this->CnActiveScriptWindow1->CleanBeforeRun=false;
this->CnActiveScriptWindow1->Execute(code);
OleVariant s=this->CnActiveScriptWindow1->RunExpression("Func(2.15,5)");
if (!s.IsNull())
{
ShowMessage("结果:" + String(s));
}
zjy
管理员
UID 2
Digest Posts
6
Credits 2385
Posts 1543
点点分 2385
Reading Access 102
Registered 2002-12-16
Location China
Status Offline
#11
Post at 2008-10-7 16:52
Profile
|
Site
|
Blog
|
P.M.
刚写了个 CnActiveScript 的例子
演示了使用脚本调用 Delphi 对象的方法,需要 D6/CB6 以上版本,已提交到CVS中。
附件解压到 cnpack\Examples 目录下,在 Delphi7 下测试通过。
Attachment
:
CnActiveScript.rar
(2008-10-7 16:52, 9.57 K)
Download count 403
Zhou JingYu
CnPack Administrator
http://www.cnpack.org/
jAmEs_
灌水部部长
UID 886
Digest Posts 0
Credits 1134
Posts 600
点点分 1134
Reading Access 10
Registered 2005-6-5
Location 广东
Status Offline
#12
Post at 2008-10-7 17:17
Profile
|
Blog
|
P.M.
還是老大牛,呵呵
本來也想通過CleanBeforeRun來處理的,但是搞不清怎么搞
不過這樣我想問問:
Execute再RunExpression,是不是等於執行兩次了?
本來也想通過AddNamedItem來交換數據的,誰知道直接傳遞接口對象不行,原來是這樣調用的,呵呵
jAmEs_
灌水部部长
UID 886
Digest Posts 0
Credits 1134
Posts 600
点点分 1134
Reading Access 10
Registered 2005-6-5
Location 广东
Status Offline
#13
Post at 2008-10-7 17:22
Profile
|
Blog
|
P.M.
剛才看了一下源碼,突然想到,我的接口是沒有實現雙重接口的,腳本語言調用部分沒有實現,只能用例子裡面的GetIDispatchProxy來產生雙重接口的接口吧,難怪不行。
zjy
管理员
UID 2
Digest Posts
6
Credits 2385
Posts 1543
点点分 2385
Reading Access 102
Registered 2002-12-16
Location China
Status Offline
#14
Post at 2008-10-7 17:31
Profile
|
Site
|
Blog
|
P.M.
TCnActiveScriptSite 里头封装了一个 IActiveScript 接口的引擎,每个引擎创建后内部状态会保持,如果不清理引擎就可以实现分段执行脚本的功能。
AddNamedItem 增加的接口要求是支持 IDispatch 的接口,因为脚本只能通过方法名或ID用 Invoke 来调用。而在 Delphi 里头直接创建支持 IDispatch 接口的对象很麻烦,要用自动化对象和 tlb 这些东西。CnASIDispatchProxy 和 CnASInvoker 就是通过使用 D6 中为支持 SOAP 而引入的接口 RTTI 来创建一个支持动态 Invoke 的 IDispatch 代理接口以便脚本调用。最初的想法是将 VCL 中常用的类作为公共项注册到脚本引擎中,也就是 CnASCommon.pas 中计划完成的功能。后来没时间来完善,就把这个半成品放到组件包里了。貌似没人对这个组件有兴趣,也就没做文档和 Demo。
jAmEs_ 要是有兴趣的话,可以继续来完善它。
Zhou JingYu
CnPack Administrator
http://www.cnpack.org/
zjy
管理员
UID 2
Digest Posts
6
Credits 2385
Posts 1543
点点分 2385
Reading Access 102
Registered 2002-12-16
Location China
Status Offline
#15
Post at 2008-10-10 16:55
Profile
|
Site
|
Blog
|
P.M.
新思路
刚才看到橙子的blog:
D2009反射?新功能还是骗局?
http://hi.baidu.com/rarnu/blog/item/17f0fff2d8ef2f15b17ec5dc.html
原来在D7下就可以动态调用方法,看来通过接口RTTI来间接实现动态调用的方法就可以不用了,有空再来改改。
Zhou JingYu
CnPack Administrator
http://www.cnpack.org/
Poll
Trade
Reward
Activity
CnPack Forum
CnPack English Forum
> CnWizards IDE Wizards
> CVSTracNT
> Announcements & Others
All times are GMT++8, the time now is 2024-11-23 10:14
Powered by
Discuz!
5.0.0
© 2001-2006
Comsenz Inc.
Processed in 0.011532 second(s), 8 queries , Gzip enabled
TOP
Clear Cookies
-
Contact Us
-
CnPack Website
-
Archiver
-
WAP
Member's CP Home
Edit Profile
Credits Transaction
Public User Groups
Buddy List
Main
Page Views
User Agents
Posts History
Top Forums
Top Threads
Post Ranking
Credit Ranking
Online Time
Team
Moderation Stats