分享

变量的作用域及使用技巧

 淳爷们 2013-08-28
我们都知道按键精灵声明变量很自由,无需指明变量类型甚至有时候无需定义变量。
但按键中有DimDimEnvGlobal,这3个定义变量的命令,自然有它们的作用。
正确的使用以上命令,可以使脚本事半功倍。今天,我就来讲一下“变量的作用域及使用技巧”。

Dim 语句

描述声明变量并分配存储空间。 
语法Dim varname[([subscripts])][, varname[([subscripts])]] . . . 
Dim 语句的语法包含以下部分:
部分描述
varname变量的名称,符合标准变量命名约定。
subscripts数组变量的维数,最多可以声明 60 维的数组。subscripts 参数使用以下语法: upperbound [,upperbound] . . . 数组下界总是 0。

本帖隐藏的内容

Dim:定义一个变量,支持数组。可以在主线程和子程序中定义分别定义。在主线程中定义为全局变量,若不定义默认为全局变量。在子程序内定义为局部变量,若不定义默认为全局变量。定义的变量仅在主线程有效,不支持多线程、QUI事件内、其他脚本内值的传递。
如:

  1. Dim x
  2. x = 123
  3. MessageBox x
复制代码

不写Dim也是可以的,如:

  1. x = 123
  2. MessageBox x
复制代码

以上2个脚本代码调试效果一致,因为当不Dim时,脚本默认为全局变量(但作用域仅为主脚本线程,不支持多线程,QUI事件内及其他脚本的传递。)
需要注意的是,若在子程序中用Dim定义变量,带或不带Dim效果截然不同。

如:

  1. x = 123
  2. MessageBox x
  3. Call 测试
  4. MessageBox x
  5. Sub 测试
  6.     x = 456
  7.     MessageBox x
  8. End Sub
复制代码
调试以上脚本,会弹出3次x的值,第一次为“123”,第二次为“456”,第三次为“456”。
分析代码:脚本开头我们定义了x=123,无Dim,默认为全局变量,弹出“123”,调用子程序 测试,子程序内部定义x=456,没Dim故默认为全局变量,所以将x的值从“123”替换为“456”,弹出“456”,最后在子程序外弹出x,结果依旧为“456”,因为x已被替换。

再看下面这段代码:

  1. x = 123
  2. MessageBox x
  3. Call 测试
  4. MessageBox x
  5. Sub 测试
  6. Dim x
  7.     x = 456
  8.     MessageBox x
  9. End Sub
复制代码
调试以上脚本,会弹出3次x的值,第一次为“123”,第二次为“456”,第三次为“123”。
分析代码:脚本开头我们定义了x=123,无Dim,默认为全局变量,弹出“123”,调用子程序 测试,子程序内部定义 x=456,且Dim,弹出“456”,最后在子程序外弹出x,结果依旧为“123”,因为虽在子程序内部重新定义了x的值,但它是dim x,所以为局部变量,即子程序内部的x是独立的,虽然变量名与子程序外部的x同名,但没有任何关系。故不影响子程序外x的值,依旧为“123”。


命令名称DimEnv 定义环境变量
命令功能定义环境变量
命令参数变量名 
备注: 
1、在子程序里定义变量不可以为环境变量 
2、不支持数组定义为环境变量 

返 回 值

本帖隐藏的内容

DimEnv:定义一个环境变量,不支持数组。仅可在主线程中定义。定义的变量可在主线程有效,且支持多线程、QUI事件内、其他脚本内值的传递。

QUI事件内传递例子:
如:
  1. Dimenv x
  2. x = 123
  3. Ev*nt Form1.Button1.Click
  4. MessageBox x
  5. End Ev*nt
复制代码
启动以上脚本,然后打开QUI界面,点击按钮,弹出“123”。
分析代码:定义环境变量 x,建立一个QUI-按钮控件,并利用按钮点击事件弹出x的值,即“123”。
注意:拥有环境变量的脚本,务必启动脚本或调试一次脚本,再使用QUI事件,否则x的值,还是无法传递进QUI事件内。

但以下脚本则无法传递x的值:

  1. x = 123
  2. Ev*nt Form1.Button1.Click
  3. MessageBox x
  4. End Ev*nt
复制代码
启动以上脚本,然后打开QUI界面,点击按钮,弹出“”,即空,无值。
分析代码:没有定义环境变量 x,所以x的值,无法传递进QUI事件内。

多线程内传递例子:
如:
  1. DimEnv x
  2. x = 123
  3. BeginThread 测试
  4. Sub 测试
  5. MessageBox x
  6. End Sub
复制代码
启动以上脚本,调用线程 测试,弹出“123”。
分析代码:由于定义了环境变量 x,所以x的值成功传递进了,线程 测试中,故弹出“123”。

若以下代码,则不能正确弹出x的值:
  1. x = 123
  2. BeginThread 测试
  3. Sub 测试
  4. MessageBox x
  5. End Sub
复制代码
启动以上脚本,弹出“”,即空,无值。
分析代码:没有定义环境变量 x,所以x的值,无法传递进多线程内。


命令名称Global 定义全局变量
命令功能定义全局变量
命令参数变量名
备注:
1、在子程序里定义变量不可以为全局变量
2、不支持数组定义为全局变量
返 回 值

本帖隐藏的内容


Global:定义一个全局变量,不支持数组。仅可在主线程中定义。定义的变量可在主线程有效,且支持多线程,不支持QUI事件内、其他脚本内值的传递。
如:
  1. Global x
  2. x = 123
  3. BeginThread 测试
  4. Sub 测试
  5. MessageBox x
  6. End Sub
复制代码
启动以上脚本,调用线程 测试,弹出“123”。
分析代码:由于定义了全局变量 x,所以x的值成功传递进了,线程 测试中,故弹出“123”。
若以下代码,则不能正确弹出x的值:
  1. x = 123
  2. BeginThread 测试
  3. Sub 测试
  4. MessageBox x
  5. End Sub
复制代码
启动以上脚本,弹出“”,即空,无值。
分析代码:没有定义全局变量 x,所以x的值,无法传递进多线程内。


总结:
Dim:定义的变量仅在主线程有效,不支持多线程、QUI事件内、其他脚本内值的传递。
DimEnv:定义的变量可在主线程有效,且支持多线程、QUI事件内、其他脚本内值的传递。

Global:定义的变量可在主线程有效,且支持多线程,不支持QUI事件内、其他脚本内值的传递。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多