authorware7程序设计基本的教学文章--脚本函数(1)

来源:互联网
更新时间:2016/12/13 6:58:50
责任编辑:鲁晓倩
字体:

3.5  脚本函数

脚本函数(Script Function)是由设计人员利用AWS自行编写的函数,与代码片段相比,脚本函数具有更加完备的功能。使用脚本函数就如同使用系统函数一样,可以向脚本函数传递参数,或者接收脚本函数的返回值。通过将常用的过程(例如3.4节中介绍的常用字符串处理过程)定义为脚本函数,可以大大提高设计人员的开发效率。 脚本函数可以有3种存在形式:内部脚本函数、外部脚本函数和字符串脚本函数。 与创建代码片段相比,创建脚本函数要稍微复杂一些,但是设计人员付出的这种努力会带来大量的回报。代码片段就像是预定义的宏,需要在程序中展开代码才能进行工作,而脚本函数是真正的函数,其实现细节被封装在【脚本函数】设计图标内部,便于对代码进行统一管理。设计人员可以随时补充和完善脚本函数的功能,只要保证函数接口(参数和返回值)不发生变化,这些修改工作不会给程序中的其他内容带来任何不利影响。

3.5.1  内部脚本函数

内部脚本函数存在于【脚本函数】设计图标之中。【脚本函数】设计图标并不是一种新的设计图标,而是运算设计图标的一种新形式。可以通过以下步骤创建一个【脚本函数】设计图标。 (1)向流程线上拖放一个运算设计图标,并以所需函数名对运算设计图标进行命名。该设计图标名必须是惟一的,不能与其他设计图标同名,但是可以与系统函数同名。现在将其命名为“Box”。如图3-38所示。 点击图片看大图学网 www.xue163.com
(2)执行Modify>Icon>Properties菜单命令,打开运算设计图标属性检查器,在属性检查器中打开Contains Script Function复选框,将当前运算设计图标定义为【脚本函数】设计图标,如图3-39所示。 (3)单击属性检查器中的【OK】按钮。此时运算设计图标就变为【脚本函数】设计图标,如图3-40所示。此时设计图标的外观发生了变化。双击【脚本函数】设计图标打开【运算】窗口,可以像使用普通运算设计图标一样向其中输入代码。向“Box”运算窗口中输入以下代码: repeat with i:= 1 to 100     Box(1, 0, 0, i, i )     i:=i+1 end repeat 点击图片看大图 图3-39  对运算设计图标进行属性设置 点击图片看大图 图3-40  【脚本函数】设计图标创建完毕 就创建了在【演示】窗口中绘制50个矩形这个简单的脚本函数。 现在运行程序不会在【演示】窗口中看到任何矩形。【脚本函数】设计图标是一种特殊的【运算】设计图标,它与普通【运算】设计图标的不同之处在于:当程序执行到流程线上的脚本设计图标时会略过它,并不自动执行其中的代码。脚本函数只能通过系统函数CallScriptIcon进行调用。现在向【设计】窗口中添加一个【运算】设计图标,如图3-41所示,向“call box”设计图标中输入函数调用语句: CallScriptIcon(@"Box") 就可以调用脚本函数Box,在【演示】窗口中绘制矩形。由于Authorware不会主动执行“Box”设计图标,因此两个设计图标的相对位置关系并不重要:将“call box”设计图标放置在“Box”设计图标之前会得到同样的运行结果。 对应的范例程序是Chapter03文件夹下的scripticon-box.a7p。   点击图片看大图     点击图片看大图 图3-41  调用脚本函数 与系统函数相比,脚本函数同样可以具有参数和返回值。看一下系统函数CallScriptIcon完整的调用语法: result:= CallScriptIcon(IconID@"IconTitle" [,args] [,byValue] [,owner]) 其中惟一的必选参数是【脚本函数】设计图标的名称。可选参数args就是向被调用的脚本函数传递的参数,该参数可以是各种类型,包括从最简单的字符串类型到复杂的多维列表。脚本函数通过名为Args的图标变量来接受传递过来的参数,通过名为Result的图标变量返回执行结果。 例如要创建一个在【演示】窗口中随机绘制多个矩形的脚本函数RandomBox,首先为其创建图标变量Args@"RandomBox",然后通过参数Args指定绘制次数: repeat with i:= 1 to Args@"RandomBox" --随机挑选一种覆盖模式     SetMode(Random(0,4,1)) --随机设置边框的颜色     SetFrame(1, RGB(Random(0,255,1), Random(0,255,1), Random(0,255,1))) --随机设置填充颜色     SetFill(1, RGB(Random(0,255,1), Random(0,255,1), Random(0,255,1))) --随机设置矩形的位置和大小并进行绘制     Box(Random(1,8,1), Random(1,WindowWidth,1), Random(1,WindowHeight,1),﹁                  Random(1,WindowWidth,1), Random(1,WindowHeight,1)) end repeat 在上述过程中,系统函数Random()根据【演示】窗口宽度(WindowWidth)和高度(WindowHeight),随机决定矩形的大小、模式、颜色、位置和边框,然后由系统函数Box在屏幕中进行绘制。图标变量Args在这里决定了循环执行的次数,即绘制矩形的数目。在一个【运算】设计图标中输入以下函数调用语句,可以实现在【演示】窗口内部随机绘制10个矩形的目的。 CallScriptIcon(@"RandomBox ", 10) 程序流程和运行结果如图3-42所示。接下来继续创建两个脚本函数:RandomCircle和RandomLine,分别用于随机绘制圆形和线段。 点击图片看大图     点击图片看大图 图3-42  向脚本函数传递参数 --以下过程位于“RandomCircle”设计图标中 repeat with i:= 1 to Args@"RandomBox"     SetMode(Random(0,4,1))     SetFrame(1, RGB(Random(0,255,1), Random(0,255,1), Random(0,255,1)))     SetFill(1, RGB(Random(0,255,1), Random(0,255,1), Random(0,255,1)))     Box(Random(1,8,1), Random(1,WindowWidth,1), Random(1,WindowHeight,1), ﹁ Random(1,WindowWidth,1), Random(1,WindowHeight,1)) end repeat   --以下过程位于“RandomLine”设计图标中 repeat with i:= 1 to Args@"RandomLine"     SetMode(Random(0,4,1))     SetFrame(1, RGB(Random(0,255,1), Random(0,255,1), Random(0,255,1))) --随机挑选箭头样式     SetLine(Random(0,3,1))     Line(Random(1,8,1), Random(1,WindowWidth,1), Random(1,WindowHeight,1), ﹁ Random(1,WindowWidth,1), Random(1,WindowHeight,1)) end repeat 然后在【运算】设计图标之中就可以通过以下函数调用语句,调用上述脚本函数开始绘图: CallScriptIcon(@"RandomCircle",10) CallScriptIcon(@"RandomLine",10) 脚本函数调用语句不必手工输入。在创建新的脚本函数之后,函数面板中Script Icons类别下就会增加新的函数,如图3-43所示。双击函数名称,就可以直接将函数调用语句粘贴到【运算】窗口中,然后再根据需要补充调用参数就可以了。   点击图片看大图 图3-43  新的函数 Chapter03文件夹中的范例程序randomdraw.a7p演示了上述3个脚本函数的使用:如图3-44所示,单击【Continue】按钮,就可以在【演示】窗口中分别看到10个矩形、10个圆形和10条线段。 点击图片看大图      点击图片看大图 图3-44  范例程序randomdraw.a7p

3.5.2  变量与参数

上述脚本函数中都使用了计数变量i,该变量属于整个程序,而并非某个特定的脚本函数所有,任何设计图标都可能使用该变量。为避免脚本函数和其他过程之间相互影响,应该在脚本函数中尽量使用图标变量。 本节将3.4.3.2节中介绍的常用字符串处理过程转换为脚本函数,并藉此介绍如何在脚本函数中处理变量和参数。 对于Reverse过程,在将其改写为脚本函数Reverse时,除了利用图标变量Args@"Reverse"接收准备处理的字符串参数(String)之外,还应该利用图标变量Result@"Reverse"和i@"Reverse"分别替换原有的变量Result和i(Result@"Reverse"同时也作为脚本函数Reverse的返回值): Result@"Reverse":= "" repeat with i@"Reverse":= 1 to CharCount(Args@"Reverse")   Result@"Reverse":= SubStr(Args@"Reverse", i@"Reverse", i@"Reverse")^ ﹁ Result@"Reverse" end repeat 这样就将脚本函数本身的数据封装在脚本函数内部,因为上述图标变量在脚本函数之外通常是不可见的。以后就可以通过函数调用语句: Result:= CallScriptIcon(@"Reverse", "Authorware 7.0 is Coming") 对脚本函数Reverse进行调用,并将函数返回的结果"gnimoC si 0.7 erawrohtuA"存储到全局变量Result之中。变量Result@"Reverse"和Result之间互不影响。 实际上在【脚本函数】设计图标之外仍然可以访问图标变量i@"Reverse",但此时该变量的名称已经非常明显地告诉设计人员:这是一个仅仅属于“Reverse”设计图标的变量。 按照类似的方法,可以将Encode、Decode、WordReverse和CaseReverse过程分别转换为脚本函数。 --以下是脚本函数Encode Result@"Encode":= "" repeat with i@"Encode":= 1 to CharCount(Args@"Encode")     ASCII@"Encode":= String(Code(SubStr(Args@"Encode",i@"Encode", i@"Encode")))     reverse@"Encode":= ""     repeat with j@"Encode":= 1 to CharCount(ASCII@"Encode")       reverse@"Encode":= SubStr(ASCII@"Encode", j@"Encode", j@"Encode")^ ﹁ reverse@"Encode"     end repeat     Result@"Encode":= Result@"Encode"^reverse@"Encode"^" " end repeat 脚本函数也可以互相调用。由于前面已经定义了具有反转字符串功能的函数Reverse,实际上可以将函数Encode简化为: Result@"Encode":="" repeat with i@"Encode":=1 to CharCount(Args@"Encode")     ASCII@"Encode":=String(Code(SubStr(Args@"Encode", i@"Encode", i@"Encode")))     reverse@"Encode":=CallScriptIcon(@"Reverse",ASCII@"Encode")     Result@"Encode":=Result@"Encode"^reverse@"Encode"^" " end repeat 但是为了在后续章节中能够更好地描述各种脚本函数的工作方式,本书并没有采用上述简化代码。 --以下是脚本函数Decode Result@"Decode":= "" repeat with i@"Decode":= 1 to WordCount(Args@"Decode")     ASCII@"Decode":= GetWord(i@"Decode", Args@"Decode")     reverse@"Decode":= ""     repeat with j@"Decode":= 1 to CharCount(ASCII@"Decode")       reverse@"Decode":= SubStr(ASCII@"Decode", j@"Decode", j@"Decode")^ ﹁ reverse@"Decode"     end repeat     Result@"Decode":= Result@"Decode"^ Char(reverse@"Decode") end repeat 现在脚本函数便于调用的优势已经凸显出来,多次调用脚本函数Encode,可以非常方便地对一个字符串进行多次加密,从而获得较为理想的加密强度。 String:= "Authorware 7.0 is Coming" --通过3次调用Encode函数,对变量String的内容进行3重加密 repeat with i:= 1 to 3     String:= CallScriptIcon(@"Encode",String) end repeat --必须通过3次调用Decode函数,才能对变量String的内容完全解密 repeat with i:= 1 to 3    String:=CallScriptIcon(@"Decode",String) end repeat 函数Encode并不是一个商业化的加密程序,它的作用仅仅是示范如何对字符串进行处理。不要使用它对同一字符串进行5次以上的加密,因为每次加密的结果都会以指数方式增长,很容易就会超出变量String的存储容量(512KB)。 --以下是脚本函数WordReverse Result@"WordReverse":= "" repeat with i@"WordReverse":= 1 to WordCount(Args@"WordReverse") Result@"WordReverse":= GetWord(i@"WordReverse",Args@"WordReverse")^" "﹁ ^Result@"WordReverse" end repeat Result@"WordReverse":= SubStr(Result@"WordReverse", 1, ﹁ CharCount( Result@"WordReverse")-1)   --以下是脚本函数CaseReverse Result@"CaseReverse":="" repeat with i@"CaseReverse":=1  to CharCount(Args@"CaseReverse")  Result@"CaseReverse":=Result@"CaseReverse"^Test(Code(SubStr(﹁ Args@"CaseReverse", i@"CaseReverse", i@"CaseReverse"))>64&Code(SubStr(﹁ Args@"CaseReverse", i@"CaseReverse" , i@"CaseReverse" ))<91, ﹁ LowerCase(SubStr(Args@"CaseReverse", i@"CaseReverse" , ﹁ i@"CaseReverse" )),(Test(Code(SubStr(Args@"CaseReverse", i@"CaseReverse" , ﹁ i@"CaseReverse" ))>96&Code(SubStr(Args@"CaseReverse", i@"CaseReverse" , ﹁ i@"CaseReverse" ))<123, UpperCase(SubStr(Args@"CaseReverse", i@"CaseReverse" ,﹁ i@"CaseReverse" )),SubStr(Args@"CaseReverse", i@"CaseReverse" , ﹁ i@"CaseReverse" )))) end repeat 到目前为止这些脚本函数都只接收1个参数。从系统函数CallScriptIcon的使用语法也可以看出,只能向脚本函数传递一个参数Args。由于一个列表型变量可以包含多个元素,每个元素的值和数据类型也可以不同,因此可以将需要处理的多个数据集中放置在一个列表型变量中,再将该列表型变量作为参数传递给脚本函数,这就达到了向脚本函数传递多个参数的目的。 同理,如果将脚本函数设计为返回一个列表型变量,那么脚本函数实际上也能返回多个(种)值。 字符排序过程SortChar实际上需要使用两个参数:String和ascending,前者是待排序的字符串,后者指定排序方式(升序或降序)。现在就为“SortChar”【脚本函数】设计图标创建列表型变量Args@"SortChar",通过它使脚本函数SortChar能够接受两个参数。 --以下是脚本函数SortChar Result@"SortChar":="" CharList@"SortChar":=[] ascending@"SortChar":=Args@"SortChar"[2] repeat with i@"SortChar":=1 to CharCount(Args@"SortChar"[1])     AddLinear(CharList@"SortChar", SubStr(Args@"SortChar"[1], i@"SortChar", ﹁ i@"SortChar")) end repeat SortByValue(CharList@"SortChar",ascending@"SortChar") repeat with i@"SortChar":=1 to CharCount(Args@"SortChar"[1])     Result@"SortChar":=Result@"SortChar"^CharList@"SortChar"[i@"SortChar"] end repeat 上述代码中以粗体显示的代码是获取第2个参数的语句。现在可以通过两种方式调用SortChart函数: String:= "Authorware 7.0 is Coming" --对变量String中的字符串以降序排序 String1:= CallScriptIcon(@"SortChart", [String, 0]) --对变量String中的字符串以升序排序 String2:= CallScriptIcon(@"SortChart", [String, 1]) 对函数SortChar中的粗体代码进行修改,可以实现更为灵活的参数传递。例如可以将函数SortChar中第2个参数设置为可选参数,如果调用者没有给出排序方式,则函数SortChar自动以升序方式排序。实现代码如下所示: -- ascending@"SortChar"的默认值为TRUE,如果参数列表存在第2个元素,则以该元素 --指定排序方式 if ListCount(Args@"SortChar")>1 then     ascending@"SortChar":=Args@"SortChar"[2]   else  ascending@"SortChar":=TRUE end if 现在以下两种函数调用方式是等价的(对变量String中的字符串以升序排序): String1:= CallScriptIcon(@"SortChart", [String]) String2:= CallScriptIcon(@"SortChart", [String, 1]) 可以通过以下代码进一步拓宽参数的使用方式: if ListCount(Args@"SortChar")>1 then     ascending@"SortChar":=Args@"SortChar"[2] else  if  ListCount(Args@"SortChar")=1 then        ascending@"SortChar":=TRUE      else --如果参数不是一个列表,则将其转换为列表再进行处理        Args@"SortChar":=List(Args@"SortChar")        ascending@"SortChar":=TRUE end if 现在下列三种函数调用方式都是等价的。 String1:= CallScriptIcon(@"SortChart", [String]) String2:= CallScriptIcon(@"SortChart", [String, 1]) String3:= CallScriptIcon(@"SortChart", String) 以下是脚本函数SortChar的最终版本: Result@"SortChar":="" CharList@"SortChar":=[] if ListCount(Args@"SortChar")>1 then     ascending@"SortChar":=Args@"SortChar"[2] else  if  ListCount(Args@"SortChar")=1 then        ascending@"SortChar":=TRUE      else        Args@"SortChar":=List(Args@"SortChar")        ascending@"SortChar":=TRUE end if repeat with i@"SortChar":=1 to CharCount(Args@"SortChar"[1])     AddLinear(CharList@"SortChar", SubStr(Args@"SortChar"[1], i@"SortChar", ﹁                     i@"SortChar")) end repeat SortByValue(CharList@"SortChar",ascending@"SortChar") repeat with i@"SortChar":=1 to CharCount(Args@"SortChar"[1])     Result@"SortChar":=Result@"SortChar"^CharList@"SortChar"[i@"SortChar"] end repeat 读者可能已经注意到这些脚本函数总是首先将图标变量Result的内容清空。这一操作是必需的,否则在下次调用脚本函数时,上次的调用结果将继续参加下次的处理过程。 Chapter03文件夹下的范例程序scriptIcon.a7p演示了这些脚本函数的功能。如图3-45所示,读者可以在演示窗口上方的文本输入框中自由输入字符串,然后单击不同的按钮调用脚本函数对输入的字符串进行处理。注意在单击Encode按钮后,才能使用Decode按钮对加密后的字符串进行解密,并且在单击Decode按钮之前,其他按钮处于禁用状态。 点击图片看大图 图3-45  范例程序ScriptIcon.a7p
www.xue163.com true /2/22195.html report 15026 authorware7程序设计基本的教学文章--脚本函数(1),3.5脚本函数脚本函数(ScriptFunction)是由设计人员利用AWS自行编写的函数,与代码片段相比,脚本函数具有更加完备的功能。使用脚本函数就如同使用系统函数一样,可以向脚本函数传递参数,或者接收脚本函数的返回值。通过将常用的过程(例如3.4...
最近关注
首页推荐
热门图片
最新添加资讯
24小时热门资讯
精彩资讯
精彩推荐
热点推荐
真视界
精彩图片
社区精粹
关于本站 | 广告服务 | 手机版 | 商务合作 | 免责申明 | 招聘信息 | 联系我们
Copyright © 2004-2016 Xue163.com All Rights Reserved. 学网 版权所有
京ICP备10044368号-1 京公网安备11010802011102号
荐闻 | 学网头条知识问答 | 装修 | 作业 | 荐闻 | 学网头条精彩微信 | 新闻中心 | 软件教室 | 设计大全 | 网络相关 | 英语学习 | 开发编程 | 考试中心 | 参考范文 | 管理文库 | 营销中心 | 站长之家 | IT信息中心 | 商学院 | 数码大全 | 硬件DIY | 企业服务 | 网吧在线 | 问吧 | 百科 | 硬件知识 | 本网视点 | 文库 | 手机 | 平板 | 汽车 | 游戏 | 家电 | 精彩摄影 | 时尚科技 | 现代家居 | IT女人 | 经验 | 每日新闻 | 健康养生 | 图书馆 | 猎奇 | 精彩看点 | 图库 | 新闻中心 | 软件教室 | 设计大全 | 网络相关 | 英语学习 | 开发编程 | 考试中心 | 参考范文 | 管理文库 | 营销中心 | 站长之家 | IT信息中心 | 商学院 | 数码大全 | 硬件DIY | 企业服务 | 网吧在线 | 问吧 | 百科 | 硬件知识 | 本网视点 | 文库 | 手机 | 平板 | 汽车 | 游戏 | 家电 | 精彩摄影 | 时尚科技 | 现代家居 | IT女人 | 经验 | 每日新闻 | 健康养生 | 图书馆 | 精彩微信 | 猎奇 | 精彩看点 | 图库编程 方案 信息windows方案windows answer文档机构教育文档问答中心IT编程数码信息解决方案信息中心IT科技