[Common]
Description=演示如何编写自己的函数及过程
HotKeyStart=119
HotKeyStop=122
HotKeyPause=0
Enabled=0
RunOnce=1

[Script]
//之前版本中，子程序(即过程)不可携带参数，也不能支持可返回值的函数定义
//从7.2版本开始，脚本大师可以支持带参数的自定义函数及过程
//********************
//和其他大多数大型编程语言的规定类似，变量可分为全局变量和局部变量
//局部变量只有某个函数或过程内部可以使用，而全局变量则在任何地方都可以使用
//当局部变量与全局变量重名时，在子程序内部将优先使用局部变量而忽略全局变量
//********************
//脚本大师脚本规则规定，全局变量应当定义在任何其他函数/过程/主函数(main: ... End)之外
//而定义在函数/过程/主函数(Main: ... End) 之内的任何变量，都作为局部变量，只能用于所属函数/过程的范围。
//********************
//自定义函数与过程的区别仅仅在于过程没有返回值，而函数是可以返回值的
//与脚本大师内置函数和插件函数一样，自定义函数完全可以无缝的与内置函数和插件函数混合使用进行表达式计算。
//********************
//自定义函数的返回值请使用专用的返回值变量<result>
//返回值变量result是局部变量并且是自动创建的，函数执行完返回数值后，自动释放。
//注意，多个自定义函数使用相同的返回值变量result，不会互相影响。
//当调用一个自定义函数或过程时，参数使用了变量，那么这个变量可用作参数的返回。
//所有自定义函数和过程的参数及返回值，都可支持数组
//********************
//原有的调用子程序的CALL命令，与调用函数的do命令，在7.2后不再有区别，虽然仍分别保留CALL和DO命令，但功能上没有区别
//********************
//以下定义了两个全局变量
var x=2
var y=3
Array v 20    //定义一个数组[0..19]
//这里是主函数
main:
  call Test(x,y)  //调用过程, 也可以用do Test(x,y), 效果一样
  do ShowMsg("x="+inttostr(x)+"; y="+inttostr(y))
  set v[0]=100
  set v[1]=200
  //以下函数TestArray返回值为一个数组，因此执行后v的数组范围将可能改变，视函数内部操作而定
  set v=TestArray(v)
  do ShowMsg("v[0]="+inttostr(v[0])+"; v[1]="+inttostr(v[1]))
endmain

//定义一个子程序(过程), 该过程有两个参数x,y
sub Test(x,y)
  //注意，由于参数中有x,y，因此这个子程序中，所有x，y变量都是引用自参数的x,y，而不是全局变量中的x，y
  //下面的语句演示在过程中，调用另一个自定义函数MyGetSubStr
  //注意，自定义函数与普通内置函数/插件函数调用方式一致，可以混合使用
  //还要注意，x参数在MyGetSubStr函数中作为Index被修改了，这个修改会被反映到调用TEST的主程序中
  do ShowMsg(MyGetSubStr('abcde',x,y))
Endsub

//定义一个函数，该函数包含3个参数：Str,Index,Count
function MyGetSubStr(Str,Index,Count)
  //注意，自定义函数的返回值要保存到result中
  set result=GetSubStr(Str,Index,Count)
  //这里演示在自定义函数中，修改函数参数将影响调用者的变量
  set Index=Index+1
  //这里演示，当局部变量与全局变量不重名的时候，可以直接读写全局变量
  set y=y+1
endfunction

//定义一个函数，演示如何在函数的参数及返回值中使用数组
function TestArray(v)
  //当使用一维数组模式对变量赋值时，数组的下标会动态改变
  //二维或三维数组则无法动态改变数组各个维的下标
  set result[0]=v[0]+1
  set result[1]=v[1]+1
endfunction
