它。如果用户用前导下划线来建立标志符,就会引起混淆。可以象使用普通内存变量那样使用系统内存变量,但是因为它们由VFP预先定义好了,所以一个系统内存变量的属性是固定的。例如:
numcopy=2 &&建立叫numcopy的内存变量为N型。 _pcopies=2 &&赋值于已存在的系统内存变量。
这两者都是正确的,因为_pcopies为N型,但像下面的赋值就仅有普通内存变量是正确的了: numcopy=\&&改变变量的型为C型
_pcopies=\&&错误,不能改变为C型
下面描述几个使用内存变量的VFP命令。它们可以自动建立内存变量或者释放(包括直接释放和释放后用希望的属性重建)内存变量。各类内存变量都可以显示、释放或写到一个特定的内存变量文件中。
1. 建立内存变量
建立内存变量的三种方法是:赋值、执行一个操作内存变量的命令或者通过规定一个内存变量的级(如在PUBLIC中)来建立内存变量。
最初的赋值命令在dBASEⅡ是STORE。 命令格式:STORE <表达式> TO <内存变量表>
更简单的赋值方法是使用等号(如象BASIC或C中使用的那样),这种方法从dBASEⅢ开始便有了,它让用户任选使用,并已溶入全部xBASE语言,包括FoxBASE+和FoxPro。
命令格式:[<内存变量>]=<表达式> 例2.4: B=5 ? B 5
STORE B+2 TO FJ ? FJ 7
学校=\成都电子机械高等专科学校\&&将字符串 \成都电子机械高等专科学校\存入变量学校中
STORE \计算机\系,XI &&将字符串 \计算机\存入变量系和XI中 ? 学校,系,XI,FJ
&&将“B+2”表达式的值存入FJ中 &&数值5赋给变量B
成都电子机械高等专科学校 计算机 计算机 7
然而,最初的赋值方法(即用STORE命令)并没有过时,因为它有两个有用的特性“=”号赋值型式不具有:首先可以用它规定也是命令的标志符(记住,VFP没有真正的保留字),其次,可以一次初始化变量列表。例如:
STORE 5 TO CREATE 令了。
STORE 0 TO a ,b,c,d,e
&&一次赋值变量列表。
&&而CREATE=5就出错,因为CREATE放在语句前面便看成命
注意:两种赋值方法都不能将值赋到.DBF表字段。
VFP也可以用这两种赋值方法去初始化一个数组中的每个元素,不用下标表达式,仅需数组相同的名字便可。
例2.5: DECLARE SY[2,3] SY=8
Store 8 To SY
&&建立一个2乘3数组 &&赋值8到全部6个元素。
&&赋值8到全部6个元素。
数组的全部6个元素都设置为8。但是,如果VFP兼容选择项设置为dBASE IV(SET COMPATIBILITY DB4),上面相同的语句则用赋值为8的名叫SY的内存变量代替了数组。
用户可能已经注意到赋值符号“=”左边的<内存变量>是任选的。在某些环境下,想调用一个函数,但并不想存贮其返回值,假如调用函数CAPSLOCK()设置一个值:=CAPSLOCK(OLdCaps)
则在这种情况下,CAPSLOCK()设置了CAPSLOCK键状态,但却直接放弃了返回值。VFP这种语句格式任何版本的dBASE都不支持。还有几个VFP命令对内存变量赋值。象直接内存变量赋值语句一样,如果规定的内存变量已存在,则它的旧定义被去掉。如果不存在,则建立它。下面的命令建立内存变量(详见后面的有关章节)。
ACCEPT DECLARE* PUBLIC*
AVERAGE CALCULATE COUNT INPUT PARAMETERS* PRIVATE* STORE SUM WAIT
用星号(*)标记的命令可以未知属性建立内存变量。例如:当PUBLIC命令规定一个不存在的内存变量时,它建立一个具有值.F.的逻辑型内存变量。这些属性将在内存变量的首次赋值时改变。
2. 释放内存变量
RELEASE命令释放(删除)内存变量。从概念上讲,RELEASE意味着一个标志符在某种内存变量命名使用中的免除。RELEASE命令有如下格式:
RELEASE
ALL [LIKE|EXCEPT<结构>]|<内存变量表>
若选<内存变量表>,则仅删除清单中指定的内存变量。若选ALL [LIKE|EXCEPT<结 构>],则按如下条件删除内存变量:
ALL LIKE <结构> 表示把符合结构中所指定的内存变量删除。
ALL EXCEPT <结构> 表示把除了符合结构中所指定的其它所有内存变量清除。 以上格式支持释放(清除)一个、某些或全部内存变量。 例2.6: RELEASE RELEASE RELEASE RELEASE RELEASE
PhoneNO Name, PhoneNO ALL LIKE N? ALL EXCEPT S* ALL
&&删除一个内存变量。 &&删除两个(某些)内存变量。 &&删除首字符为N的双字母内存变量。 &&删除除了首字符为S的所有内存变量。 &&删除全部内存变量。
RELEASE ALL命令释放在当前级能见的全部内存变量。就是说,如果一个子程序发出一个RELEASE ALL命令,在VFP命令窗口(Command Window)中定义的内存变量仍然存在。CLEAR MEMORY命令释放全部内存变量,不用考虑它们定义的级(即命令窗口中的也删除);CLEAR ALL命令(包括了CLEAR MEMORY)在关闭所有文件的同时清除所有内存变量。
<结构>是一个可以包括通配符?和*的标志符。如同在MS-DOS下一样:?匹配一单字符,而* 匹配任何字符串顺序。这样,在前面的例子中,N?匹配以N作为第一个字母的两个字母的标志符;而S*匹配以S开始的任何标志符,不考虑长度。
VFP编程者经常选择有一定意义的字母作为开头去命名内存变量。例如,全部公共(Public)内存变量可以P开头,全部临时内存变量可以T开头。这不仅增加了程序的可读性,也使以下的命令释放全部临时内存变量更方便:RELEASE ALL LIKE T*
3. 显示内存变量
可以用DISPLAY MEMORY [TO PRINT]或LIST MEMORY [TO PRINT]命令显示内存变量标志符和它们的属性以及当前值的列表(DISPLAY在各屏或窗口暂停,其余与LIST等效)。选[TO PRINT]任选项可把这些内容打印出来。
例2.7 :用FoxPro的LIST MEMORTY命令显示全内存变量的当前值,包括系统内存变量,并列出全部菜单、菜单笺、下拉菜单和逻辑窗口: NAME=\成都小狐狸软件室\aunt=6868.88 number=3456 value=1/4
Date1={04/28/96} DECLARE Aray[3] Aray[2]=\星期五\Aray[3]=58 DO TEST
这段程序产生了LIST MEMORY在下面表2-1所示出的输出。TEST.PRG子程序如下: PRIVATE DATE1 B7=″Hello″ date1=01/25/96 LIST MEMORY
表 2-1 LIST MEMORY命令的输出
NAME Pub C \成都小狐狸软件室\AMOUNT NUMBER VALUE DATE1 ARAY ( ( ( B7 DATE1
Pub Pub Pub
N N N
6868.88(6868.88000000) 3456 ( 3456.00000000) 0.25( 04/28/96
0.25000000)
(hid) D Pub 1) 2) 3)
A
L .F. C \星期五\N 58(
58.00000000)
Priv C \Priv D 01/25/96
48个字节已用
8个内存变量被指定 248个内存变量是可用的
打印系统内存变量
_TEXT _THROTTLE _WRAP _ALIGNMENT _BOX _CALCMEM
? ? ?
Pub Pub Pub
N N L
-1
( -1.00000000)
Pub C Pub L Pub N
\.T.
0.00( 0.00000000)
0.00 ( 0.00000000) .F.
49个系统内存变量被指定; 菜单和菜单笺定义; 0个菜单被指定; 弹出菜单定
;1个弹出菜单被指定 ; 窗口定义 ;0个窗口被指定.
义; RUN 707字节
各内存变量以下面的属性列于一个单行中。
(1)标志符内存变量的名字,以大写字母示出。
(2)级内存变量以Pub(public),Priv(private),hid(hidden),或(数组行元素)表示。public(公共)内存变量对全部级别均可见。private(私用)内存变量仅对当前及下面级别可见。标记hid(隐藏)的内存变量在比宣布它们为private(私用)变量的级再高一级别定义。组成数组元素的内存变量用元素号或行和列号标记。
(3)型内存变量的型可以是A(数组型)、C(字符型)、D(日期型)、L(逻辑型)或N(数字型)等。内存变量不能是M(备注型)。
(4)值内存量的当前值。
(5)一个定义块(block)如果一个内存变量在一个程序(而不是在VFP的命令窗口)中定义,则过程名会显示出。
在一个程序中定义的内存变量(而不是从命令窗口定义的内存变量)默认划归为private(私用)内存变量,而在命令窗口中建立的内存变量默认为public(公用)内存变量。程序中定义的内存变量在程序Return(返回)时,自动RELEASE(释放)。例如,在这个变量列表中示出了两个不同值的DATE1,前一个DATE1在命令窗口中建立,属于公用内存变量,后一个DATE1在程序TEST.PRG中建立,属于私用变量。TEST.PRG中的PRIVATE DATE1语句隐去了第一个DATE1,所以后面的赋值语句用一个不同的值(它也可以有不同的型)建立了一个新内存变量。当TEST.PRG返回时,本地版的DATE1被释放,且原始的DATE1再次“可见”。

