关于脚本引擎,高手请进

shangwg 2007-04-20 11:03:01
搜索了很多帖子,现在已经实现了一般的脚本调用:比如
dim x
x=5
msgbox x,vbOK
MyObject.ShowAlert //自己的
MyObject2.Calc 5,6 //自己的
MyObject3.Height=88 //....

现在我不知道如何实现这种形式的脚本:
MyObject.MyObject2.Calc 5,6
MyObject.Childs[5].ShowSelf

比如:在Automation中,AddProperty中,参数类型应该填什么?LPDISPATCH?
请高手指点迷津,谢谢先!
...全文
934 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
shangwg 2007-06-04
  • 打赏
  • 举报
回复
soory,太高深了,我只能用浅显一点的语言表述:
我现在设计的思路主要模仿ACCESS,他里面报表的每一个控件都有一个属性叫ControlSource,当ControlSource的值直接是字段名时,报表打印出对应的值。但ControlSource可以是一个表达式,大部分情况下,我们把它设置为"=Sum([字段名])",这就是ACCESS实现合计的主要手段。我注意到,他也可以是一个比较复杂的表达式,比如"=[控件B]+Sum( IIF([字段B]>[字段C],[字段A],[字段D]/50) )",意思就是:控件B加上(如果字段B>字段C就是字段A否则字段D/50)的分组合计。

对于前面一种情况,我在脚本引擎中注册一个全局方法variant Sum(LPCTSTR fieldName),同时在自己的报表中跟踪好分组的边界,就可以实现了。
对于后一种情况,我根本没有办法在脚本引擎中注册方法,因为不知道用什么参数类型了。

现在我使用的是在前一种基础上进行变通的方法,先用regexp解析表达式,提取Sum等域合计,
用脚本计算Sum()中的表达式:([字段B]>[字段C],[字段A],[字段D]/50),计算n遍,同时记录集,进行Move动作,得到Sum的值,再最后用脚本得到CtlA的值:[控件B]+Sum('CtlA_SumExp1')。最终实现了和ACCESS中一样的功能,用的是这种古怪的方式!但我觉得ACCESS肯定不会用这种方式的。那个VBA机制有时间还得深入学习。

我猜想,它应该提供一个DataSourceX的对象,然后这个对象注册了Sum方法。
蒋晟 2007-06-04
  • 打赏
  • 举报
回复
你可以让CtlA实现IObjectWithSite,然后传递脚本引擎的IUnknown接口到控件,控件就可以调用脚本引擎了
蒋晟 2007-06-04
  • 打赏
  • 举报
回复
这样的啊
你得让CtlA和脚本引擎通讯来获得Sum([FieldA]的值
shangwg 2007-06-01
  • 打赏
  • 举报
回复
怎么是乱码?
重新问一遍,在脚本中注册函数这个我的确用了,就是用IActiveScriptParse::ParseScriptText来注册,之前用addobjectname加入对象。而vc中的对象通过idispatch公布了各种方法,属性。这是已经可以实现这样的表达式:
CtlA.ControlSource="=MyFunc1(CtlB.PropA)*CtlC+Sin(CtlD)"
借助于脚本可以在打印过程中计算出CtlA的值并打印了。

但是对于分组的域合计,比如Sum,我不清楚能不能借助脚本来完成,或者我没有理解脚本调用的过程。

因为有分组,所以CtlA.ControlSource="=Sum([FieldA])"这样的简单表达式,是针对特定分组的,而不是针对全部记录集的,实现起来都比较麻烦。

用过ACCESS和水晶报表,觉得不错,但是作为一个项目的报表解决方案好像庞大了一点。所以产生了这样的冲动,想试着搞一个web上的报表控件,当然水晶报表有这样的activex,但是局限于他自己的服务端,无法独立适用。
shangwg 2007-05-31
  • 打赏
  • 举报
回复
璋㈣阿鎸囧紩,鎴戠湅浜哰濡備綍浣垮簲鐢ㄧ▼搴忓叿鏈夎剼鏈敮鎸佸姛鑳?]杩欑瘒鏂囩珷锛屾壘浜嗗崐澶╋紝瑙夊緱涓嬮潰杩欐鍜屽煙鍚堣姣旇緝鐩稿儚锛? Eval锛氭眰鍊艰〃杈惧紡銆傛牸寮忎负object.Eval(expression) 銆?
IActiveScriptParse::ParseScriptText杩欎釜鎴戝凡缁忎娇鐢ㄤ簡锛屼絾鏄湪鍩熷悎璁″嚱鏁扮殑瀹炵幇涓婏紝
鎴戝洶鎯戠殑闂鏄細鍦╲c涓鏋滄垜涓哄叏灞€瀵硅薄Report瀹氫箟涓€涓柟娉昐um()锛屾毚闇茬粰script寮曟搸锛屽湪鍏跺弬鏁颁腑閫夋嫨浠€涔堢被鍨嬬殑鍙傛暟鍛紵姣斿Sum(variant var)杩欑被鐨勶紝鍙€夌殑鍙傛暟浠巗hort,long...涓€鐩村埌OLE_OPTEXCLUSIVE*,鍝竴涓搴旂殑鏄細[琛ㄨ揪寮廬锛? 鍏跺疄濡傛灉鏄崟涓瓧娈电殑鍩熷悎璁★紝鍙互瀹氫箟涓篠um(LPCTSTR fieldName),涔熻浜嬫儏鏍规湰涓嶆槸鎴戠悊瑙g殑閭f牱锛屽湪娌℃湁鍔炴硶鐨勬儏鍐典笅锛屾垜鐜板湪鏄垎鏋愯〃杈惧紡锛屾娊鍙栧叾涓璖um(......)鐨勯儴鍒嗭紝缁撳悎鑴氭湰鍜屽唴閮⊿um鍑芥暟瀹炵幇鐨勩€?
鏃╁勾鏇剧粡浣跨敤杩嘇CCESS锛岃寰椾粬鐨勬姤琛ㄥ姛鑳藉緢寮哄ぇ锛屽悗鏉ヤ娇鐢ㄨ繃姘存櫠鎶ヨ〃锛屼袱鑰呭悇鏈夊崈绉嬶紝ACCESS渚濊禆VBA鍑犱箮瀹炵幇浜嗗悇绉嶅皯瑙佺殑鍔熻兘锛屾瘮濡傞〉鍚堣锛岃€屾按鏅舵姤琛ㄤ緷闈犵壒鏈夌殑杩愯鏃跺彲鍔ㄦ€佽璁$殑鐗规€у崰鎹簡澶х墖甯傚満銆傝€屽浗鍐呯殑鎶ヨ〃锛屼粎鍑虹幇浜嗗崕琛ㄧ瓑锛岀敱浜庢病鏈夋繁鍏ョ爺绌惰繃锛屽嚟鍗拌薄璁板緱閮芥槸涓€绉峠rid鎬ц川鐨勶紝寰堝鏄撹Excel鍙栦唬銆? 鑰屽浜庣郴缁熷紑鍙戯紝浼间箮鍙湁姘存櫠鎶ヨ〃杩欎竴绉嶆姤琛ㄨВ鍐虫柟妗堬紝缁濆ぇ澶氭暟鏄痙ao ban鍦颁娇鐢ㄣ€傛湁娌℃湁濂界殑鍥戒骇鐨刐[[鎶ヨ〃]]]宸ュ叿锛熷湪鍝噷鍛紵濡傛灉鏄痝rid寮忓伐鍏凤紝璇蜂笉瑕佽窡璐淬€
蒋晟 2007-05-30
  • 打赏
  • 举报
回复
http://blog.csdn.net/jiangsheng/archive/2003/11/09/3795.aspx
去看看
shangwg 2007-05-30
  • 打赏
  • 举报
回复
up
shangwg 2007-05-28
  • 打赏
  • 举报
回复
jiangsheng(蒋晟.Net[MVP])
可否明示?谢谢了!
shangwg 2007-05-27
  • 打赏
  • 举报
回复
[可以在脚本引擎的全局名称空间里面加入自己的函数]
我曾经考虑过这样做,可是事情比预想的要复杂:
分组1中的控件A
分组2中的控件B

A.ControlSource="=Sin(B)+Sum(IIF([字段1]>[字段2],[字段3],[字段4])*20+100)"

那么[自己的函数]该怎样定义呢?我理解脚本引擎会计算出
IIF([字段1]>[字段2],[字段3],[字段4])*20+100
比如=50
然后调用Sum(50),这和域合计的意图就不符了。不知道这样理解对不对?

目前我这里是自己解析表达式的
蒋晟 2007-05-27
  • 打赏
  • 举报
回复
IActiveScriptParse::ParseScriptText
shangwg 2007-05-26
  • 打赏
  • 举报
回复
由于不熟悉VC,痛苦万分,基本的东西都要搜帮助。
不过,硬着头皮终于完成了运行时的ocx,虽然有些bug,自己觉得还是不容易了。
不知道这里又没有放demo的地方,

给一个连接:http://221.137.151.87/test1.htm

实现的功能是尽量靠近MSAccess的报表的。使用的环境是IE5.5以上,完全支持XML的。
提供方法:DoPrintSetup(),
SetXmlRpt(报表定义的XML),
SetADOData(RecordSetPtr[ADO记录集]),
SetXMLData(XML形式的数据),
OnPreview()预览,
OnPrint()打印。
提供的事件:节的名称_OnPrint(PrintCount)
节的名称_OnFormat(FormatCount)
节的名称_OnRetreat(PrintCount)
Report_OnOpen()
Report_NoData()
支持JavaScript和VBScript脚本(特意实现了iif函数)
支持的域合计函数为Sum,Avg,Max,Min,Count
支持的控件为标签,文本框,形状(线,矩形,椭圆),图片(base64嵌入)

(由于没有完工,所以没有签名,ie的安全性需要设下才能运行)

主要的目的:为了用于web上的报表打印,当然,是指精确定位的连续打印,传统意义上的报表。其他表格式的打印控件已经有n多。
现在主要的技术问题已经解决,下面是需要调试和完善。设计时不打算做了,能用就行了,自己编辑xml文件或者做个access转换报表定义的工具。
shangwg 2007-05-26
  • 打赏
  • 举报
回复
thanks
jackwuwei 2007-05-26
  • 打赏
  • 举报
回复
http://www.khp.com.cn/gratis_resource/5084.rar
这个陆其明的书《脚本驱动的应用软件开发方法与实践》 的例子
里面有你想实现的例子
shangwg 2007-05-26
  • 打赏
  • 举报
回复
忘了,计量尺度:0.01mm
蒋晟 2007-05-17
  • 打赏
  • 举报
回复
可以在脚本引擎的全局名称空间里面加入你自己的函数啊
shangwg 2007-05-14
  • 打赏
  • 举报
回复
做了两个月,好不容易搞出了一点眉目。
脚本、分页之类的已经基本搞懂了。现在剩下一个非常棘手的问题:
合计函数的实现!
最基本的恐怕是自己分析表达式,然后计算结果。但是这样灵活性很差。比如一个合计可以写成下面几种:
=Sum([ItemQty])
=Sum([ItemQty]*5+2)
=Sum(Sin([ItemQty]+Cos([ItemQty]))
=Max([Price]/1.17)*Sum([ItemQty])
=Sum([Price]*IIF([Price]>3.00,[ItemQty],0))
要完全解析这些表达式,实在太麻烦。
有没有其他的实现方式呢?
查了ADO的资料,其中SHAPE命令能实现基本的合计函数,但是不能解析脚本。
如果用脚本,好像又不行,没头绪。
有人做过这样的事吗?????
http://221.137.151.87/test1.htm
shangwg 2007-04-23
  • 打赏
  • 举报
回复
搞定,下面做应用
shangwg 2007-04-22
  • 打赏
  • 举报
回复
按照网上的零零碎碎的例子,但是事件没有触发。
触发事件时,跟踪到:
COleException, scode = DISP_E_UNKNOWNNAME ($80020006).
是不是连接点出了什么问题?
苦于没有完整的例子,只好自己探索
蒋晟 2007-04-22
  • 打赏
  • 举报
回复
http://blog.csdn.net/jiangsheng/archive/2003/11/09/3795.aspx
长尾巴的悟空 2007-04-21
  • 打赏
  • 举报
回复
看不懂,什么代码?
加载更多回复(5)

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧